diff options
| -rw-r--r-- | api/efi/acpi.h | 10 | ||||
| -rw-r--r-- | api/efi/console.h | 53 | ||||
| -rw-r--r-- | api/efi/defs.h | 20 | ||||
| -rw-r--r-- | api/efi/error.h | 13 | ||||
| -rw-r--r-- | api/efi/graphics.h | 100 | ||||
| -rw-r--r-- | api/efi/image.h | 34 | ||||
| -rw-r--r-- | api/efi/media.h | 148 | ||||
| -rw-r--r-- | api/efi/services.h | 109 | ||||
| -rw-r--r-- | api/efi/shell.h | 17 | ||||
| -rw-r--r-- | api/efi/tables.h | 110 | ||||
| -rw-r--r-- | api/efi/types.h | 171 | ||||
| -rw-r--r-- | api/loader/efi/shim.h | 4 | ||||
| -rw-r--r-- | efi.mk | 10 | ||||
| m--------- | gnu-efi-code | 0 | ||||
| -rw-r--r-- | kc/boot/kc_main.c | 8 | ||||
| -rw-r--r-- | loader/main_efi.c | 5 |
16 files changed, 797 insertions, 15 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"))) @@ -7,16 +7,6 @@ ifeq ($(ARCH),i686) GNUEFIARCH := ia32 endif -ifndef EFIAPIDIR -EFIAPIDIR := /usr/include/efi -endif - -ifndef EFILIBDIR -EFILIBDIR := /usr/local/$(TARGET)/lib -endif - -CPPFLAGS += -I$(EFIAPIDIR) -I$(EFIAPIDIR)/protocol -I$(EFIAPIDIR)/$(GNUEFIARCH) \ - -DEFI_CALL_WRAPPER -DGNU_EFI_USE_MS_ABI %.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 fe670b0..ca4ba8b 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 1def97a..131c7e4 100644 --- a/loader/main_efi.c +++ b/loader/main_efi.c @@ -2,7 +2,8 @@ #include <kernel/entry.h> -#include <efi.h> +#include <efi/types.h> +#include <efi/error.h> #include "elf.h" #include "kstdio.h" @@ -126,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')) { |
