Files
magenta/arch/x86_64/acpi/ap_trampoline.S
T

83 lines
1.5 KiB
ArmAsm
Raw Normal View History

2023-02-09 21:39:20 +00:00
.global acpi_bsp_lapic_id
.type acpi_bsp_lapic_id, @function
acpi_bsp_lapic_id:
push %rbp
mov %rsp, %rbp
push %rbx
mov $0x00000001, %eax
cpuid
shrq $0x18, %rbx
mov %rbx, %rax
pop %rbx
pop %rbp
ret
2023-03-28 21:38:47 +01:00
.extern __ap_stack_top
.extern __bsp_done
.extern ap_startup
.type ap_startup, @function
.global ap_trampoline_code
# this code will be relocated to 0x8000, sets up environment for calling a C function
.code16
ap_trampoline_code:
2023-02-09 21:39:20 +00:00
cli
2023-03-28 21:38:47 +01:00
cld
ljmp $0, $0x8040
.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:
xorw %ax, %ax
movw %ax, %ds
lgdtl 0x8030
movl %cr0, %eax
orl $1, %eax
movl %eax, %cr0
ljmp $8, $0x8060
.align 32
.code32
_L8060:
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 $0x9000, %eax
movl (%eax), %eax
mov %eax, %cr3
2023-02-09 21:39:20 +00:00
hlt
2023-03-28 21:38:47 +01:00
# set up 32k stack, one for each core. It is important that all core must have its own stack
#shll $15, %ebx
#movl __ap_stack_top, %esp
#subl %ebx, %esp
#pushl %edi
# spinlock, wait for the BSP to finish
#1: pause
#cmpb $0, __bsp_done
#jz 1b
#lock incb aprunning
# jump into C code (should never return)
#ljmp $8, $ap_startup