rulimine/common/protos/stivale2_rt.asm32u
2022-02-03 10:38:43 +01:00

138 lines
2.2 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 stivale2_rt_stack
extern stivale2_term_callback_ptr
global stivale2_term_callback
stivale2_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]
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 + stivale2_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 stivale2_term_write_entry
stivale2_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 + stivale2_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 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 term_write
add esp, 16
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