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.
/* 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
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. */
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;
}
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 */