Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7130 | dunkaist | 1 | format pe64 dll efi at 0 |
2 | entry main |
||
3 | |||
4 | |||
5 | section '.text' code executable readable |
||
8091 | dunkaist | 6 | |
7130 | dunkaist | 7 | include '../struct.inc' |
8 | include '../macros.inc' |
||
9 | include '../const.inc' |
||
10 | include 'uefi.inc' |
||
11 | |||
12 | MEMORY_MAP_SIZE = 0x4000 |
||
13 | GOP_BUFFER_SIZE = 0x800 |
||
14 | |||
15 | KERNEL_BASE = 0x10000 |
||
16 | RAMDISK_BASE = 0x100000 |
||
17 | |||
18 | CODE_32_SELECTOR = 8 |
||
19 | DATA_32_SELECTOR = 16 |
||
20 | CODE_64_SELECTOR = 24 |
||
21 | |||
22 | ; linux/arch/x86/include/uapi/asm/e820.h |
||
23 | E820_RAM = 1 |
||
24 | E820_RESERVED = 2 |
||
25 | E820_ACPI = 3 |
||
26 | E820_NVS = 4 |
||
27 | E820_UNUSABLE = 5 |
||
28 | E820_PMEM = 7 |
||
29 | ;E820_MAX = 128 |
||
30 | |||
31 | main: |
||
32 | sub rsp, 0x38 |
||
33 | ; initialize UEFI library |
||
34 | InitializeLib |
||
35 | jc .error |
||
36 | |||
37 | ; uefi_call_wrapper ConOut, Reset, ConOut, 1 |
||
38 | ; cmp rax, EFI_SUCCESS |
||
39 | ; jnz .error |
||
40 | |||
41 | uefi_call_wrapper ConOut, ClearScreen, ConOut |
||
42 | cmp rax, EFI_SUCCESS |
||
43 | jnz .error |
||
44 | |||
45 | ; uefi_call_wrapper ConOut, OutputString, ConOut, msg_hello |
||
46 | ; cmp eax, EFI_SUCCESS |
||
47 | ; jnz .error |
||
48 | |||
49 | uefi_call_wrapper BootServices, LocateHandle, 2, gopuuid, 0, gop_buffer_size, gop_buffer |
||
50 | cmp eax, EFI_SUCCESS |
||
51 | jnz .error |
||
52 | |||
53 | mov rsi, gop_buffer |
||
54 | lodsq |
||
55 | mov [gop_handle], rax |
||
56 | uefi_call_wrapper BootServices, HandleProtocol, qword [gop_handle], gopuuid, gop_interface |
||
57 | cmp eax, EFI_SUCCESS |
||
58 | jnz .error |
||
59 | |||
60 | mov rbx, [efi_ptr] |
||
61 | mov rdi, [rbx + EFI_SYSTEM_TABLE.ConfigurationTable] |
||
62 | mov rcx, [rbx + EFI_SYSTEM_TABLE.NumberOfTableEntries] |
||
63 | mov rax, 0x11d3e4f18868e871 |
||
64 | mov rdx, 0x81883cc7800022bc |
||
65 | .next_table: |
||
66 | dec ecx |
||
67 | js .all_tables_done |
||
68 | cmp [rdi + 0], rax |
||
69 | jnz .not_acpi20 |
||
70 | cmp [rdi + 8], rdx |
||
71 | jnz .not_acpi20 |
||
72 | mov rax, [rdi + 16] |
||
7132 | dunkaist | 73 | mov rdx, BOOT_LO.acpi_rsdp |
7130 | dunkaist | 74 | mov [rdx], eax |
75 | ;jmp $ |
||
76 | jmp .all_tables_done |
||
77 | .not_acpi20: |
||
78 | add rdi, 24 |
||
79 | jmp .next_table |
||
80 | .all_tables_done: |
||
81 | |||
82 | xor ebx, ebx |
||
83 | .next_mode: |
||
84 | call clearbuf |
||
85 | mov eax, ebx |
||
86 | lea rdi, [msg] |
||
87 | call num2dec |
||
88 | |||
89 | push rbx |
||
90 | uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, [gop_interface], rbx, gop_info_size, gop_info |
||
91 | cmp rax, EFI_SUCCESS |
||
92 | jnz .error |
||
93 | mov rcx, [gop_info] |
||
94 | cmp [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelFormat], 1 ; PixelBlueGreenRedReserved8BitPerColor |
||
95 | jnz .skip |
||
96 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution] |
||
97 | lea rdi, [msg+4*2] |
||
98 | call num2dec |
||
99 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution] |
||
100 | lea rdi, [msg+9*2] |
||
101 | call num2dec |
||
102 | ; mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine] |
||
103 | ; lea rdi, [msg+14*2] |
||
104 | ; call num2dec |
||
105 | .skip: |
||
106 | uefi_call_wrapper ConOut, OutputString, ConOut, msg |
||
107 | cmp rax, EFI_SUCCESS |
||
108 | jnz .error |
||
109 | |||
110 | pop rbx |
||
111 | inc rbx |
||
112 | mov rcx, [gop_interface] |
||
113 | mov rdx, [rcx + EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode] |
||
114 | cmp ebx, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode] |
||
115 | jnz .next_mode |
||
116 | |||
117 | |||
118 | uefi_call_wrapper ConIn, Reset, ConIn, 1 |
||
119 | cmp rax, EFI_SUCCESS |
||
120 | jnz .error |
||
121 | xor ecx, ecx |
||
122 | @@: |
||
123 | push rcx |
||
124 | uefi_call_wrapper ConIn, ReadKeyStroke, ConIn, msg |
||
125 | pop rcx |
||
126 | mov rdx, EFI_DEVICE_ERROR |
||
127 | cmp rax, rdx |
||
128 | jz .error |
||
129 | mov rdx, EFI_NOT_READY |
||
130 | cmp rax, rdx |
||
131 | jz @b |
||
132 | ; cmp rax, EFI_SUCCESS |
||
133 | movzx eax, word[msg+2] |
||
134 | ;jmp .key_done |
||
135 | cmp al, 0x0D |
||
136 | jz .key_done |
||
137 | imul ecx, 10 |
||
138 | sub eax, '0' |
||
139 | add ecx, eax |
||
140 | jmp @b |
||
141 | .key_done: |
||
142 | |||
143 | uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.SetMode, [gop_interface], rcx |
||
144 | cmp eax, EFI_SUCCESS |
||
145 | jnz .error |
||
146 | |||
147 | mov rcx, [gop_interface] |
||
148 | mov rdx, [rcx + EFI_GRAPHICS_OUTPUT_PROTOCOL.Mode] |
||
149 | mov rdi, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.FrameBufferBase] |
||
150 | mov [fb_base], rdi |
||
151 | |||
152 | |||
153 | mov ebx, [rdx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.Mode] |
||
154 | uefi_call_wrapper [gop_interface], EFI_GRAPHICS_OUTPUT_PROTOCOL.QueryMode, [gop_interface], rbx, gop_info_size, gop_info |
||
155 | cmp rax, EFI_SUCCESS |
||
156 | jnz .error |
||
157 | mov rcx, [gop_info] |
||
158 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.HorizontalResolution] |
||
159 | xor rdx, rdx |
||
7132 | dunkaist | 160 | mov word [rdx + BOOT_LO.x_res], ax |
7130 | dunkaist | 161 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.VerticalResolution] |
7132 | dunkaist | 162 | mov word [rdx + BOOT_LO.y_res], ax |
7130 | dunkaist | 163 | mov eax, [rcx + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION.PixelsPerScanLine] |
164 | shl eax, 2 |
||
7132 | dunkaist | 165 | mov word [rdx + BOOT_LO.pitch], ax |
7130 | dunkaist | 166 | |
7731 | dunkaist | 167 | mov byte [rdx + BOOT_LO.pci_data + 0], 1 ; PCI access mechanism |
168 | mov byte [rdx + BOOT_LO.pci_data + 1], 8 ; last bus, don't know how to count them |
||
169 | mov byte [rdx + BOOT_LO.pci_data + 2], 0x10 ; PCI version |
||
7132 | dunkaist | 170 | mov byte [rdx + BOOT_LO.pci_data + 3], 0x02 |
171 | mov dword [rdx + BOOT_LO.pci_data + 4], 0xe3 |
||
7130 | dunkaist | 172 | |
173 | |||
174 | uefi_call_wrapper BootServices, GetMemoryMap, memory_map_size, memory_map, memory_map_key, descriptor_size, descriptor_ver |
||
175 | cmp eax, EFI_SUCCESS |
||
176 | jnz .error |
||
177 | |||
7132 | dunkaist | 178 | mov rdi, BOOT_LO.memmap_block_cnt |
7130 | dunkaist | 179 | mov dword[rdi], 0 |
7132 | dunkaist | 180 | mov rdi, BOOT_LO.memmap_blocks |
7130 | dunkaist | 181 | mov rax, [memory_map_size] |
182 | xor edx, edx |
||
183 | mov rcx, [descriptor_size] |
||
184 | div ecx |
||
185 | mov ecx, eax |
||
186 | mov rsi, memory_map |
||
187 | .next_descr: |
||
188 | call add_uefi_memmap |
||
189 | add rsi, [descriptor_size] |
||
190 | add rdi, sizeof.e820entry |
||
191 | dec rcx |
||
192 | cmp rcx, 0 |
||
193 | jnz .next_descr |
||
194 | |||
195 | mov [memory_map_size], MEMORY_MAP_SIZE |
||
196 | uefi_call_wrapper BootServices, GetMemoryMap, memory_map_size, memory_map, memory_map_key, descriptor_size, descriptor_ver |
||
197 | cmp eax, EFI_SUCCESS |
||
198 | jnz .error |
||
199 | |||
200 | uefi_call_wrapper BootServices, ExitBootServices, [efi_handler], [memory_map_key] |
||
201 | cmp eax, EFI_SUCCESS |
||
202 | jnz .error |
||
203 | |||
204 | |||
205 | cli |
||
206 | |||
8091 | dunkaist | 207 | mov rsi, kernel_data_begin |
7130 | dunkaist | 208 | mov rdi, KERNEL_BASE |
8091 | dunkaist | 209 | mov rcx, (kernel_data_end - kernel_data_begin + 7) / 8 |
7130 | dunkaist | 210 | rep movsq |
211 | |||
8091 | dunkaist | 212 | mov rsi, ramdisk_data_begin |
7130 | dunkaist | 213 | mov rdi, RAMDISK_BASE |
8091 | dunkaist | 214 | mov rcx, (ramdisk_data_end - ramdisk_data_begin + 7 ) / 8 |
7130 | dunkaist | 215 | rep movsq |
216 | |||
217 | xor esi, esi |
||
7132 | dunkaist | 218 | mov byte[esi + BOOT_LO.bpp], 32 |
219 | mov word[esi + BOOT_LO.vesa_mode], 0 |
||
220 | mov dword[esi + BOOT_LO.bank_switch], 0 |
||
7130 | dunkaist | 221 | mov rdi, [fb_base] |
7132 | dunkaist | 222 | mov dword[esi + BOOT_LO.lfb], edi |
223 | mov byte[esi + BOOT_LO.mtrr], 1 |
||
224 | mov byte[esi + BOOT_LO.launcher_start], 1 |
||
225 | mov byte[esi + BOOT_LO.debug_print], 1 |
||
226 | mov byte[esi + BOOT_LO.dma], 0 |
||
227 | ; mov qword[esi + BOOT_LO.pci_data], 0 |
||
228 | mov dword[esi + BOOT_LO.apm_entry], 0 |
||
229 | mov word[esi + BOOT_LO.apm_version], 0 |
||
230 | mov dword[esi + BOOT_LO.apm_flags], 0 |
||
231 | mov word[esi + BOOT_LO.apm_code_32], 0 |
||
232 | mov word[esi + BOOT_LO.apm_code_16], 0 |
||
233 | mov word[esi + BOOT_LO.apm_data_16], 0 |
||
234 | mov byte[esi + BOOT_LO.bios_hd_cnt], 0 |
||
8091 | dunkaist | 235 | mov rsi, syspath |
236 | mov rdi, BOOT_LO.syspath |
||
237 | mov ecx, 32 |
||
238 | rep movsb |
||
7130 | dunkaist | 239 | |
240 | lgdt [cs:GDTR] |
||
241 | |||
242 | mov ax, DATA_32_SELECTOR |
||
243 | mov ds, ax |
||
244 | mov es, ax |
||
245 | mov fs, ax |
||
246 | mov gs, ax |
||
247 | mov ss, ax |
||
248 | |||
249 | push CODE_32_SELECTOR |
||
250 | lea rax, [.next] |
||
251 | push rax |
||
252 | ; push .next |
||
253 | retf |
||
254 | use32 |
||
255 | align 16 |
||
256 | .next: |
||
257 | mov eax, cr0 |
||
258 | and eax, not CR0_PG |
||
259 | mov cr0, eax |
||
260 | |||
261 | mov ecx, MSR_AMD_EFER |
||
262 | rdmsr |
||
263 | btr eax, 8 ; LME |
||
264 | wrmsr |
||
265 | |||
266 | mov eax, cr4 |
||
267 | and eax, not CR4_PAE |
||
268 | mov cr4, eax |
||
269 | |||
270 | push KERNEL_BASE |
||
271 | retn |
||
272 | |||
273 | use64 |
||
274 | .error: |
||
275 | uefi_call_wrapper ConOut, OutputString, ConOut, msg_error |
||
276 | jmp .quit |
||
277 | .quit: |
||
278 | mov rcx, -1 |
||
279 | loop $ |
||
280 | |||
281 | |||
282 | ; linux/arch/x86/platform/efi/efi.c |
||
283 | ; do_add_efi_memmap |
||
284 | add_uefi_memmap: |
||
285 | push rax rbx rcx rdx rsi rdi |
||
286 | |||
287 | mov r10d, [rsi + 0] |
||
288 | mov r11, [rsi + 8] |
||
289 | ; mov r12, [rsi + 16] |
||
290 | mov r13, [rsi + 24] |
||
291 | mov r14, [rsi + 32] |
||
292 | |||
293 | mov [rdi + e820entry.addr], r11 |
||
294 | mov rax, r13 |
||
295 | shl rax, 12 |
||
296 | mov [rdi + e820entry.size], rax |
||
297 | |||
298 | |||
299 | cmp r10d, EFI_LOADER_CODE |
||
300 | jz .case0 |
||
301 | cmp r10d, EFI_LOADER_DATA |
||
302 | jz .case0 |
||
303 | cmp r10d, EFI_BOOT_SERVICES_CODE |
||
304 | jz .case0 |
||
305 | cmp r10d, EFI_BOOT_SERVICES_DATA |
||
306 | jz .case0 |
||
307 | cmp r10d, EFI_CONVENTIONAL_MEMORY |
||
308 | jz .case0 |
||
309 | cmp r10d, EFI_ACPI_RECLAIM_MEMORY |
||
310 | jz .case1 |
||
311 | cmp r10d, EFI_ACPI_MEMORY_NVS |
||
312 | jz .case2 |
||
313 | cmp r10d, EFI_UNUSABLE_MEMORY |
||
314 | jz .case3 |
||
315 | cmp r10d, EFI_PERSISTENT_MEMORY |
||
316 | jz .case4 |
||
317 | jmp .default |
||
318 | |||
319 | .case0: |
||
320 | test r14, EFI_MEMORY_WB |
||
321 | jz @f |
||
322 | mov eax, E820_RAM |
||
323 | jmp .done |
||
324 | @@: |
||
325 | mov eax, E820_RESERVED |
||
326 | jmp .done |
||
327 | .case1: |
||
328 | mov eax, E820_ACPI |
||
329 | jmp .done |
||
330 | .case2: |
||
331 | mov eax, E820_NVS |
||
332 | jmp .done |
||
333 | .case3: |
||
334 | mov eax, E820_UNUSABLE |
||
335 | jmp .done |
||
336 | .case4: |
||
337 | mov eax, E820_PMEM |
||
338 | jmp .done |
||
339 | .default: |
||
340 | mov eax, E820_RESERVED |
||
341 | jmp .done |
||
342 | |||
343 | .done: |
||
344 | mov [rdi + e820entry.type], eax |
||
345 | |||
7132 | dunkaist | 346 | mov rax, BOOT_LO.memmap_block_cnt |
7130 | dunkaist | 347 | inc word[rax] |
348 | |||
349 | pop rdi rsi rdx rcx rbx rax |
||
350 | ret |
||
351 | |||
352 | |||
353 | num2dec: |
||
354 | push rax rbx rcx rdx rsi rdi |
||
355 | |||
356 | xor ecx, ecx |
||
357 | mov ebx, 10 |
||
358 | .next_digit: |
||
359 | xor edx, edx |
||
360 | div ebx |
||
361 | push rdx |
||
362 | inc ecx |
||
363 | test eax, eax |
||
364 | jnz .next_digit |
||
365 | |||
366 | .next_char: |
||
367 | pop rax |
||
368 | add eax, '0' |
||
369 | stosw |
||
370 | loop .next_char |
||
371 | |||
372 | pop rdi rsi rdx rcx rbx rax |
||
373 | ret |
||
374 | |||
375 | |||
376 | num2hex: |
||
377 | push rax rbx rcx rdx rsi rdi |
||
378 | |||
379 | xchg rdx, rax |
||
380 | mov ecx, 16 |
||
381 | .next_tetra: |
||
382 | rol rdx, 4 |
||
383 | movzx eax, dl |
||
384 | and eax, 0x0f |
||
385 | movzx eax, byte[hex+eax] |
||
386 | stosw |
||
387 | loop .next_tetra |
||
388 | |||
389 | pop rdi rsi rdx rcx rbx rax |
||
390 | ret |
||
391 | |||
392 | hex db '0123456789ABCDEF' |
||
393 | |||
394 | clearbuf: |
||
395 | push rax rbx rcx rdx rsi rdi |
||
396 | mov eax, 0x0020 |
||
397 | mov ecx, 79 |
||
398 | mov rdi, msg |
||
399 | rep stosw |
||
400 | pop rdi rsi rdx rcx rbx rax |
||
401 | ret |
||
402 | |||
403 | section '.data' data readable writeable |
||
404 | |||
405 | GDTR: |
||
406 | dw 4*8-1 |
||
407 | dq GDT |
||
408 | GDT: |
||
409 | dw 0, 0, 0, 0 |
||
410 | dw 0FFFFh,0,9A00h,0CFh ; 32-bit code |
||
411 | dw 0FFFFh,0,9200h,0CFh ; flat data |
||
412 | dw 0FFFFh,0,9A00h,0AFh ; 64-bit code |
||
413 | |||
414 | |||
415 | fb_base dq 0 |
||
416 | |||
417 | gopuuid db EFI_GRAPHICS_OUTPUT_PROTOCOL_UUID |
||
418 | gop_buffer_size dq GOP_BUFFER_SIZE |
||
419 | gop_handle dq 0 |
||
420 | gop_interface dq 0 |
||
421 | gop_info_size dq 0 |
||
422 | gop_info dq 0 |
||
423 | |||
424 | memory_map_key dq 0 |
||
425 | descriptor_size dq 0 |
||
426 | descriptor_ver dq 0 |
||
427 | memory_map_size dq MEMORY_MAP_SIZE |
||
428 | |||
429 | msg_success du 'Success!',13,10,0 |
||
430 | msg_error du 'Error!',13,10,0 |
||
431 | msg du 79 dup ' ',13,10,0 |
||
432 | |||
8091 | dunkaist | 433 | syspath db '/RD/1',0 |
434 | |||
7130 | dunkaist | 435 | memory_map rb MEMORY_MAP_SIZE |
436 | gop_buffer rb GOP_BUFFER_SIZE |
||
437 | |||
438 | |||
8091 | dunkaist | 439 | kernel_data_begin: |
440 | file '../kernel.bin.ext_loader' |
||
441 | kernel_data_end: |
||
7130 | dunkaist | 442 | |
8091 | dunkaist | 443 | ramdisk_data_begin: |
7130 | dunkaist | 444 | file '../../../data/kolibri.img' |
8091 | dunkaist | 445 | ramdisk_data_end: |
7130 | dunkaist | 446 | |
447 | align 16 |
||
448 | data fixups |
||
449 | end data |