Correctly initialize the esp0 pointer in the TSS for the initial
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 23 Apr 2007 00:05:33 +0000 (00:05 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 23 Apr 2007 00:05:33 +0000 (00:05 +0000)
kernel thread.  Shouldn't actually matter in practice, because that
pointer is only used on a user->kernel transition, and the initial
kernel thread never runs a user process.

Reported by Godmar Back.

src/userprog/process.c
src/userprog/tss.c
src/userprog/tss.h

index 781cc5d3fc81c9b95a65ed47b6d589c15895c91f..c0e521553f994dcc2f01004a3b4c28bedc2accb7 100644 (file)
@@ -129,7 +129,7 @@ process_activate (void)
 
   /* Set thread's kernel stack for use in processing
      interrupts. */
-  tss_set_esp0 ((uint8_t *) t + PGSIZE);
+  tss_update ();
 }
 \f
 /* We load ELF binaries.  The following definitions are taken
index f103823bb869d765b9fb5e28e1a5bd4d8090f29f..569e8d183336657aa82e04f882cd9ebd80c65b0d 100644 (file)
@@ -82,9 +82,9 @@ tss_init (void)
      few fields of it are ever referenced, and those are the only
      ones we initialize. */
   tss = palloc_get_page (PAL_ASSERT | PAL_ZERO);
-  tss->esp0 = ptov(0x20000);
   tss->ss0 = SEL_KDSEG;
   tss->bitmap = 0xdfff;
+  tss_update ();
 }
 
 /* Returns the kernel TSS. */
@@ -95,10 +95,11 @@ tss_get (void)
   return tss;
 }
 
-/* Sets the ring 0 stack pointer in the TSS to ESP0. */
+/* Sets the ring 0 stack pointer in the TSS to point to the end
+   of the thread stack. */
 void
-tss_set_esp0 (uint8_t *esp0
+tss_update (void
 {
   ASSERT (tss != NULL);
-  tss->esp0 = esp0;
+  tss->esp0 = (uint8_t *) thread_current () + PGSIZE;
 }
index fa8d47b54efb50969e44e54c7ae2e9df6b90ff99..467bd19e51ffc4f1bce00ea88496302c9ae9d6f2 100644 (file)
@@ -6,6 +6,6 @@
 struct tss;
 void tss_init (void);
 struct tss *tss_get (void);
-void tss_set_esp0 (uint8_t *);
+void tss_update (void);
 
 #endif /* userprog/tss.h */