108 lines
1.8 KiB
ArmAsm
108 lines
1.8 KiB
ArmAsm
.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
|