aa34ddc9deba4c768e5a3742bc242b3d32c4be12
[rrq/jonasforth.git] / uefi / main.asm
1 format pe64 dll efi
2 entry main
3
4 ;; #region Structs
5
6 ;; Based on https://wiki.osdev.org/Uefi.inc
7 macro struct name {
8   virtual at 0
9     name name
10   end virtual
11 }
12
13 struc EFI_TABLE_HEADER {
14   dq ?
15   dd ?
16   dd ?
17   dd ?
18   dd ?
19 }
20
21 struc EFI_SYSTEM_TABLE {
22   .Hdr EFI_TABLE_HEADER
23   .FirmwareVendor dq ? ; CHAR16*
24   .FirmwareRevision dd ? ; UINT32
25   align 8
26   .ConsoleInHandle dq ? ; EFI_HANDLE
27   .ConIn dq ? ; EFI_SIMPLE_TEXT_INPUT_PROTOCOL*
28   .ConsoleOutHandle dq ? ; EFI_HANDLE
29   .ConOut dq ? ; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL*
30   ; ...
31 }
32 struct EFI_SYSTEM_TABLE
33
34 struc EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
35   .Reset dq ? ; EFI_TEXT_RESET
36   .OutputString dq ? ; EFI_TEXT_STRING
37   ; ...
38 }
39 struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
40
41 ;; #endregion
42
43 section '.text' code executable readable
44
45 main:
46   ; At program startup, RDX contains an EFI_SYSTEM_TABLE*.
47   mov [system_table], rdx
48
49   mov rcx, [system_table] ; EFI_SYSTEM_TABLE* rcx
50   mov rcx, [rcx + EFI_SYSTEM_TABLE.ConOut] ; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* rcx
51   mov rdx, hello_world_string
52   ; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL* rcx, CHAR16* rdx)
53   mov rbx, [rcx + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString] ; EFI_TEXT_STIRNG rbx
54   sub rsp, 32
55   call rbx
56   add rsp, 32
57
58   mov rax, 0
59   ret
60
61 section '.data' readable writable
62
63 system_table dq ?  ; EFI_SYSTEM_TABLE*
64
65 hello_world_string du 'Hello world!', 0xC, 0xA, 0