fixed the boot services offset
[efitest2] / 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 96
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         sub rsp, 32
62         mov rax, [systab]
63         mov rbx, [rax + BOOT_SERVICES]
64         call [rbx + BOOT_GET_MEMORY_MAP]
65         add rsp, 40
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         mov edi, 0a0000h
74         mov ecx, 16000
75         mov eax, 00ff0000h
76         rep stosd
77
78 .hang:  jmp .hang
79
80 get_rip:
81         mov rax, [rsp]
82         ret
83
84         ; expects number in rdi
85 printhex64:
86         mov rcx, 16
87         lea rbx, [hexbuf]
88 .loop:  rol rdi, 4
89         mov rax, rdi
90         and rax, 0xf
91         lea rdx, [hexdig]
92         shl rax, 1
93         add rdx, rax
94         mov ax, [rdx]
95         mov [rbx], ax
96         add rbx, 2
97         dec rcx
98         jnz .loop
99         mov word [rbx], 0
100         lea rdi, [hexbuf]
101
102         ; expects string in rdi
103 printstr:
104         mov rcx, [systab]
105         mov rcx, [rcx + SIMPLE_TEXT_OUTPUT]
106         mov rdx, rdi
107         sub rsp, 32
108         call [rcx + TEXT_OUT_STRING]
109         add rsp, 32
110         ret
111
112 newline:
113         lea rdi, [str_hello + 18]
114         jmp printstr
115
116 hexdig dw __utf16__ "0123456789abcdef"
117 hexbuf: times 40 db 0
118
119         align 8
120 efihandle dq 0
121 systab dq 0
122 bootsrv dq 0
123 str_hello dw __utf16__(`qurashee!\r\n`),0
124
125         align 8
126 ; memory map data
127 mmap_size dq 4096
128 mmap_key dq 0
129 mmap_descsz dq 0
130 mmap_descver dq 0
131
132         align 4096
133 mmapbuf: times 4096 db 0