diff options
| author | Bruce Evans <bde@FreeBSD.org> | 2016-08-28 14:03:25 +0000 |
|---|---|---|
| committer | Bruce Evans <bde@FreeBSD.org> | 2016-08-28 14:03:25 +0000 |
| commit | 441ead70cdf940ea856f778e4d94abd30fd91c9d (patch) | |
| tree | f2ac8009ca2d53439b012ce93bb5ba19696d6f39 | |
| parent | 787650cde6a0594525d4b11ade1ee1890bec2cb3 (diff) | |
Notes
| -rw-r--r-- | sys/i386/i386/machdep.c | 18 |
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 */ |
