Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/amd64/mp_machdep.c
Show First 20 Lines • Show All 256 Lines • ▼ Show 20 Lines | init_secondary(void) | ||||
} | } | ||||
ssdtosyssd(&gdt_segs[GPROC0_SEL], | ssdtosyssd(&gdt_segs[GPROC0_SEL], | ||||
(struct system_segment_descriptor *)&gdt[GPROC0_SEL]); | (struct system_segment_descriptor *)&gdt[GPROC0_SEL]); | ||||
ap_gdt.rd_limit = NGDT * sizeof(gdt[0]) - 1; | ap_gdt.rd_limit = NGDT * sizeof(gdt[0]) - 1; | ||||
ap_gdt.rd_base = (u_long)gdt; | ap_gdt.rd_base = (u_long)gdt; | ||||
lgdt(&ap_gdt); /* does magic intra-segment return */ | lgdt(&ap_gdt); /* does magic intra-segment return */ | ||||
wrmsr(MSR_FSBASE, 0); /* User value */ | wrmsr(MSR_FSBASE, 0); /* User value */ | ||||
wrmsr(MSR_GSBASE, (u_int64_t)pc); | wrmsr(MSR_GSBASE, (uint64_t)pc); | ||||
wrmsr(MSR_KGSBASE, (u_int64_t)pc); /* XXX User value while we're in the kernel */ | wrmsr(MSR_KGSBASE, 0); /* User value */ | ||||
fix_cpuid(); | fix_cpuid(); | ||||
lidt(&r_idt); | lidt(&r_idt); | ||||
gsel_tss = GSEL(GPROC0_SEL, SEL_KPL); | gsel_tss = GSEL(GPROC0_SEL, SEL_KPL); | ||||
ltr(gsel_tss); | ltr(gsel_tss); | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 823 Lines • Show Last 20 Lines |