furix
cute os
include/efi.h
10670 bytes raw
1#ifndef FURIX_EFI_H
2#define FURIX_EFI_H
3
4#include <types.h>
5
6#if defined(_MSC_VER)
7#define EFIAPI __cdecl
8#elif defined(__GNUC__) || defined(__clang__)
9#define EFIAPI __attribute__((ms_abi))
10#else
11#define EFIAPI
12#endif
13
14typedef uint64_t EFI_STATUS;
15typedef uint64_t UINTN;
16typedef uint16_t CHAR16;
17typedef uint8_t BOOLEAN;
18typedef void *EFI_HANDLE;
19typedef void *EFI_EVENT;
20
21#define EFI_SUCCESS ((EFI_STATUS)0)
22#define EFI_ERROR_MASK ((EFI_STATUS)1 << 63)
23#define EFIERR(status) (((status) & EFI_ERROR_MASK) != 0)
24
25/* the status codes the kernel actually inspects by value. */
26#define EFI_BUFFER_TOO_SMALL ((EFI_STATUS)(EFI_ERROR_MASK | 5))
27
28typedef struct {
29 uint32_t Data1;
30 uint16_t Data2;
31 uint16_t Data3;
32 uint8_t Data4[8];
33} EFI_GUID;
34
35typedef struct {
36 EFI_GUID VendorGuid;
37 void *VendorTable;
38} EFI_CONFIGURATION_TABLE;
39
40typedef struct {
41 uint64_t Signature;
42 uint32_t Revision;
43 uint32_t HeaderSize;
44 uint32_t CRC32;
45 uint32_t Reserved;
46} EFI_TABLE_HEADER;
47
48typedef uint64_t EFI_PHYSICAL_ADDRESS;
49typedef uint64_t EFI_VIRTUAL_ADDRESS;
50typedef UINTN EFI_TPL;
51
52typedef enum {
53 AllocateAnyPages,
54 AllocateMaxAddress,
55 AllocateAddress,
56 MaxAllocateType
57} EFI_ALLOCATE_TYPE;
58
59typedef enum {
60 EfiReservedMemoryType,
61 EfiLoaderCode,
62 EfiLoaderData,
63 EfiBootServicesCode,
64 EfiBootServicesData,
65 EfiRuntimeServicesCode,
66 EfiRuntimeServicesData,
67 EfiConventionalMemory,
68 EfiUnusableMemory,
69 EfiACPIReclaimMemory,
70 EfiACPIMemoryNVM,
71 EfiMemoryMappedIO,
72 EfiMemoryMappedIOPortSpace,
73 EfiPalCode,
74 EfiPersistentMemory,
75 EfiMaxMemoryType
76} EFI_MEMORY_TYPE;
77
78/*
79 * NOT packed, and that is deliberate. the UEFI layout puts PhysicalStart at
80 * offset 8, which needs 4 bytes of padding after the 4-byte Type, so the
81 * struct is 40 bytes, and marking it packed would move every following field
82 * down by 4 and silently corrupt every read.
83 *
84 * note that sizeof() here is 40 while EDK2 reports a DescriptorSize of 48: the
85 * firmware struct carries an extra union for versioned descriptors. always
86 * stride the memory map by the reported DescriptorSize, never by sizeof.
87 */
88typedef struct {
89 uint32_t Type;
90 EFI_PHYSICAL_ADDRESS PhysicalStart;
91 EFI_VIRTUAL_ADDRESS VirtualStart;
92 uint64_t NumberOfPages;
93 uint64_t Attribute;
94} EFI_MEMORY_DESCRIPTOR;
95
96typedef enum {
97 AllHandles,
98 ByRegisterNotify,
99 ByProtocol
100} EFI_LOCATE_SEARCH_TYPE;
101
102typedef enum {
103 TimerCancel,
104 TimerPeriodic,
105 TimerRelative
106} EFI_TIMER_DELAY;
107
108typedef struct EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH_PROTOCOL;
109
110// member order and offsets are part of the UEFI ABI; do not reorder.
111// only the entries needed so far are typed precisely, but every member that
112// precedes them must still be present so their offsets stay correct.
113typedef struct EFI_BOOT_SERVICES EFI_BOOT_SERVICES;
114struct EFI_BOOT_SERVICES {
115 EFI_TABLE_HEADER Hdr;
116
117 EFI_STATUS (EFIAPI *RaiseTPL)(EFI_TPL NewTpl);
118 void (EFIAPI *RestoreTPL)(EFI_TPL OldTpl);
119
120 EFI_STATUS (EFIAPI *AllocatePages)(EFI_ALLOCATE_TYPE Type, EFI_MEMORY_TYPE MemoryType, UINTN Pages, EFI_PHYSICAL_ADDRESS *Memory);
121 EFI_STATUS (EFIAPI *FreePages)(EFI_PHYSICAL_ADDRESS Memory, UINTN Pages);
122 EFI_STATUS (EFIAPI *GetMemoryMap)(UINTN *MemoryMapSize, EFI_MEMORY_DESCRIPTOR *MemoryMap, UINTN *MapKey, UINTN *DescriptorSize, uint32_t *DescriptorVersion);
123 EFI_STATUS (EFIAPI *AllocatePool)(EFI_MEMORY_TYPE PoolType, UINTN Size, void **Buffer);
124 EFI_STATUS (EFIAPI *FreePool)(void *Buffer);
125
126 EFI_STATUS (EFIAPI *CreateEvent)(uint32_t Type, EFI_TPL NotifyTpl, void (EFIAPI *NotifyFunction)(EFI_EVENT Event, void *Context), void *NotifyContext, EFI_EVENT *Event);
127 EFI_STATUS (EFIAPI *SetTimer)(EFI_EVENT Event, EFI_TIMER_DELAY Type, uint64_t TriggerTime);
128 EFI_STATUS (EFIAPI *WaitForEvent)(UINTN NumberOfEvents, EFI_EVENT *Event, UINTN *Index);
129 EFI_STATUS (EFIAPI *SignalEvent)(EFI_EVENT Event);
130 EFI_STATUS (EFIAPI *CloseEvent)(EFI_EVENT Event);
131 EFI_STATUS (EFIAPI *CheckEvent)(EFI_EVENT Event);
132
133 EFI_STATUS (EFIAPI *InstallProtocolInterface)(EFI_HANDLE *Handle, EFI_GUID *Protocol, uint32_t InterfaceType, void *Interface);
134 EFI_STATUS (EFIAPI *ReinstallProtocolInterface)(EFI_HANDLE Handle, EFI_GUID *Protocol, void *OldInterface, void *NewInterface);
135 EFI_STATUS (EFIAPI *UninstallProtocolInterface)(EFI_HANDLE Handle, EFI_GUID *Protocol, void *Interface);
136 EFI_STATUS (EFIAPI *HandleProtocol)(EFI_HANDLE Handle, EFI_GUID *Protocol, void **Interface);
137 void *Reserved;
138 EFI_STATUS (EFIAPI *RegisterProtocolNotify)(EFI_GUID *Protocol, void (EFIAPI *NotifyFunction)(EFI_EVENT Event, void *Context), EFI_EVENT *Registration);
139 EFI_STATUS (EFIAPI *LocateHandle)(EFI_LOCATE_SEARCH_TYPE SearchType, EFI_GUID *Protocol, void *SearchKey, UINTN *BufferSize, EFI_HANDLE *Buffer);
140 EFI_STATUS (EFIAPI *LocateDevicePath)(EFI_GUID *Protocol, EFI_DEVICE_PATH_PROTOCOL **DevicePath, EFI_HANDLE *Device);
141 EFI_STATUS (EFIAPI *InstallConfigurationTable)(EFI_GUID *Guid, void *Table);
142
143 EFI_STATUS (EFIAPI *LoadImage)(BOOLEAN BootPolicy, EFI_HANDLE ParentImageHandle, EFI_DEVICE_PATH_PROTOCOL *DevicePath, void *SourceBuffer, UINTN SourceSize, EFI_HANDLE *ImageHandle);
144 EFI_STATUS (EFIAPI *StartImage)(EFI_HANDLE ImageHandle, UINTN *ExitDataSize, CHAR16 **ExitData);
145 EFI_STATUS (EFIAPI *Exit)(EFI_HANDLE ImageHandle, EFI_STATUS ExitStatus, UINTN ExitDataSize, CHAR16 *ExitData);
146 EFI_STATUS (EFIAPI *UnloadImage)(EFI_HANDLE ImageHandle);
147 EFI_STATUS (EFIAPI *ExitBootServices)(EFI_HANDLE ImageHandle, UINTN MapKey);
148 EFI_STATUS (EFIAPI *GetNextMonotonicCount)(uint64_t *Count);
149 EFI_STATUS (EFIAPI *Stall)(UINTN Microseconds);
150 EFI_STATUS (EFIAPI *SetWatchdogTimer)(UINTN Timeout, uint64_t WatchdogCode, UINTN DataSize, CHAR16 *WatchdogData);
151
152 EFI_STATUS (EFIAPI *ConnectController)(EFI_HANDLE ControllerHandle, EFI_HANDLE *DriverImageHandle, EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath, BOOLEAN Recursive);
153 EFI_STATUS (EFIAPI *DisconnectController)(EFI_HANDLE ControllerHandle, EFI_HANDLE DriverImageHandle, EFI_HANDLE ChildHandle);
154 EFI_STATUS (EFIAPI *OpenProtocol)(EFI_HANDLE Handle, EFI_GUID *Protocol, void **Interface, EFI_HANDLE AgentHandle, EFI_HANDLE ControllerHandle, uint32_t Attributes);
155 EFI_STATUS (EFIAPI *CloseProtocol)(EFI_HANDLE Handle, EFI_GUID *Protocol, EFI_HANDLE AgentHandle, EFI_HANDLE ControllerHandle);
156 EFI_STATUS (EFIAPI *OpenProtocolInformation)(EFI_HANDLE Handle, EFI_GUID *Protocol, void **EntryBuffer, UINTN *EntryCount);
157 EFI_STATUS (EFIAPI *ProtocolsPerHandle)(EFI_HANDLE Handle, EFI_GUID ***ProtocolBuffer, UINTN *ProtocolBufferCount);
158 EFI_STATUS (EFIAPI *LocateHandleBuffer)(EFI_LOCATE_SEARCH_TYPE SearchType, EFI_GUID *Protocol, void *SearchKey, UINTN *NoHandles, EFI_HANDLE **Buffer);
159 EFI_STATUS (EFIAPI *LocateProtocol)(EFI_GUID *Protocol, void *Registration, void **Interface);
160 EFI_STATUS (EFIAPI *InstallMultipleProtocolInterfaces)(EFI_HANDLE *Handle, ...);
161 EFI_STATUS (EFIAPI *UninstallMultipleProtocolInterfaces)(EFI_HANDLE Handle, ...);
162
163 EFI_STATUS (EFIAPI *CalculateCrc32)(void *Data, UINTN DataSize, uint32_t *Crc32);
164 void (EFIAPI *CopyMem)(void *Destination, void *Source, UINTN Length);
165 void (EFIAPI *SetMem)(void *Buffer, UINTN Size, uint8_t Value);
166 EFI_STATUS (EFIAPI *CreateEventEx)(uint32_t Type, EFI_TPL NotifyTpl, void (EFIAPI *NotifyFunction)(EFI_EVENT Event, void *Context), const void *NotifyContext, const EFI_GUID *EventGroup, EFI_EVENT *Event);
167};
168
169struct EFI_RUNTIME_SERVICES;
170
171typedef struct {
172 uint16_t ScanCode;
173 CHAR16 UnicodeChar;
174} EFI_INPUT_KEY;
175
176typedef struct EFI_SIMPLE_TEXT_INPUT_PROTOCOL EFI_SIMPLE_TEXT_INPUT_PROTOCOL;
177struct EFI_SIMPLE_TEXT_INPUT_PROTOCOL {
178 EFI_STATUS (EFIAPI *Reset)(EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, BOOLEAN ExtendedVerification);
179 EFI_STATUS (EFIAPI *ReadKeyStroke)(EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, EFI_INPUT_KEY *Key);
180 EFI_EVENT WaitForKey;
181};
182
183typedef struct {
184 int32_t CursorColumn;
185 int32_t CursorRow;
186 BOOLEAN CursorVisible;
187} EFI_SIMPLE_TEXT_OUTPUT_MODE;
188
189typedef struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;
190struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
191 EFI_STATUS (EFIAPI *Reset)(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, BOOLEAN ExtendedVerification);
192 EFI_STATUS (EFIAPI *OutputString)(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, CHAR16 *String);
193 EFI_STATUS (EFIAPI *TestString)(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, CHAR16 *String);
194 EFI_STATUS (EFIAPI *QueryMode)(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, uint64_t ModeNumber, uint64_t *Columns, uint64_t *Rows);
195 EFI_STATUS (EFIAPI *SetMode)(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, uint64_t ModeNumber);
196 EFI_STATUS (EFIAPI *SetAttribute)(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, uint64_t Attribute);
197 EFI_STATUS (EFIAPI *ClearScreen)(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This);
198 EFI_STATUS (EFIAPI *SetCursorPosition)(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, uint64_t Column, uint64_t Row);
199 EFI_STATUS (EFIAPI *EnableCursor)(EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, BOOLEAN Visible);
200 EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;
201};
202
203typedef struct EFI_SYSTEM_TABLE EFI_SYSTEM_TABLE;
204struct EFI_SYSTEM_TABLE {
205 EFI_TABLE_HEADER Hdr;
206 CHAR16 *FirmwareVendor;
207 uint32_t FirmwareRevision;
208 EFI_HANDLE ConsoleInHandle;
209 EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;
210 EFI_HANDLE ConsoleOutHandle;
211 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
212 EFI_HANDLE StandardErrorHandle;
213 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr;
214 struct EFI_RUNTIME_SERVICES *RuntimeServices;
215 struct EFI_BOOT_SERVICES *BootServices;
216 UINTN NumberOfTableEntries;
217 EFI_CONFIGURATION_TABLE *ConfigurationTable;
218};
219
220typedef char efi_assert_sizeof_guid[(sizeof(EFI_GUID) == 16) ? 1 : -1];
221typedef char efi_assert_sizeof_header[(sizeof(EFI_TABLE_HEADER) == 24) ? 1 : -1];
222typedef char efi_assert_sizeof_system_table[(sizeof(EFI_SYSTEM_TABLE) == 120) ? 1 : -1];
223
224typedef char efi_assert_sizeof_boot_services[(sizeof(struct EFI_BOOT_SERVICES) == 376) ? 1 : -1];
225typedef char efi_assert_offset_get_memory_map[(offsetof(struct EFI_BOOT_SERVICES, GetMemoryMap) == 56) ? 1 : -1];
226
227/* EFI_MEMORY_DESCRIPTOR layout is part of the UEFI ABI; see the struct comment. */
228typedef char efi_assert_sizeof_memory_descriptor[(sizeof(EFI_MEMORY_DESCRIPTOR) == 40) ? 1 : -1];
229typedef char efi_assert_offset_memory_start[(offsetof(EFI_MEMORY_DESCRIPTOR, PhysicalStart) == 8) ? 1 : -1];
230typedef char efi_assert_offset_memory_pages[(offsetof(EFI_MEMORY_DESCRIPTOR, NumberOfPages) == 24) ? 1 : -1];
231typedef char efi_assert_offset_memory_attr[(offsetof(EFI_MEMORY_DESCRIPTOR, Attribute) == 32) ? 1 : -1];
232typedef char efi_assert_offset_exit_boot_services[(offsetof(struct EFI_BOOT_SERVICES, ExitBootServices) == 232) ? 1 : -1];
233
234
235#endif /* FURIX_EFI_H */