xref: /haiku/headers/private/kernel/platform/efi/types.h (revision 569564c02d75ecabeee1e413bff893691b2367d5)
1 // Copyright 2016 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #include <stddef.h>
8 #include <stdint.h>
9 
10 // EFI on x86 uses the Microsoft ABI which is not the default for gcc
11 #if defined(__x86_64__) || defined(__x86__)
12 #define EFIAPI __attribute__((ms_abi))
13 #else
14 #define EFIAPI
15 #endif
16 
17 #if UINTPTR_MAX == 0xffffffff
18 #define EFI_ERROR_MASK 0x80000000
19 #elif UINTPTR_MAX == 0xffffffffffffffff
20 #define EFI_ERROR_MASK 0x8000000000000000
21 #endif
22 
23 #define EFI_ERR(x) (EFI_ERROR_MASK | x)
24 #define EFI_ERROR(x) (((ssize_t)x) < 0)
25 
26 #define EFI_SUCCESS              0
27 #define EFI_LOAD_ERROR           EFI_ERR(1)
28 #define EFI_INVALID_PARAMETER    EFI_ERR(2)
29 #define EFI_UNSUPPORTED          EFI_ERR(3)
30 #define EFI_BAD_BUFFER_SIZE      EFI_ERR(4)
31 #define EFI_BUFFER_TOO_SMALL     EFI_ERR(5)
32 #define EFI_NOT_READY            EFI_ERR(6)
33 #define EFI_DEVICE_ERROR         EFI_ERR(7)
34 #define EFI_WRITE_PROTECTED      EFI_ERR(8)
35 #define EFI_OUT_OF_RESOURCES     EFI_ERR(9)
36 #define EFI_VOLUME_CORRUPTED     EFI_ERR(10)
37 #define EFI_VOLUME_FULL          EFI_ERR(11)
38 #define EFI_NO_MEDIA             EFI_ERR(12)
39 #define EFI_MEDIA_CHANGED        EFI_ERR(13)
40 #define EFI_NOT_FOUND            EFI_ERR(14)
41 #define EFI_ACCESS_DENIED        EFI_ERR(15)
42 #define EFI_NO_RESPONSE          EFI_ERR(16)
43 #define EFI_NO_MAPPING           EFI_ERR(17)
44 #define EFI_TIMEOUT              EFI_ERR(18)
45 #define EFI_NOT_STARTED          EFI_ERR(19)
46 #define EFI_ALREADY_STARTED      EFI_ERR(20)
47 #define EFI_ABORTED              EFI_ERR(21)
48 #define EFI_ICMP_ERROR           EFI_ERR(22)
49 #define EFI_TFTP_ERROR           EFI_ERR(23)
50 #define EFI_PROTOCOL_ERROR       EFI_ERR(24)
51 #define EFI_INCOMPATIBLE_VERSION EFI_ERR(25)
52 #define EFI_SECURITY_VIOLATION   EFI_ERR(26)
53 #define EFI_CRC_ERROR            EFI_ERR(27)
54 #define EFI_END_OF_MEDIA         EFI_ERR(28)
55 #define EFI_END_OF_FILE          EFI_ERR(31)
56 #define EFI_INVALID_LANGUAGE     EFI_ERR(32)
57 #define EFI_COMPROMISED_DATA     EFI_ERR(33)
58 #define EFI_IP_ADDRESS_CONFLICT  EFI_ERR(34)
59 #define EFI_HTTP_ERROR           EFI_ERR(35)
60 
61 // TODO: figure out where to put these. They're just mentioned in passing in the
62 // spec as some of many industry standard GUIDs but not part of the spec itself.
63 #define ACPI_TABLE_GUID \
64     {0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d}}
65 #define ACPI_20_TABLE_GUID \
66     {0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81}}
67 #define SMBIOS_TABLE_GUID \
68     {0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d}}
69 #define SMBIOS3_TABLE_GUID \
70     {0xf2fd1544, 0x9794, 0x4a2c, {0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94}}
71 #define DEVICE_TREE_GUID \
72     {0xb1b621d5, 0xf19c, 0x41a5, {0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0}}
73 
74 
75 typedef struct {
76     uint64_t Signature;
77     uint32_t Revision;
78     uint32_t HeaderSize;
79     uint32_t CRC32;
80     uint32_t Reserved;
81 } efi_table_header;
82 
83 typedef struct efi_guid {
84     uint32_t data1;
85     uint16_t data2;
86     uint16_t data3;
87     uint8_t data4[8];
88 
equalsefi_guid89 	bool equals(const efi_guid& other) const {
90 		bool matches = data1 == other.data1 && data2 == other.data2
91 			&& data3 == other.data3;
92 		for (auto i = 0; matches && i < 8; i++)
93 			matches = data4[i] == other.data4[i];
94 		return matches;
95 	}
96 } efi_guid;
97 
98 typedef void* efi_handle;
99 
100 typedef size_t efi_status;
101 
102 typedef struct {
103     uint8_t addr[32];
104 } efi_mac_addr;
105 
106 typedef struct {
107     uint8_t addr[4];
108 } efi_ipv4_addr;
109 
110 typedef struct {
111     uint8_t addr[16];
112 } efi_ipv6_addr;
113 
114 typedef union {
115     efi_ipv4_addr v4;
116     efi_ipv6_addr v6;
117 } efi_ip_addr;
118 
119 // This really belongs in boot-services.h, but causes circular dependencies with
120 // device-path.h.
121 typedef enum {
122     EfiReservedMemoryType,
123     EfiLoaderCode,
124     EfiLoaderData,
125     EfiBootServicesCode,
126     EfiBootServicesData,
127     EfiRuntimeServicesCode,
128     EfiRuntimeServicesData,
129     EfiConventionalMemory,
130     EfiUnusableMemory,
131     EfiACPIReclaimMemory,
132     EfiACPIMemoryNVS,
133     EfiMemoryMappedIO,
134     EfiMemoryMappedIOPortSpace,
135     EfiPalCode,
136     EfiPersistentMemory,
137     EfiMaxMemoryType
138 } efi_memory_type;
139 
140 typedef uint64_t efi_physical_addr;
141 typedef uint64_t efi_virtual_addr;
142 
143 typedef void* efi_event;
144 
145 #define EVT_TIMER                         0x80000000
146 #define EVT_RUNTIME                       0x40000000
147 #define EVT_NOTIFY_WAIT                   0x00000100
148 #define EVT_NOTIFY_SIGNAL                 0x00000200
149 #define EVT_SIGNAL_EXIT_BOOT_SERVICES     0x00000201
150 #define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202
151 
152 #define EFI_EVENT_GROUP_EXIT_BOOT_SERVICES \
153     {0x27abf055, 0xb1b8, 0x4c26, {0x80, 0x48, 0x74, 0x8f, 0x37, 0xba, 0xa2, 0xdf}}
154 #define EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE \
155     {0x13fa7698, 0xc831, 0x49c7, {0x87, 0xea, 0x8f, 0x43, 0xfc, 0xc2, 0x51, 0x96}}
156 #define EFI_EVENT_GROUP_MEMORY_MAP_CHANGE \
157     {0x78bee926, 0x692f, 0x48fd, {0x9e, 0xdb, 0x01, 0x42, 0x2e, 0xf0, 0xd7, 0xab}}
158 #define EFI_EVENT_GROUP_READY_TO_BOOT \
159     {0x7ce88fb3, 0x4bd7, 0x4679, {0x87, 0xa8, 0xa8, 0xd8, 0xde, 0xe5, 0x0d, 0x2b}}
160 
161 typedef void (*efi_event_notify) (efi_event event, void* ctx) EFIAPI;
162 
163 typedef enum {
164     TimerCancel,
165     TimerPeriodic,
166     TimerRelative
167 } efi_timer_delay;
168 
169 #ifndef __cplusplus
170 typedef unsigned short char16_t;
171 #endif
172