summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAda Christine <adachristine18@gmail.com>2023-01-04 21:41:09 +0000
committerAda Christine <adachristine18@gmail.com>2023-01-04 21:41:09 +0000
commitfcd3e818a9f1b7009c9c027a69b2ef0e7ef71293 (patch)
tree8ea63301dae5ba65ee92876f87dc501d032130d0
parenteb022d780afe1e5e92547b6b3c2369dde1c4cc0b (diff)
use homespun efi code
-rw-r--r--api/efi/acpi.h10
-rw-r--r--api/efi/console.h53
-rw-r--r--api/efi/defs.h20
-rw-r--r--api/efi/error.h13
-rw-r--r--api/efi/graphics.h100
-rw-r--r--api/efi/image.h34
-rw-r--r--api/efi/media.h148
-rw-r--r--api/efi/services.h109
-rw-r--r--api/efi/shell.h17
-rw-r--r--api/efi/tables.h110
-rw-r--r--api/efi/types.h171
-rw-r--r--api/loader/efi/shim.h4
-rw-r--r--efi.mk14
m---------gnu-efi-code0
-rw-r--r--kc/boot/kc_main.c8
-rw-r--r--loader/main_efi.c6
16 files changed, 797 insertions, 20 deletions
diff --git a/api/efi/acpi.h b/api/efi/acpi.h
new file mode 100644
index 0000000..29cbc87
--- /dev/null
+++ b/api/efi/acpi.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#define EFI_ACPI_TABLE_GUID {0x8868e871,0xe4f1,0x11d3,{0xbc,0x22,0x00,0x80,0xc7,0x3c,0x88,0x81}}
+
+#define EFI_ACPI_20_TABLE_GUID EFI_ACPI_TABLE_GUID
+
+#define ACPI_TABLE_GUID {0xeb9d2d30,0x2d88,0x11d3,{0x9a,0x16,0x00,0x90,0x27,0x3f,0xc1,0x4d}}
+
+#define ACPI_10_TABLE_GUID ACPI_TABLE_GUID
+
diff --git a/api/efi/console.h b/api/efi/console.h
new file mode 100644
index 0000000..279d365
--- /dev/null
+++ b/api/efi/console.h
@@ -0,0 +1,53 @@
+#pragma once
+
+#include <efi/types.h>
+
+#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \
+{0x387477c2,0x69c7,0x11d2,{0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b}}
+
+typedef struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;
+
+typedef struct {
+ INT32 MaxMode;
+ INT32 Mode;
+ INT32 Attribute;
+ INT32 CursorColumn;
+ INT32 CursorRow;
+ BOOLEAN CursorVisible;
+}
+SIMPLE_TEXT_OUTPUT_MODE;
+
+typedef EFI_STATUS (EFIAPI *EFI_TEXT_RESET)(
+ IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
+ IN BOOLEAN ExtendedVerification);
+
+typedef EFI_STATUS (EFIAPI *EFI_TEXT_STRING)(
+ IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
+ IN CHAR16 *String);
+
+typedef EFI_STATUS (EFIAPI *EFI_TEXT_TEST_STRING)(
+ IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
+ IN CHAR16
+ *String);
+
+typedef EFI_STATUS (EFIAPI *EFI_TEXT_SET_ATTRIBUTE)(
+ IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
+ IN UINTN Attribute);
+
+typedef EFI_STATUS (EFIAPI *EFI_TEXT_CLEAR_SCREEN)(
+ IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This);
+
+struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
+{
+ EFI_TEXT_RESET Reset;
+ EFI_TEXT_STRING OutputString;
+ EFI_TEXT_TEST_STRING TestString;
+ EFIX_UNUSED_FUNC QueryMode;
+ EFIX_UNUSED_FUNC SetMode;
+ EFI_TEXT_SET_ATTRIBUTE SetAttribute;
+ EFI_TEXT_CLEAR_SCREEN ClearScreen;
+ EFIX_UNUSED_FUNC SetCursorPosition;
+ EFIX_UNUSED_FUNC EnableCursor;
+ VOID *Mode;
+};
+
diff --git a/api/efi/defs.h b/api/efi/defs.h
new file mode 100644
index 0000000..a599976
--- /dev/null
+++ b/api/efi/defs.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION 10
+
+#define EFI_IMAGE_MACHINE_x64 0x8664
+
+#define IN
+#define OUT
+#define OPTIONAL
+#define CONST const
+
+#if defined(__ELF__) && defined(__GNUC__)
+#define EFIAPI __attribute__((ms_abi))
+#else
+#define EFIAPI
+#endif
+
+#define EFI_PAGE_SIZE 4096
+#define EFI_SIZE_TO_PAGES(size) (((size + EFI_PAGE_SIZE - 1) & ~(EFI_PAGE_SIZE - 1)) / EFI_PAGE_SIZE)
+
diff --git a/api/efi/error.h b/api/efi/error.h
new file mode 100644
index 0000000..b02f7ff
--- /dev/null
+++ b/api/efi/error.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#define EFI_ERROR(status) ((INTN)status < 0)
+
+#define EFI_ERROR_CODE(code) (INTN_MIN|code)
+
+#define EFI_SUCCESS 0
+#define EFI_INVALID_PARAMETER EFI_ERROR_CODE(2)
+#define EFI_NOT_READY EFI_ERROR_CODE(6)
+#define EFI_ABORTED EFI_ERROR_CODE(21)
+#define EFI_NOT_FOUND EFI_ERROR_CODE(14)
+#define EFI_BUFFER_TOO_SMALL EFI_ERROR_CODE(5)
+
diff --git a/api/efi/graphics.h b/api/efi/graphics.h
new file mode 100644
index 0000000..5fa8c14
--- /dev/null
+++ b/api/efi/graphics.h
@@ -0,0 +1,100 @@
+#pragma once
+
+#include <efi/types.h>
+
+#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID {0x9042a9de,0x23dc,0x4a38,{0x96,0xfb,0x7a,0xde,0xd0,0x80,0x51,0x6a}}
+
+typedef enum
+{
+ PixelRedGreenBlueReserved8BitPerColor,
+ PixelBlueGreenRedReserved8BitPerColor,
+ PixelBitMask,
+ PixelBltOnly,
+ PixelFormatMax
+}
+EFI_GRAPHICS_PIXEL_FORMAT;
+
+typedef enum
+{
+ EfiBltVideoFill,
+ EfiBltVideoToBltBuffer,
+ EfiBltBufferToVideo,
+ EfiBltVideoToVideo,
+ EfiGraphicsOutputBltOperationMax
+}
+EFI_GRAPHICS_OUTPUT_BLT_OPERATION;
+
+typedef struct
+{
+ UINT8 Blue;
+ UINT8 Green;
+ UINT8 Red;
+ UINT8 Reserved;
+}
+EFI_GRAPHICS_OUTPUT_BLT_PIXEL;
+
+typedef struct EFI_PIXEL_BITMAASK
+{
+ UINT32 RedMask;
+ UINT32 GreenMask;
+ UINT32 BlueMask;
+ UINT32 ReservedMask;
+}
+EFI_PIXEL_BITMASK;
+
+typedef struct
+{
+ UINT32 Version;
+ UINT32 HorizontalResolution;
+ UINT32 VerticalResolution;
+ EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
+ EFI_PIXEL_BITMASK PixelInformation;
+ UINT32 PixelsPerScanLine;
+}
+EFI_GRAPHICS_OUTPUT_MODE_INFORMATION;
+
+typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE) (
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
+ IN UINT32 ModeNumber,
+ OUT UINTN *SizeOfInfo,
+ OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE) (
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
+ IN UINT32 ModeNumber
+);
+
+typedef EFI_STATUS (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT) (
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
+ IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
+ IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+);
+
+typedef struct
+{
+ UINT32 MaxMode;
+ UINT32 Mode;
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
+ UINTN SizeOfInfo;
+ EFI_PHYSICAL_ADDRESS FrameBufferBase;
+ UINTN FrameBufferSize;
+}
+EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE;
+
+typedef struct EFI_GRAPHICS_OUTPUT_PROTOCOL
+{
+ EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE QueryMode;
+ EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE SetMode;
+ EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT Blt;
+ EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;
+}
+EFI_GRAPHICS_OUTPUT_PROTOCOL;
+
diff --git a/api/efi/image.h b/api/efi/image.h
new file mode 100644
index 0000000..ef16bce
--- /dev/null
+++ b/api/efi/image.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include <efi/types.h>
+#include <efi/tables.h>
+
+#define EFI_LOADED_IMAGE_PROTOCOL_GUID \
+{0x5B1B31A1,0x9562,0x11d2, \
+ {0x8E,0x3F,0x00,0xA0,0xC9,0x69,0x72,0x3B}}
+
+#define EFI_LOADED_IMAGE_PROTOCOL_REVISION 0x1000
+
+typedef struct EFI_LOADED_IMAGE_PROTOCOL EFI_LOADED_IMAGE_PROTOCOL;
+
+typedef EFI_STATUS (EFIAPI *EFI_IMAGE_ENTRY_POINT)(
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable);
+
+struct EFI_LOADED_IMAGE_PROTOCOL
+{
+ UINT32 Revision;
+ EFI_HANDLE ParentHandle;
+ EFI_SYSTEM_TABLE *SystemTable;
+ EFI_HANDLE DeviceHandle;
+ VOID *FilePath;
+ VOID *Reserved;
+ UINT32 LoadOptionsSize;
+ VOID *LoadOptions;
+ VOID *ImageBase;
+ UINT64 ImageSize;
+ EFI_MEMORY_TYPE ImageCodeType;
+ EFI_MEMORY_TYPE ImageDataType;
+ EFIX_UNUSED_FUNC Unload;
+};
+
diff --git a/api/efi/media.h b/api/efi/media.h
new file mode 100644
index 0000000..78dbf63
--- /dev/null
+++ b/api/efi/media.h
@@ -0,0 +1,148 @@
+#pragma once
+
+#include <efi/types.h>
+
+#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
+{0x0964e5b22,0x6459,0x11d2,\
+ {0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b}}
+
+typedef struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL;
+typedef struct EFI_FILE_PROTOCOL EFI_FILE_PROTOCOL;
+
+typedef EFI_STATUS (EFIAPI *EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME)(
+ IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
+ OUT EFI_FILE_PROTOCOL **Root);
+
+struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
+{
+ UINT64 Revision;
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME OpenVolume;
+};
+
+typedef struct {
+ EFI_EVENT Event;
+ EFI_STATUS Status;
+ UINTN BufferSize;
+ VOID *Buffer;
+} EFI_FILE_IO_TOKEN;
+
+#define EFI_FILE_PROTOCOL_REVISION 0x00010000
+#define EFI_FILE_PROTOCOL_REVISION2 0x00020000
+#define EFI_FILE_PROTOCOL_LATEST_REVISION EFI_FILE_PROTOCOL_REVISION2
+#define EFI_FILE_MODE_READ 0x0000000000000001
+#define EFI_FILE_MODE_WRITE 0x0000000000000002
+#define EFI_FILE_MODE_CREATE 0x8000000000000000
+#define EFI_FILE_READ_ONLY 0x0000000000000001
+#define EFI_FILE_HIDDEN 0x0000000000000002
+#define EFI_FILE_SYSTEM 0x0000000000000004
+#define EFI_FILE_RESERVED 0x0000000000000008
+#define EFI_FILE_DIRECTORY 0x0000000000000010
+#define EFI_FILE_ARCHIVE 0x0000000000000020
+#define EFI_FILE_VALID_ATTR 0x0000000000000037
+
+typedef EFI_STATUS (EFIAPI *EFI_FILE_OPEN)(
+ IN EFI_FILE_PROTOCOL *This,
+ OUT EFI_FILE_PROTOCOL **NewHandle,
+ IN CHAR16 *FileName,
+ IN UINT64 OpenMode,
+ IN UINT64 Attributes);
+
+typedef EFI_STATUS (EFIAPI *EFI_FILE_CLOSE) (IN EFI_FILE_PROTOCOL *This);
+
+typedef EFI_STATUS (EFIAPI *EFI_FILE_READ) (
+ IN EFI_FILE_PROTOCOL *This,
+ IN OUT UINTN *BufferSize,
+ OUT VOID *Buffer);
+
+#define EFI_FILE_INFO_ID \
+{0x09576e92,0x6d3f,0x11d2,\
+ {0x8e39,0x00,0xa0,0xc9,0x69,0x72,0x3b}}
+
+#define EFI_FILE_READ_ONLY 0x0000000000000001
+#define EFI_FILE_HIDDEN 0x0000000000000002
+#define EFI_FILE_SYSTEM 0x0000000000000004
+#define EFI_FILE_RESERVED 0x0000000000000008
+#define EFI_FILE_DIRECTORY 0x0000000000000010
+#define EFI_FILE_ARCHIVE 0x0000000000000020
+#define EFI_FILE_VALID_ATTR 0x0000000000000037
+
+typedef EFI_STATUS (EFIAPI *EFI_FILE_SET_POSITION)(
+ IN EFI_FILE_PROTOCOL *This,
+ IN UINT64 Position);
+
+typedef EFI_STATUS (EFIAPI *EFI_FILE_GET_POSITION)(
+ IN EFI_FILE_PROTOCOL *This,
+ OUT UINT64 *Position);
+
+typedef struct
+{
+ UINT64 Size;
+ UINT64 FileSize;
+ UINT64 PhysicalSize;
+ EFI_TIME CreateTime ;
+ EFI_TIME LastAccessTime;
+ EFI_TIME ModificationTime;
+ UINT64 Attribute;
+#ifdef __cplusplus
+ CHAR16 *FileName;
+#else
+ CHAR16 FileName[];
+#endif
+}
+EFI_FILE_INFO;
+
+#define EFI_FILE_SYSTEM_INFO_ID \
+ {0x09576e93,0x6d3f,0x11d2,0x8e39,\
+ {0x00,0xa0,0xc9,0x69,0x72,0x3b}}
+
+typedef struct
+{
+ UINT64 Size;
+ BOOLEAN ReadOnly;
+ UINT64 VolumeSize;
+ UINT64 FreeSpace;
+ UINT32 BlockSize;
+#ifdef __cplusplus
+ CHAR16 *VolumeLabel;
+#else
+ CHAR16 VolumeLabel[];
+#endif
+}
+EFI_FILE_SYSTEM_INFO;
+
+#define EFI_FILE_SYSTEM_VOLUME_LABEL_ID \
+{0xdb47d7d3,0xfe81,0x11d3,0x9a35,\
+ {0x00,0x90,0x27,0x3f,0xC1,0x4d}}
+
+typedef struct
+{
+ CHAR16 VolumeLabel[1];
+}
+EFI_FILE_SYSTEM_VOLUME_LABEL;
+
+typedef EFI_STATUS (EFIAPI *EFI_FILE_GET_INFO)(
+ IN EFI_FILE_PROTOCOL *This,
+ IN EFI_GUID *InformationType,
+ IN OUT UINTN *BufferSize,
+ OUT VOID *Buffer);
+
+struct EFI_FILE_PROTOCOL
+{
+ UINT64 Revision;
+ EFI_FILE_OPEN Open;
+ EFI_FILE_CLOSE Close;
+ EFIX_UNUSED_FUNC Delete;
+ EFI_FILE_READ Read;
+ EFIX_UNUSED_FUNC Write;
+ EFI_FILE_GET_POSITION GetPosition;
+ EFI_FILE_SET_POSITION SetPosition;
+ EFI_FILE_GET_INFO GetInfo;
+ EFIX_UNUSED_FUNC SetInfo;
+ EFIX_UNUSED_FUNC Flush;
+ EFIX_UNUSED_FUNC OpenEx;
+ EFIX_UNUSED_FUNC ReadEx;
+ EFIX_UNUSED_FUNC WriteEx;
+ EFIX_UNUSED_FUNC FlushEx;
+};
+
diff --git a/api/efi/services.h b/api/efi/services.h
new file mode 100644
index 0000000..860b4e7
--- /dev/null
+++ b/api/efi/services.h
@@ -0,0 +1,109 @@
+#pragma once
+
+#include <efi/types.h>
+
+typedef EFI_STATUS (EFIAPI *EFI_ALLOCATE_PAGES)(
+ IN EFI_ALLOCATE_TYPE Type,
+ IN EFI_MEMORY_TYPE MemoryType,
+ IN UINTN Pages,
+ IN OUT EFI_PHYSICAL_ADDRESS *Memory);
+
+typedef EFI_STATUS (EFIAPI *EFI_FREE_PAGES)(
+ IN EFI_PHYSICAL_ADDRESS Memory,
+ IN UINTN Pages);
+
+typedef EFI_STATUS (EFIAPI *EFI_GET_MEMORY_MAP)(
+ IN OUT UINTN *MemoryMapSize,
+ IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
+ OUT UINTN *MapKey,
+ OUT UINTN *DescriptorSize,
+ OUT UINT32 *DescriptorVersion);
+
+typedef EFI_STATUS (EFIAPI *EFI_ALLOCATE_POOL)(
+ IN EFI_MEMORY_TYPE PoolType,
+ IN UINTN Size,
+ OUT VOID **Buffer);
+
+typedef EFI_STATUS (EFIAPI *EFI_FREE_POOL)(IN VOID *Buffer);
+
+typedef EFI_STATUS (EFIAPI *EFI_LOCATE_HANDLE)(
+ IN EFI_LOCATE_SEARCH_TYPE SearchType,
+ IN EFI_GUID *Protocol OPTIONAL,
+ IN VOID *SearchKey OPTIONAL,
+ IN OUT UINTN *BufferSize,
+ OUT EFI_HANDLE *Buffer);
+
+#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001
+#define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002
+#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004
+#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
+#define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
+#define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020
+
+typedef EFI_STATUS (EFIAPI *EFI_OPEN_PROTOCOL)(
+ IN EFI_HANDLE Handle,
+ IN EFI_GUID *Protocol,
+ OUT VOID **Interface OPTIONAL,
+ IN EFI_HANDLE AgentHandle,
+ IN EFI_HANDLE ControllerHandle,
+ IN UINT32 Attributes);
+
+typedef EFI_STATUS (EFIAPI *EFI_CLOSE_PROTOCOL)(
+ IN EFI_HANDLE Handle,
+ IN EFI_GUID *Protocol,
+ IN EFI_HANDLE AgentHandle,
+ IN EFI_HANDLE ControllerHandle);
+
+typedef EFI_STATUS (EFIAPI *EFI_PROTOCOLS_PER_HANDLE)(
+ IN EFI_HANDLE Handle,
+ OUT EFI_GUID ***ProtocolBuffer,
+ OUT UINTN *ProtocolBufferCount);
+
+typedef EFI_STATUS (EFIAPI *EFI_LOCATE_HANDLE_BUFFER)(
+ IN EFI_LOCATE_SEARCH_TYPE SearchType,
+ IN EFI_GUID *Protocol OPTIONAL,
+ IN VOID *SearchKey OPTIONAL,
+ IN OUT UINTN *NoHandles,
+ OUT EFI_HANDLE **Buffer);
+
+typedef EFI_STATUS (EFIAPI *EFI_LOCATE_PROTOCOL)(
+ IN EFI_GUID *Protocol,
+ IN VOID *Registration OPTIONAL,
+ OUT VOID **Interface);
+
+typedef EFI_STATUS (EFIAPI *EFI_EXIT)(
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_STATUS ExitStatus,
+ IN UINTN ExitDataSize,
+ IN CHAR16 *ExitData OPTIONAL);
+
+typedef EFI_STATUS (EFIAPI *EFI_EXIT_BOOT_SERVICES)(
+ IN EFI_HANDLE ImageHandle,
+ IN UINTN MapKey);
+
+typedef EFI_STATUS (EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT)(
+ OUT UINT64 *Count);
+
+typedef EFI_STATUS (EFIAPI *EFI_SET_WATCHDOG_TIMER)(
+ IN UINTN Timeout,
+ IN UINT64 WatchdogCode,
+ IN UINTN DataSize,
+ IN CHAR16 *WatchdogData OPTIONAL);
+
+typedef EFI_STATUS (EFIAPI *EFI_STALL)(IN UINTN Microseconds);
+
+typedef VOID (EFIAPI *EFI_COPY_MEM)(
+ IN VOID *Destination,
+ IN VOID *Source,
+ IN UINTN Length);
+
+typedef VOID (EFIAPI *EFI_SET_MEM)(
+ IN VOID *Buffer,
+ IN UINTN Size,
+ IN UINT8 Value);
+
+typedef EFI_STATUS (EFIAPI *EFI_CALCULATE_CRC32)(
+ IN VOID *Data,
+ IN UINTN DataSize,
+ OUT UINT32 *Crc32);
+
diff --git a/api/efi/shell.h b/api/efi/shell.h
new file mode 100644
index 0000000..9ed2e0d
--- /dev/null
+++ b/api/efi/shell.h
@@ -0,0 +1,17 @@
+#include <efi/types.h>
+#include <efi/media.h>
+
+#define EFI_SHELL_PARAMETERS_PROTOCOL_GUID {0x752f3136, 0x4e16, 0x4fdc, {0xa2, 0x2a, 0xe5, 0xf4, 0x68, 0x12, 0xf4, 0xca}}
+
+typedef VOID *SHELL_FILE_HANDLE;
+
+typedef struct
+{
+ CHAR16 **Argv;
+ UINTN Argc;
+ SHELL_FILE_HANDLE StdIn;
+ SHELL_FILE_HANDLE StdOut;
+ SHELL_FILE_HANDLE StdErr;
+}
+EFI_SHELL_PARAMETERS_PROTOCOL;
+
diff --git a/api/efi/tables.h b/api/efi/tables.h
new file mode 100644
index 0000000..e7c312a
--- /dev/null
+++ b/api/efi/tables.h
@@ -0,0 +1,110 @@
+#pragma once
+
+#include <efi/types.h>
+#include <efi/services.h>
+#include <efi/console.h>
+#include <efi/image.h>
+
+#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
+#define EFI_SYSTEM_TABLE_REVISION EFI_2_8_SYSTEM_TABLE_REVISION
+#define EFI_2_80_SYSTEM_TABLE_REVISION ((2<<16) | (80))
+#define EFI_2_70_SYSTEM_TABLE_REVISION ((2<<16) | (70))
+#define EFI_2_60_SYSTEM_TABLE_REVISION ((2<<16) | (60))
+#define EFI_2_50_SYSTEM_TABLE_REVISION ((2<<16) | (50))
+#define EFI_2_40_SYSTEM_TABLE_REVISION ((2<<16) | (40))
+#define EFI_2_31_SYSTEM_TABLE_REVISION ((2<<16) | (31))
+#define EFI_2_30_SYSTEM_TABLE_REVISION ((2<<16) | (30))
+#define EFI_2_20_SYSTEM_TABLE_REVISION ((2<<16) | (20))
+#define EFI_2_10_SYSTEM_TABLE_REVISION ((2<<16) | (10))
+#define EFI_2_00_SYSTEM_TABLE_REVISION ((2<<16) | (00))
+#define EFI_1_10_SYSTEM_TABLE_REVISION ((1<<16) | (10))
+#define EFI_1_02_SYSTEM_TABLE_REVISION ((1<<16) | (02))
+
+#define EFI_SPECIFICATION_VERSION EFI_SYSTEM_TABLE_REVISION
+
+typedef struct
+{
+ EFI_GUID VendorGuid;
+ VOID *VendorTable;
+}
+EFI_CONFIGURATION_TABLE;
+
+struct EFI_SYSTEM_TABLE
+{
+ EFI_TABLE_HEADER Hdr;
+ CHAR16 *FirmwareVendor;
+ UINT32 FirmwareRevision;
+ EFI_HANDLE ConsoleInHandle;
+ VOID *ConIn;
+ EFI_HANDLE ConsoleOutHandle;
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
+ EFI_HANDLE StandardErrorHandle;
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr;
+ VOID *RuntimeServices;
+ EFI_BOOT_SERVICES *BootServices;
+ UINTN NumberOfTableEntries;
+ EFI_CONFIGURATION_TABLE *ConfigurationTable;
+};
+
+#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
+#define EFI_BOOT_SERVICES_REVISION EFI_SPECIFICATION_VERSION
+
+struct EFI_BOOT_SERVICES
+{
+ EFI_TABLE_HEADER Hdr;
+
+ EFIX_UNUSED_FUNC RaiseTPL;
+ EFIX_UNUSED_FUNC RestoreTPL;
+
+ EFI_ALLOCATE_PAGES AllocatePages;
+ EFI_FREE_PAGES FreePages;
+ EFI_GET_MEMORY_MAP GetMemoryMap;
+ EFI_ALLOCATE_POOL AllocatePool;
+ EFI_FREE_POOL FreePool;
+
+ EFIX_UNUSED_FUNC CreateEvent;
+ EFIX_UNUSED_FUNC SetTimer;
+ EFIX_UNUSED_FUNC WaitForEvent;
+ EFIX_UNUSED_FUNC SignalEvent;
+ EFIX_UNUSED_FUNC CloseEvent;
+ EFIX_UNUSED_FUNC CheckEvent;
+
+ EFIX_UNUSED_FUNC InstallProtocolInterface;
+ EFIX_UNUSED_FUNC ReinstallProtocolInterface;
+ EFIX_UNUSED_FUNC UninstallProtocolInterface;
+ EFIX_UNUSED_FUNC HandleProtocol;
+ VOID* Reserved;
+ EFIX_UNUSED_FUNC RegisterProtocolNotify;
+ EFI_LOCATE_HANDLE LocateHandle;
+ EFIX_UNUSED_FUNC LocateDevicePath;
+ EFIX_UNUSED_FUNC InstallConfigurationTable;
+
+ EFIX_UNUSED_FUNC LoadImage;
+ EFIX_UNUSED_FUNC StartImage;
+ EFI_EXIT Exit;
+ EFIX_UNUSED_FUNC UnloadImage;
+ EFI_EXIT_BOOT_SERVICES ExitBootServices;
+
+ EFI_GET_NEXT_MONOTONIC_COUNT GetNextMonotonicCount;
+ EFI_STALL Stall;
+ EFI_SET_WATCHDOG_TIMER SetWatchdogTimer;
+
+ EFIX_UNUSED_FUNC ConnectController;
+ EFIX_UNUSED_FUNC DisconnectController;
+
+ EFI_OPEN_PROTOCOL OpenProtocol;
+ EFI_CLOSE_PROTOCOL CloseProtocol;
+ EFIX_UNUSED_FUNC OpenProtocolInformation;
+
+ EFI_PROTOCOLS_PER_HANDLE ProtocolsPerHandle;
+ EFI_LOCATE_HANDLE_BUFFER LocateHandleBuffer;
+ EFI_LOCATE_PROTOCOL LocateProtocol;
+ EFIX_UNUSED_FUNC InstallMultipleProtocolInterfaces;
+ EFIX_UNUSED_FUNC UninstallMultipleProtocolInterfaces;
+
+ EFI_CALCULATE_CRC32 CalculateCrc32;
+ EFI_COPY_MEM CopyMem;
+ EFI_SET_MEM SetMem;
+ EFIX_UNUSED_FUNC CreateEventEx;
+};
+
diff --git a/api/efi/types.h b/api/efi/types.h
new file mode 100644
index 0000000..c7ea60d
--- /dev/null
+++ b/api/efi/types.h
@@ -0,0 +1,171 @@
+#pragma once
+
+#include <efi/defs.h>
+
+#include <stdint.h>
+#include <stddef.h>
+
+typedef uint8_t BOOLEAN;
+
+#if !defined(TRUE)
+# define TRUE ((BOOLEAN) 1)
+#endif
+
+#if !defined(FALSE)
+# define FALSE ((BOOLEAN) 0)
+#endif
+
+#if defined(__x86_64__)
+# if defined(__LP64__)
+typedef long INTN;
+typedef unsigned long UINTN;
+#define INTN_MIN (1UL<<63)
+#define UINTN_MIN (0UL)
+# elif defined(_WIN64)
+typedef long long INTN;
+typedef unsigned long long UINTN;
+#define INTN_MIN (1ULL<<63)
+#define UINTN_MIN (0ULL)
+# endif
+#else
+typedef int INTN;
+typedef unsigned int UINTN;
+#define INTN_MIN (1U<<31)
+#define UINTN_MIN (0)
+#endif
+#define INTN_MAX (~INTN_MIN)
+#define UINTN_MAX (~UINTN_MIN)
+
+typedef int8_t INT8;
+typedef uint8_t UINT8;
+typedef int16_t INT16;
+typedef uint16_t UINT16;
+typedef int32_t INT32;
+typedef uint32_t UINT32;
+typedef int64_t INT64;
+typedef uint64_t UINT64;
+
+typedef unsigned char CHAR8;
+typedef unsigned short CHAR16;
+
+typedef void VOID;
+
+typedef UINT64 EFI_PHYSICAL_ADDRESS;
+typedef UINT64 EFI_VIRTUAL_ADDRESS;
+
+typedef struct
+{
+ UINT32 Guid1;
+ UINT16 Guid2;
+ UINT16 Guid3;
+ UINT8 Guid4[8];
+}
+EFI_GUID;
+
+typedef UINTN EFI_STATUS;
+typedef VOID * EFI_HANDLE;
+typedef VOID * EFI_EVENT;
+
+typedef struct
+{
+ UINT64 Signature;
+ UINT32 Revision;
+ UINT32 HeaderSize;
+ UINT32 CRC32;
+ UINT32 Reserved;
+}
+EFI_TABLE_HEADER;
+
+typedef enum
+{
+ AllocateAnyPages,
+ AllocateMaxAddress,
+ AllocateAddress,
+ MaxAllocateType
+}
+EFI_ALLOCATE_TYPE;
+
+typedef enum
+{
+ EfiReservedMemoryType,
+ EfiLoaderCode,
+ EfiLoaderData,
+ EfiBootServicesCode,
+ EfiBootServicesData,
+ EfiRuntimeServicesCode,
+ EfiRuntimeServicesData,
+ EfiConventionalMemory,
+ EfiUnusableMemory,
+ EfiACPIReclaimMemory,
+ EfiACPIMemoryNVS,
+ EfiMemoryMappedIO,
+ EfiMemoryMappedIOPortSpace,
+ EfiPalCode,
+ EfiPersistentMemory,
+ EfiMaxMemoryType,
+ EfixMinOemMemoryType = 0x70000000,
+ EfixMaxOemMemoryType = 0x7fffffff,
+ EfixMinOsMemoryType = INT32_MIN,
+ EfixMaxOsMemoryType = -1,
+}
+EFI_MEMORY_TYPE;
+
+#define EFIX_OEM_MEMORY_TYPE(x) (EfixMinOemMemoryType|(UINT32)x)
+#define EFIX_OS_MEMORY_TYPE(x) (EfixMinOsMemoryType|(UINT32)x)
+
+#define EFI_MEMORY_UC 0x0000000000000001
+#define EFI_MEMORY_WC 0x0000000000000002
+#define EFI_MEMORY_WT 0x0000000000000004
+#define EFI_MEMORY_WB 0x0000000000000008
+#define EFI_MEMORY_UCE 0x0000000000000010
+#define EFI_MEMORY_WP 0x0000000000001000
+#define EFI_MEMORY_RP 0x0000000000002000
+#define EFI_MEMORY_XP 0x0000000000004000
+#define EFI_MEMORY_NV 0x0000000000008000
+#define EFI_MEMORY_MORE_RELIABLE 0x0000000000010000
+#define EFI_MEMORY_RO 0x0000000000020000
+#define EFI_MEMORY_SP 0x0000000000040000
+#define EFI_MEMORY_CPU_CRYPTO 0x0000000000080000
+#define EFI_MEMORY_RUNTIME 0x8000000000000000
+
+#define EFI_MEMORY_DESCRIPTOR_VERSION 1
+
+typedef struct
+{
+ UINT32 Type;
+ EFI_PHYSICAL_ADDRESS PhysicalStart;
+ EFI_VIRTUAL_ADDRESS VirtualStart;
+ UINT64 NumberOfPages;
+ UINT64 Attribute;
+}
+EFI_MEMORY_DESCRIPTOR;
+
+typedef enum
+{
+ AllHandles,
+ ByRegisterNotify,
+ ByProtocol
+}
+EFI_LOCATE_SEARCH_TYPE;
+
+typedef struct
+{
+ UINT16 Year;
+ UINT8 Month;
+ UINT8 Day;
+ UINT8 Hour;
+ UINT8 Minute;
+ UINT8 Second;
+ UINT8 Pad1;
+ UINT32 Nanosecond;
+ UINT16 TimeZone;
+ UINT8 Daylight;
+ UINT8 Pad2;
+}
+EFI_TIME;
+
+typedef VOID (EFIAPI *EFIX_UNUSED_FUNC)(VOID);
+
+typedef struct EFI_SYSTEM_TABLE EFI_SYSTEM_TABLE;
+typedef struct EFI_BOOT_SERVICES EFI_BOOT_SERVICES;
+typedef struct EFI_GRAPHICS_OUTPUT_PROTOCOL EFI_GRAPHICS_OUTPUT_PROTOCOL;
diff --git a/api/loader/efi/shim.h b/api/loader/efi/shim.h
index dcdf077..b91d9fd 100644
--- a/api/loader/efi/shim.h
+++ b/api/loader/efi/shim.h
@@ -2,7 +2,9 @@
#include <loader/shim.h>
-#include <efi.h>
+#include <efi/defs.h>
+#include <efi/media.h>
+#include <efi/tables.h>
#ifdef __ELF__
#define EFIEXPORT __attribute__((visibility("default")))
diff --git a/efi.mk b/efi.mk
index 60cf1d6..79787f2 100644
--- a/efi.mk
+++ b/efi.mk
@@ -7,20 +7,6 @@ ifeq ($(ARCH),i686)
GNUEFIARCH := ia32
endif
-ifndef EFIAPIDIR
-EFIAPIDIR := /usr/local/include/efi
-endif
-
-ifndef EFILIBDIR
-EFILIBDIR := /usr/local/$(TARGET)/lib
-endif
-
-EFICRT := $(EFILIBDIR)/crt0-efi-$(GNUEFIARCH).o
-EFILDSCRIPT := $(EFILIBDIR)/elf_$(GNUEFIARCH)_efi.lds
-
-CPPFLAGS += -I$(EFIAPIDIR) -I$(EFIAPIDIR)/protocol -I$(EFIAPIDIR)/$(GNUEFIARCH) \
- -DGNU_EFI_USE_MS_ABI -DEFI_CALL_WRAPPER -DEFI_DEBUG
-
%.efi:
$(CC.info)
@$(CC) $(LDFLAGS) -o $@ $^
diff --git a/gnu-efi-code b/gnu-efi-code
deleted file mode 160000
-Subproject af773c779de0a9c271022f97723514bb9e2ba77
diff --git a/kc/boot/kc_main.c b/kc/boot/kc_main.c
index cb8eb7a..650b342 100644
--- a/kc/boot/kc_main.c
+++ b/kc/boot/kc_main.c
@@ -1,5 +1,9 @@
#include "loader_paging.h"
+#include <efi/graphics.h>
+#include <efi/acpi.h>
+#include <efi/error.h>
+
#include <loader/efi/shim.h>
#include <kernel/entry.h>
#include <kernel/memory/range.h>
@@ -39,7 +43,7 @@ static struct efi_loader_interface *loader_interface;
static struct efi_boot_data boot_data;
static EFI_BOOT_SERVICES *e_bs = NULL;
static uint64_t *system_page_map = NULL;
-static SIMPLE_TEXT_OUTPUT_INTERFACE *eto;
+static EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *eto;
static struct kc_boot_data *k_boot_data;
static void *object_space_base;
@@ -232,7 +236,7 @@ static void collect_video_data(void)
static void collect_acpi_data(void)
{
- EFI_GUID acpi2_guid = ACPI_20_TABLE_GUID;
+ EFI_GUID acpi2_guid = EFI_ACPI_20_TABLE_GUID;
EFI_GUID acpi_guid = ACPI_TABLE_GUID;
UINTN config_table_count =
diff --git a/loader/main_efi.c b/loader/main_efi.c
index 866019e..131c7e4 100644
--- a/loader/main_efi.c
+++ b/loader/main_efi.c
@@ -2,8 +2,8 @@
#include <kernel/entry.h>
-#include <efi.h>
-#include <efidebug.h>
+#include <efi/types.h>
+#include <efi/error.h>
#include "elf.h"
#include "kstdio.h"
@@ -127,7 +127,7 @@ int kfputc(int c, FILE *f)
if (loader_interface.system_table)
{
- EFI_SIMPLE_TEXT_OUT_PROTOCOL *out = gST->ConOut;
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *out = gST->ConOut;
*linebuf_ptr++ = c;
if (((linebuf_ptr - linebuf) == EFI_PAGE_SIZE - 2) || (c == L'\n'))
{