.global acpi_ap_lapic_id .type acpi_ap_lapic_id, @function acpi_ap_lapic_id: push %rbp mov %rsp, %rbp push %rbx mov $0x00000001, %eax cpuid shrq $0x18, %rbx mov %rbx, %rax pop %rbx pop %rbp ret .extern __ap_stack_top .extern __bsp_done .extern __this_ap_ok .extern __all_ap_ok .extern ap_startup .type ap_startup, @function .global ap_trampoline # this code will be relocated to 0x8000, sets up environment for calling a C function .code16 .align 0x100 ap_trampoline: cli cld ljmp $0, $0x8080 .align 16 _L8010_GDT_table: .long 0, 0 .long 0x0000FFFF, 0x00CF9A00 # flat code .long 0x0000FFFF, 0x008F9200 # flat data .long 0x00000068, 0x00CF8900 # tss _L8030_GDT_value: .word _L8030_GDT_value - _L8010_GDT_table - 1 .long 0x8010 .long 0, 0 .align 64 _L8040_GDT64_table: .long 0, 0 .long 0x0000ffff, 0x002f9a00 # kernel code .long 0x0000ffff, 0x002f9200 # kernel data _L8058_GDT64_value: .word _L8058_GDT64_value - _L8040_GDT64_table - 1 .quad 0x8040 .align 64 _L8080: xorw %ax, %ax movw %ax, %ds lgdtl 0x8030 movl %cr0, %eax orl $1, %eax movl %eax, %cr0 ljmp $8, $0x80a0 .align 32 .code32 _L80A0: movw $16, %ax movw %ax, %ds movw %ax, %ss # get our Local APIC ID mov $1, %eax cpuid shrl $24, %ebx movl %ebx, %edi movl %cr4, %eax orl $0x20, %eax movl %eax, %cr4 movl $0x8ff8, %eax movl (%eax), %eax mov %eax, %cr3 movl $0xC0000080, %ecx rdmsr # enable long mode, syscall/sysret, and NX protection orl $0x00000901, %eax wrmsr movl $0x8058, %eax lgdt (%eax) movl %cr0, %ecx orl $0x8000002a, %ecx movl %ecx, %cr0 ljmpl $0x08, $0x8100 .code64 .align 64 _L8100: mov (__ap_stack_top), %rsp movabsq $(ap_trampoline_exit), %rax callq *%rax hlt