; vi:ft=nasm: bits 64 org 100000h default rel ; EFI_SYSTEM_TABLE offsets SIMPLE_TEXT_OUTPUT equ 64 BOOT_SERVICES equ 96 ; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL function offsets TEXT_OUT_STRING equ 8 TEXT_SET_ATTR equ 40 TEXT_CLEAR_SCREEN equ 48 ; EFI_BOOT_SERVICES function offsets BOOT_GET_MEMORY_MAP equ 56 BOOT_EXIT_BOOT_SERVICES equ 232 start: mov [efihandle], rcx mov [systab], rdx mov rax, [rdx + BOOT_SERVICES] mov [bootsrv], rax sub rsp, 32 ; leave space for shadow area and rsp, 0xfffffffffffffff0 ; make sure sp is 16-byte aligned mov rcx, [rdx + SIMPLE_TEXT_OUTPUT] mov rdx, 0x0c call [rcx + TEXT_SET_ATTR] mov rax, [systab] mov rcx, [rax + SIMPLE_TEXT_OUTPUT] call [rcx + TEXT_CLEAR_SCREEN] mov rax, [systab] mov rcx, [rax + SIMPLE_TEXT_OUTPUT] lea rdx, [str_hello] call [rcx + TEXT_OUT_STRING] mov rax, [systab] mov rcx, [rax + SIMPLE_TEXT_OUTPUT] mov rdx, 0x07 call [rcx + TEXT_SET_ATTR] call get_rip mov rdi, rax call printhex64 call newline ; retrieve memory map ; args: RCX, RDX, R8, and R9. lea rcx, [mmap_size] lea rdx, [mmapbuf] lea r8, [mmap_key] lea r9, [mmap_descsz] lea rax, [mmap_descver] push rax sub rsp, 32 mov rax, [systab] mov rbx, [rax + BOOT_SERVICES] call [rbx + BOOT_GET_MEMORY_MAP] add rsp, 40 mov rcx, [efihandle] mov rdx, [mmap_key] mov rax, [systab] mov rbx, [rax + BOOT_SERVICES] call [rbx + BOOT_EXIT_BOOT_SERVICES] mov edi, 0a0000h mov ecx, 16000 mov eax, 00ff0000h rep stosd .hang: jmp .hang get_rip: mov rax, [rsp] ret ; expects number in rdi printhex64: mov rcx, 16 lea rbx, [hexbuf] .loop: rol rdi, 4 mov rax, rdi and rax, 0xf lea rdx, [hexdig] shl rax, 1 add rdx, rax mov ax, [rdx] mov [rbx], ax add rbx, 2 dec rcx jnz .loop mov word [rbx], 0 lea rdi, [hexbuf] ; expects string in rdi printstr: mov rcx, [systab] mov rcx, [rcx + SIMPLE_TEXT_OUTPUT] mov rdx, rdi sub rsp, 32 call [rcx + TEXT_OUT_STRING] add rsp, 32 ret newline: lea rdi, [str_hello + 18] jmp printstr hexdig dw __utf16__ "0123456789abcdef" hexbuf: times 40 db 0 align 8 efihandle dq 0 systab dq 0 bootsrv dq 0 str_hello dw __utf16__(`qurashee!\r\n`),0 align 8 ; memory map data mmap_size dq 4096 mmap_key dq 0 mmap_descsz dq 0 mmap_descver dq 0 align 4096 mmapbuf: times 4096 db 0