aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Evans <bde@FreeBSD.org>2016-08-28 14:03:25 +0000
committerBruce Evans <bde@FreeBSD.org>2016-08-28 14:03:25 +0000
commit441ead70cdf940ea856f778e4d94abd30fd91c9d (patch)
treef2ac8009ca2d53439b012ce93bb5ba19696d6f39
parent787650cde6a0594525d4b11ade1ee1890bec2cb3 (diff)
Notes
-rw-r--r--sys/i386/i386/machdep.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index 89e67a54e5b51..ccaeb5e361a13 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -2636,6 +2636,16 @@ init386(first)
dblfault_tss.tss_cs = GSEL(GCODE_SEL, SEL_KPL);
dblfault_tss.tss_ldt = GSEL(GLDT_SEL, SEL_KPL);
+ /* Initialize the tss (except for the final esp0) early for vm86. */
+ PCPU_SET(common_tss.tss_esp0, thread0.td_kstack +
+ thread0.td_kstack_pages * PAGE_SIZE - 16);
+ PCPU_SET(common_tss.tss_ss0, GSEL(GDATA_SEL, SEL_KPL));
+ gsel_tss = GSEL(GPROC0_SEL, SEL_KPL);
+ PCPU_SET(tss_gdt, &gdt[GPROC0_SEL].sd);
+ PCPU_SET(common_tssd, *PCPU_GET(tss_gdt));
+ PCPU_SET(common_tss.tss_ioopt, (sizeof (struct i386tss)) << 16);
+ ltr(gsel_tss);
+
vm86_initialize();
getmemsize(first);
init_param2(physmem);
@@ -2701,14 +2711,10 @@ init386(first)
}
#endif
PCPU_SET(curpcb, thread0.td_pcb);
- /* make an initial tss so cpu can get interrupt stack on syscall! */
+ /* Move esp0 in the tss to its final place. */
/* Note: -16 is so we can grow the trapframe if we came from vm86 */
PCPU_SET(common_tss.tss_esp0, (vm_offset_t)thread0.td_pcb - 16);
- PCPU_SET(common_tss.tss_ss0, GSEL(GDATA_SEL, SEL_KPL));
- gsel_tss = GSEL(GPROC0_SEL, SEL_KPL);
- PCPU_SET(tss_gdt, &gdt[GPROC0_SEL].sd);
- PCPU_SET(common_tssd, *PCPU_GET(tss_gdt));
- PCPU_SET(common_tss.tss_ioopt, (sizeof (struct i386tss)) << 16);
+ gdt[GPROC0_SEL].sd.sd_type = SDT_SYS386TSS; /* clear busy bit */
ltr(gsel_tss);
/* make a call gate to reenter kernel with */