x86_64: move ACPI driver to kext
This commit is contained in:
107
kexts/drivers/bus/acpi/ap_trampoline.S
Normal file
107
kexts/drivers/bus/acpi/ap_trampoline.S
Normal file
@@ -0,0 +1,107 @@
|
||||
.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
|
||||
Reference in New Issue
Block a user