limine/common/protos/limine_rt.asm_uefi_ia32

141 lines
2.3 KiB
Plaintext

extern _GLOBAL_OFFSET_TABLE_
section .bss
user_stack:
resq 1
user_cs: resq 1
user_ds: resq 1
user_es: resq 1
user_ss: resq 1
section .text
extern term_write
extern limine_rt_stack
extern limine_term_callback_ptr
extern limine_term_write_ptr
global limine_term_callback
limine_term_callback:
bits 32
push ebp
mov ebp, esp
push ebx
push esi
push edi
; Go 64
push 0x28
call .p1
.p1:
add dword [esp], .mode64 - .p1
retfd
bits 64
.mode64:
mov eax, 0x30
mov ds, ax
mov es, ax
mov ss, ax
mov rdi, [rbp + 8]
mov rsi, [rbp + 16]
mov rdx, [rbp + 24]
mov rcx, [rbp + 32]
mov r8, [rbp + 40]
call .get_got
.get_got:
pop rax
add rax, _GLOBAL_OFFSET_TABLE_ + $$ - .get_got wrt ..gotpc
mov rbx, rsp
mov rsp, [rax + user_stack wrt ..gotoff]
call [rax + limine_term_callback_ptr wrt ..gotoff]
mov rsp, rbx
; Go 32
push 0x18
call .p2
.p2:
add qword [rsp], .mode32 - .p2
retfq
bits 32
.mode32:
mov eax, 0x20
mov ds, ax
mov es, ax
mov ss, ax
pop edi
pop esi
pop ebx
pop ebp
ret
bits 64
global limine_term_write_entry
limine_term_write_entry:
push rbx
push rbp
push r12
push r13
push r14
push r15
call .get_got
.get_got:
pop rbx
add ebx, _GLOBAL_OFFSET_TABLE_ + $$ - .get_got wrt ..gotpc
mov [rbx + user_stack wrt ..gotoff], rsp
mov esp, [rbx + limine_rt_stack wrt ..gotoff]
mov word [rbx + user_cs wrt ..gotoff], cs
mov word [rbx + user_ds wrt ..gotoff], ds
mov word [rbx + user_es wrt ..gotoff], es
mov word [rbx + user_ss wrt ..gotoff], ss
push rdx
push rsi
push rdi
push 0x18
call .p1
.p1:
add qword [rsp], .mode32 - .p1
retfq
bits 32
.mode32:
mov eax, 0x20
mov ds, ax
mov es, ax
mov ss, ax
call [ebx + limine_term_write_ptr wrt ..gotoff]
add esp, 24
push dword [ebx + user_cs wrt ..gotoff]
call .p2
.p2:
add dword [esp], .mode64 - .p2
retfd
bits 64
.mode64:
mov ds, word [rbx + user_ds wrt ..gotoff]
mov es, word [rbx + user_es wrt ..gotoff]
mov ss, word [rbx + user_ss wrt ..gotoff]
mov rsp, [rbx + user_stack wrt ..gotoff]
pop r15
pop r14
pop r13
pop r12
pop rbp
pop rbx
ret