Since the gdt for apboot is located at a shared location in memory, we cannot patch the gdt values per cpu during parallel smp init, or havoc entails. --- i386/i386/cpuboot.S | 75 +++++---------------------------------------- i386/i386/mp_desc.c | 6 ++-- 2 files changed, 11 insertions(+), 70 deletions(-)
diff --git a/i386/i386/cpuboot.S b/i386/i386/cpuboot.S index f93e0387..e1b63c5c 100644 --- a/i386/i386/cpuboot.S +++ b/i386/i386/cpuboot.S @@ -39,7 +39,7 @@ apboot_idt_ptr: .align 16 .word 0 apboot_gdt_descr: - .word 14*8-1 + .word 3*8-1 .long apboot_gdt - KERNELBASE .align 16 apboot_gdt: @@ -62,45 +62,6 @@ apboot_gdt: .byte ((SZ_32 | SZ_G) << 4) | 0xf /* High 4 bits */ .byte ((-KERNELBASE) >> 24) & 0xff /*Base 24-31 bits */ - /* LDT = 0x18 */ - .quad 0 - - /* TSS = 0x20 */ - .quad 0 - - /* USER_LDT = 0x28 */ - .quad 0 - - /* USER_TSS = 0x30 */ - .quad 0 - - /* LINEAR = 0x38 */ - .quad 0 - - /* FPREGS = 0x40 */ - .quad 0 - - /* USER_GDT = 0x48 and 0x50 */ - .quad 0 - .quad 0 - - /* USER_TSS64 = 0x58 */ - .quad 0 - - /* USER_TSS64 = 0x60 */ - .quad 0 - - /* boot GS = 0x68 */ - .word 0xffff -apboot_percpu_low: - .word 0 -apboot_percpu_med: - .byte 0 - .byte ACC_PL_K | ACC_DATA_W | ACC_P - .byte ((SZ_32 | SZ_G) << 4) | 0xf -apboot_percpu_high: - .byte 0 - .globl apboot, apbootend, gdt_descr_tmp, apboot_jmp_offset .align 16 .code16 @@ -159,32 +120,6 @@ apboot_jmp_offset: movw %ax, %gs movw %ax, %ss - /* Get CPU number */ - movl $1, %eax - cpuid - shrl $24, %ebx - movl %cs:CX(cpu_id_lut, %ebx), %ecx - - /* Access per_cpu area */ - movl %ecx,%eax - movl $PC_SIZE,%ebx - mul %ebx - addl $percpu_array, %eax - - /* Record our cpu number */ - movl %ecx, (PERCPU_CPU_ID)(%eax) - - /* Set up temporary percpu descriptor */ - addl $(-KERNELBASE), %eax - movw %ax, apboot_percpu_low - shr $16, %eax - movb %al, apboot_percpu_med - shr $8, %ax - movb %al, apboot_percpu_high - - movw $PERCPU_DS, %ax - movw %ax, %gs - /* Load null Interrupt descriptor table */ mov apboot_idt_ptr, %ebx lidt (%ebx) @@ -199,8 +134,14 @@ apboot_jmp_offset: movl $APIC_MSR, %ecx wrmsr + /* Get CPU number */ + xorl %ecx, %ecx + movl $1, %eax + cpuid + shrl $24, %ebx + movl %cs:CX(cpu_id_lut, %ebx), %edx + /* Load int_stack_top[cpu] -> esp */ - CPU_NUMBER(%edx) movl CX(EXT(int_stack_top), %edx), %esp /* Ensure stack alignment */ diff --git a/i386/i386/mp_desc.c b/i386/i386/mp_desc.c index f13a391a..16b1c865 100644 --- a/i386/i386/mp_desc.c +++ b/i386/i386/mp_desc.c @@ -241,7 +241,6 @@ cpu_setup(int cpu) flush_instr_queue(); printf("AP=(%u) paging done\n", cpu); - init_percpu(cpu); mp_desc_init(cpu); printf("AP=(%u) mpdesc done\n", cpu); @@ -271,6 +270,7 @@ cpu_setup(int cpu) machine_slot[cpu].cpu_subtype = CPU_SUBTYPE_AT386; machine_slot[cpu].cpu_type = machine_slot[0].cpu_type; + init_percpu(cpu); init_fpu(); lapic_setup(); lapic_enable(); @@ -278,9 +278,9 @@ cpu_setup(int cpu) } void -cpu_ap_main() +cpu_ap_main(void) { - int cpu = cpu_number(); + int cpu = cpu_number_slow(); assert(cpu > 0); -- 2.45.2