2cc79a240d6f1f739893a0a8f6058986b5c0f13e
[efitest3] / efitest.asm
1 ; vi:ft=nasm:
2         bits 64
3         org 100000h
4         default rel
5
6         ; EFI_SYSTEM_TABLE offsets
7 SIMPLE_TEXT_OUTPUT      equ 64
8 BOOT_SERVICES           equ 80
9
10         ; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL function offsets
11 TEXT_OUT_STRING         equ 8
12 TEXT_SET_ATTR           equ 40
13 TEXT_CLEAR_SCREEN       equ 48
14
15         ; EFI_BOOT_SERVICES function offsets
16 BOOT_GET_MEMORY_MAP     equ 56
17 BOOT_EXIT_BOOT_SERVICES equ 232
18
19
20 start:
21         mov [efihandle], rcx
22         mov [systab], rdx
23
24         mov rax, [rdx + BOOT_SERVICES]
25         mov [bootsrv], rax
26         sub rsp, 32                     ; leave space for shadow area
27         and rsp, 0xfffffffffffffff0     ; make sure sp is 16-byte aligned
28
29         mov rcx, [rdx + SIMPLE_TEXT_OUTPUT]
30         mov rdx, 0x0c
31         call [rcx + TEXT_SET_ATTR]
32
33         mov rax, [systab]
34         mov rcx, [rax + SIMPLE_TEXT_OUTPUT]
35         call [rcx + TEXT_CLEAR_SCREEN]
36
37         mov rax, [systab]
38         mov rcx, [rax + SIMPLE_TEXT_OUTPUT]
39         lea rdx, [str_hello]
40         call [rcx + TEXT_OUT_STRING]
41
42         
43         mov rax, [systab]
44         mov rcx, [rax + SIMPLE_TEXT_OUTPUT]
45         mov rdx, 0x07
46         call [rcx + TEXT_SET_ATTR]
47
48         call get_rip
49         mov rdi, rax
50         call printhex64
51         call newline
52
53         ; retrieve memory map
54         ; args: RCX, RDX, R8, and R9.
55         lea rcx, [mmap_size]
56         lea rdx, [mmapbuf]
57         lea r8, [mmap_key]
58         lea r9, [mmap_descsz]
59         lea rax, [mmap_descver]
60         push rax
61         push rax
62         mov rax, [systab]
63         mov rbx, [rax + BOOT_SERVICES]
64         call [rbx + BOOT_GET_MEMORY_MAP]
65         add rsp, 16
66
67         mov rcx, [efihandle]
68         mov rdx, [mmap_key]
69         mov rax, [systab]
70         mov rbx, [rax + BOOT_SERVICES]
71         call [rbx + BOOT_EXIT_BOOT_SERVICES]
72
73 .hang:  jmp .hang
74
75 get_rip:
76         mov rax, [rsp]
77         ret
78
79         ; expects number in rdi
80 printhex64:
81         mov rcx, 16
82         lea rbx, [hexbuf]
83 .loop:  rol rdi, 4
84         mov rax, rdi
85         and rax, 0xf
86         lea rdx, [hexdig]
87         shl rax, 1
88         add rdx, rax
89         mov ax, [rdx]
90         mov [rbx], ax
91         add rbx, 2
92         dec rcx
93         jnz .loop
94         mov word [rbx], 0
95         lea rdi, [hexbuf]
96
97         ; expects string in rdi
98 printstr:
99         mov rcx, [systab]
100         mov rcx, [rcx + SIMPLE_TEXT_OUTPUT]
101         mov rdx, rdi
102         sub rsp, 32
103         call [rcx + TEXT_OUT_STRING]
104         add rsp, 32
105         ret
106
107 newline:
108         lea rdi, [str_hello + 18]
109         jmp printstr
110
111 hexdig dw __utf16__ "0123456789abcdef"
112 hexbuf: times 40 db 0
113
114         align 8
115 efihandle dq 0
116 systab dq 0
117 bootsrv dq 0
118 str_hello dw __utf16__(`qurashee!\r\n`),0
119
120         align 8
121 ; memory map data
122 mmap_size dq 0
123 mmap_key dq 0
124 mmap_descsz dq 0
125 mmap_descver dq 0
126
127         align 4096
128 mmapbuf: times 4096 db 0