i386 and x86_64 each maintain their own copy of the realmode trampoline (sipi_entry). Move the 16-bit SIPI vector and GDT to a new start16.S to be shared by both. Signed-off-by: Varad Gautam <varad.gautam@xxxxxxxx> --- x86/cstart.S | 20 ++++---------------- x86/cstart64.S | 18 +++--------------- x86/start16.S | 27 +++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 31 deletions(-) create mode 100644 x86/start16.S diff --git a/x86/cstart.S b/x86/cstart.S index 6db6a38..06b5be6 100644 --- a/x86/cstart.S +++ b/x86/cstart.S @@ -126,10 +126,10 @@ start32: ap_init: cld - sgdtl ap_gdt_descr // must be close to sipi_entry for real mode access to work - lea sipi_entry, %esi + sgdtl ap_rm_gdt_descr // must be close to rm_trampoline for real mode access to work + lea rm_trampoline, %esi xor %edi, %edi - mov $(sipi_end - sipi_entry), %ecx + mov $(rm_trampoline_end - rm_trampoline), %ecx rep movsb mov $APIC_DEFAULT_PHYS_BASE, %eax movl $(APIC_DEST_ALLBUT | APIC_DEST_PHYSICAL | APIC_DM_INIT | APIC_INT_ASSERT), APIC_ICR(%eax) @@ -146,16 +146,4 @@ online_cpus: .align 2 cpu_online_count: .word 1 -.code16 -sipi_entry: - mov %cr0, %eax - or $1, %eax - mov %eax, %cr0 - lgdtl ap_gdt_descr - sipi_entry - ljmpl $8, $ap_start32 - -ap_gdt_descr: - .word 0 - .long 0 - -sipi_end: +#include "start16.S" diff --git a/x86/cstart64.S b/x86/cstart64.S index 7272452..cae6f51 100644 --- a/x86/cstart64.S +++ b/x86/cstart64.S @@ -156,19 +156,7 @@ gdt32: .quad 0x00cf93000000ffff // flat 32-bit data segment gdt32_end: -.code16 -sipi_entry: - mov %cr0, %eax - or $1, %eax - mov %eax, %cr0 - lgdtl gdt32_descr - sipi_entry - ljmpl $8, $ap_start32 - -gdt32_descr: - .word gdt32_end - gdt32 - 1 - .long gdt32 - -sipi_end: +#include "start16.S" .code32 ap_start32: @@ -243,9 +231,9 @@ online_cpus: ap_init: cld - lea sipi_entry, %rsi + lea rm_trampoline, %rsi xor %rdi, %rdi - mov $(sipi_end - sipi_entry), %rcx + mov $(rm_trampoline_end - rm_trampoline), %rcx rep movsb mov $APIC_DEFAULT_PHYS_BASE, %eax movl $(APIC_DEST_ALLBUT | APIC_DEST_PHYSICAL | APIC_DM_INIT | APIC_INT_ASSERT), APIC_ICR(%rax) diff --git a/x86/start16.S b/x86/start16.S new file mode 100644 index 0000000..e61b22a --- /dev/null +++ b/x86/start16.S @@ -0,0 +1,27 @@ +/* Common 16-bit bootstrapping code. */ + +.code16 +.globl rm_trampoline +rm_trampoline: + +/* Store SIPI vector code at the beginning of trampoline. */ +sipi_entry: + mov %cr0, %eax + or $1, %eax + mov %eax, %cr0 + lgdtl ap_rm_gdt_descr - sipi_entry + ljmpl $8, $ap_start32 +sipi_end: + +.globl ap_rm_gdt_descr +ap_rm_gdt_descr: +#ifdef __i386__ + .word 0 + .long 0 +#else + .word gdt32_end - gdt32 - 1 + .long gdt32 +#endif + +.globl rm_trampoline_end +rm_trampoline_end: -- 2.32.0