Files
mango/arch/x86_64/acpi/ap_trampoline.S

108 lines
1.8 KiB
ArmAsm
Raw Normal View History

.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