limine/common/lib/spinup.asm_uefi_ia32

63 lines
817 B
Plaintext

extern _GLOBAL_OFFSET_TABLE_
extern gdt
section .text
extern flush_irqs
global common_spinup
bits 32
common_spinup:
cli
push 0
push 0
lidt [esp]
add esp, 8
call .get_got
.get_got:
pop ebx
add ebx, _GLOBAL_OFFSET_TABLE_ + $$ - .get_got wrt ..gotpc
lgdt [ebx + gdt wrt ..gotoff]
push dword 0x18
call .p1
.p1:
pop eax
add eax, 6
push eax
retfd
.flush_cs:
mov eax, 0x20
mov ds, eax
mov es, eax
mov fs, eax
mov gs, eax
mov ss, eax
call flush_irqs
xor eax, eax
lldt ax
; We don't need the return address
add esp, 4
; Get function address
pop edi
; We don't need the argument count
add esp, 4
mov eax, 0x00000011
mov cr0, eax
xor eax, eax
mov cr4, eax
call edi