Break TSS out of GDT.
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 1 Sep 2004 22:25:56 +0000 (22:25 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 1 Sep 2004 22:25:56 +0000 (22:25 +0000)
src/Makefile.inc
src/threads/gdt.c
src/threads/gdt.h
src/threads/init.c
src/threads/tss.c [new file with mode: 0644]
src/threads/tss.h [new file with mode: 0644]
src/userprog/addrspace.c

index d6b9519edd9052672a8b97daedcabbea5de3b5d3..c125ebaeb7be4447f9258b2736c354a73c1538d9 100644 (file)
@@ -18,6 +18,7 @@ ASFLAGS = -Wa,--gstabs+ $(INCLUDES) $(DEFINES)
 THREADS_SRC  = start.S         # Must be linked first.
 THREADS_SRC += init.c          # Main program.
 THREADS_SRC += gdt.c           # GDT initialization.
+THREADS_SRC += tss.c           # TSS management.
 THREADS_SRC += thread.c                # Thread management core.
 THREADS_SRC += switch.S                # Thread switch routine.
 THREADS_SRC += interrupt.c     # Interrupt core.
index 2fd6948021e5b83c550d5066747b93a4e4903bf9..6348f5da220efd9e24b4e2d4842fd28598e694af 100644 (file)
@@ -2,6 +2,7 @@
 #include "debug.h"
 #include "mmu.h"
 #include "palloc.h"
+#include "tss.h"
 
 /* System segment or code/data segment? */
 enum seg_class
@@ -87,8 +88,6 @@ make_tss_desc (void *laddr)
 
 static uint64_t gdt[SEL_CNT];
 
-struct tss *tss;
-
 /* Sets up a proper GDT.  The bootstrap loader's GDT didn't
    include user-mode selectors or a TSS. */
 void
@@ -96,21 +95,13 @@ gdt_init (void)
 {
   uint64_t gdtr_operand;
 
-  /* Our TSS is never used in a call gate or task gate, so only a
-     few fields of it are ever referenced, and those are the only
-     ones we initialize. */
-  tss = palloc_get (PAL_ASSERT | PAL_ZERO);
-  tss->esp0 = (uint32_t) ptov(0x20000);
-  tss->ss0 = SEL_KDSEG;
-  tss->bitmap = 0xdfff;
-
   /* Initialize GDT. */
   gdt[SEL_NULL / sizeof *gdt] = 0;
   gdt[SEL_KCSEG / sizeof *gdt] = make_code_desc (0);
   gdt[SEL_KDSEG / sizeof *gdt] = make_data_desc (0);
   gdt[SEL_UCSEG / sizeof *gdt] = make_code_desc (3);
   gdt[SEL_UDSEG / sizeof *gdt] = make_data_desc (3);
-  gdt[SEL_TSS / sizeof *gdt] = make_tss_desc (tss);
+  gdt[SEL_TSS / sizeof *gdt] = make_tss_desc (tss_get ());
 
   /* Load GDTR, TR. */
   gdtr_operand = make_dtr_operand (sizeof gdt - 1, gdt);
index 68507bc8a2a14b2fa148aa8e763c5e28b400d6b9..c32ceab88dfb15e15a3207d132ac73c6b5685824 100644 (file)
 #ifndef __ASSEMBLER__
 #include <stdint.h>
 
-struct tss
-  {
-    uint16_t back_link, :16;
-    uint32_t esp0;
-    uint16_t ss0, :16;
-    uint32_t esp1;
-    uint16_t ss1, :16;
-    uint32_t esp2;
-    uint16_t ss2, :16;
-    uint32_t cr3;
-    uint32_t eip;
-    uint32_t eflags;
-    uint32_t eax, ecx, edx, ebx;
-    uint32_t esp, ebp, esi, edi;
-    uint16_t es, :16;
-    uint16_t cs, :16;
-    uint16_t ss, :16;
-    uint16_t ds, :16;
-    uint16_t fs, :16;
-    uint16_t gs, :16;
-    uint16_t ldt, :16;
-    uint16_t trace, bitmap;
-  };
-
-
 static inline uint64_t
 make_dtr_operand (uint16_t limit, void *base)
 {
   return limit | ((uint64_t) (uint32_t) base << 16);
 }
 
-extern struct tss *tss;
-
 void gdt_init (void);
 #endif
 
index b70c16c43bee2046f4b134427dc60e811953b4e5..a3ab43d577c5d6a98bd629883c7f1e84c840034e 100644 (file)
@@ -17,6 +17,7 @@
 #include "serial.h"
 #include "thread.h"
 #include "timer.h"
+#include "tss.h"
 #include "vga.h"
 #ifdef FILESYS
 #include "filesys.h"
@@ -74,6 +75,7 @@ main (void)
   /* Initialize memory system. */
   palloc_init ();
   paging_init ();
+  tss_init ();
   gdt_init ();
   malloc_init ();
 
diff --git a/src/threads/tss.c b/src/threads/tss.c
new file mode 100644 (file)
index 0000000..37d075b
--- /dev/null
@@ -0,0 +1,58 @@
+#include "tss.h"
+#include <stddef.h>
+#include "debug.h"
+#include "gdt.h"
+#include "mmu.h"
+#include "palloc.h"
+
+struct tss
+  {
+    uint16_t back_link, :16;
+    void *esp0;
+    uint16_t ss0, :16;
+    void *esp1;
+    uint16_t ss1, :16;
+    void *esp2;
+    uint16_t ss2, :16;
+    uint32_t cr3;
+    void (*eip) (void);
+    uint32_t eflags;
+    uint32_t eax, ecx, edx, ebx;
+    uint32_t esp, ebp, esi, edi;
+    uint16_t es, :16;
+    uint16_t cs, :16;
+    uint16_t ss, :16;
+    uint16_t ds, :16;
+    uint16_t fs, :16;
+    uint16_t gs, :16;
+    uint16_t ldt, :16;
+    uint16_t trace, bitmap;
+  };
+
+static struct tss *tss;
+
+void
+tss_init (void) 
+{
+  /* Our TSS is never used in a call gate or task gate, so only a
+     few fields of it are ever referenced, and those are the only
+     ones we initialize. */
+  tss = palloc_get (PAL_ASSERT | PAL_ZERO);
+  tss->esp0 = ptov(0x20000);
+  tss->ss0 = SEL_KDSEG;
+  tss->bitmap = 0xdfff;
+}
+
+struct tss *
+tss_get (void) 
+{
+  ASSERT (tss != NULL);
+  return tss;
+}
+
+void
+tss_set_esp0 (uint8_t *esp0) 
+{
+  ASSERT (tss != NULL);
+  tss->esp0 = esp0;
+}
diff --git a/src/threads/tss.h b/src/threads/tss.h
new file mode 100644 (file)
index 0000000..a5476c7
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef HEADER_TSS_H
+#define HEADER_TSS_H
+
+#include <stdint.h>
+
+struct tss;
+void tss_init (void);
+struct tss *tss_get (void);
+void tss_set_esp0 (uint8_t *);
+
+#endif /* tss.h */
index 519da93cc90ed302ddf5ab3ea684d5ff8f95e238..1170f16ab92a7f61f1a93ad381ea49ff38208e63 100644 (file)
@@ -3,13 +3,13 @@
 #include "debug.h"
 #include "file.h"
 #include "filesys.h"
-#include "gdt.h"
 #include "init.h"
 #include "lib.h"
 #include "mmu.h"
 #include "paging.h"
 #include "palloc.h"
 #include "thread.h"
+#include "tss.h"
 
 /* We load ELF binaries.  The following definitions are taken
    from the ELF specification more-or-less verbatim. */
@@ -275,5 +275,5 @@ addrspace_activate (struct thread *t)
   
   if (t->pagedir != NULL)
     pagedir_activate (t->pagedir);
-  tss->esp0 = (uint32_t) t + PGSIZE;
+  tss_set_esp0 ((uint8_t *) t + PGSIZE);
 }