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