diff --git a/BOOT/ENVIRON/APP/BOOTMGR/EFI/efientry.c b/BOOT/ENVIRON/APP/BOOTMGR/EFI/efientry.c new file mode 100644 index 0000000..47aece5 --- /dev/null +++ b/BOOT/ENVIRON/APP/BOOTMGR/EFI/efientry.c @@ -0,0 +1,60 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + entry.c + +Abstract: + + Boot manager entry point on EFI systems. + +--*/ + +#include "bootmgr.h" + +EFI_STATUS +EFIAPI +EfiEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) + +/*++ + +Routine Description: + + Boot manager entry point from EFI firmware. + +Arguments: + + ImageHandle - Handle for the boot manager image. + + SystemTable - Pointer to the EFI system table. + +Return Value: + + EFI_SUCCESS if successful. + EFI_INVALID_PARAMEER if input parameter structure creation fails. + Any other value defined in efierr.h. + +--*/ + +{ + PBOOT_APPLICATION_PARAMETERS InputParameters; + + // + // Create firmware-independent input structure from EFI parameters. + // + InputParameters = EfiInitCreateInputParameters(ImageHandle, SystemTable); + if (InputParameters == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Transfer control to the firmware-independent boot manager. + // + return EfiGetEfiStatusCode(BmMain(InputParameters)); +} diff --git a/BOOT/ENVIRON/APP/BOOTMGR/bootmgr.c b/BOOT/ENVIRON/APP/BOOTMGR/bootmgr.c new file mode 100644 index 0000000..c22b296 --- /dev/null +++ b/BOOT/ENVIRON/APP/BOOTMGR/bootmgr.c @@ -0,0 +1,44 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + bootmgr.c + +Abstract: + + Main functions of the boot manager. + +--*/ + +#include "bootmgr.h" + +NTSTATUS +BmMain ( + IN PBOOT_APPLICATION_PARAMETERS Parameters + ) + +/*++ + +Routine Description: + + Firmware-independent boot manager entry point. + +Arguments: + + Parameters - Input parameters for the boot manager. + +Return Value: + + Error code on failure. + Does not return on success, as control is transferred to the OS loader. + +--*/ + +{ + /* TODO: Implement BmMain() */ + + return STATUS_SUCCESS; +} diff --git a/BOOT/ENVIRON/INC/AMD64/efibind.h b/BOOT/ENVIRON/INC/AMD64/efibind.h new file mode 100644 index 0000000..d9ffdeb --- /dev/null +++ b/BOOT/ENVIRON/INC/AMD64/efibind.h @@ -0,0 +1,76 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + efibind.h + +Abstract: + + Provides definitions specific to AMD64 EFI systems. + +--*/ + +#if defined(_MSC_EXTENSIONS) + typedef unsigned __int64 uint64_t; + typedef __int64 int64_t; + typedef unsigned __int32 uint32_t; + typedef __int32 int32_t; + typedef unsigned __int16 uint16_t; + typedef __int16 int16_t; + typedef unsigned __int8 uint8_t; + typedef __int8 int8_t; +#elif defined(UNIX_LP64) + typedef unsigned long uint64_t; + typedef long int64_t; + typedef unsigned int uint32_t; + typedef int int32_t; + typedef unsigned short uint16_t; + typedef short int16_t; + typedef unsigned char uint8_t; + typedef char int8_t; +#else + typedef unsigned long long uint64_t; + typedef long long int64_t; + typedef unsigned int uint32_t; + typedef int int32_t; + typedef unsigned short uint16_t; + typedef short int16_t; + typedef unsigned char uint8_t; + typedef char int8_t; +#endif + +typedef uint64_t UINT64; +typedef int64_t INT64; +typedef uint32_t UINT32; +typedef int32_t INT32; +typedef uint16_t UINT16; +typedef int16_t INT16; +typedef uint8_t UINT8; +typedef int8_t INT8; + +typedef int64_t INTN; +typedef uint64_t UINTN; + +#define EFI_ERROR_MASK 0x8000000000000000 +#define EFI_ERROR_MASK_OEM 0xc000000000000000 +#define EFIERR(e) (EFI_ERROR_MASK | e) +#define EFIERR_OEM(e) (EFI_ERROR_MASK_OEM | e) + +#ifndef EFIAPI +#if defined(_MSC_EXTENSIONS) + #define EFIAPI __cdecl +#else + #define EFIAPI __attribute__((ms_abi)) +#endif +#endif + +#define VOLATILE volatile + +#if defined(__GNUC__) || defined(_MSC_EXTENSIONS) +#define INTERFACE_DECL(n) struct n +#else +#define INTERFACE_DECL(n) typedef struct n +#endif diff --git a/BOOT/ENVIRON/INC/efi.h b/BOOT/ENVIRON/INC/efi.h new file mode 100644 index 0000000..b2fd08c --- /dev/null +++ b/BOOT/ENVIRON/INC/efi.h @@ -0,0 +1,32 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + efi.h + +Abstract: + + Provides EFI header files. + +--*/ + +#ifndef _EFI_H +#define _EFI_H + +#if defined(__x86_64__) +#include "AMD64/efibind.h" +#else +#error Unsupported architecture +#endif + +#include "efidef.h" +#include "efidevp.h" +#include "efiprot.h" +#include "eficon.h" +#include "efiapi.h" +#include "efierr.h" + +#endif diff --git a/BOOT/ENVIRON/INC/efiapi.h b/BOOT/ENVIRON/INC/efiapi.h new file mode 100644 index 0000000..629447e --- /dev/null +++ b/BOOT/ENVIRON/INC/efiapi.h @@ -0,0 +1,236 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + efiapi.h + +Abstract: + + Provides EFI API definitions. + +--*/ + +#ifndef _EFIAPI_H +#define _EFIAPI_H + +#define EFI_SPECIFICATION_MAJOR_REVISION 1 +#define EFI_SPECIFICATION_MINOR_REVISION 02 +#define EFI_SPECIFICATION_VERSION ((EFI_SPECIFICATION_MAJOR_REVISION << 16) || EFI_SPECIFICATION_MINOR_REVISION) + +INTERFACE_DECL(_EFI_SYSTEM_TABLE); + +/* + * Loaded image protocol definitions. + */ + +typedef +EFI_STATUS +(EFIAPI *EFI_IMAGE_UNLOAD) ( + IN EFI_HANDLE ImageHandle + ); + +#define EFI_LOADED_IMAGE_PROTOCOL_GUID \ + { 0x5b1b31a1, 0x9562, 0x11d2, { 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } } +#define LOADED_IMAGE_PROTOCOL EFI_LOADED_IMAGE_PROTOCOL_GUID + +#define EFI_IMAGE_INFORMATION_REVISION 0x1000 + +typedef struct { + UINT32 Revision; + EFI_HANDLE ParentHandle; + struct _EFI_SYSTEM_TABLE *SystemTable; + + EFI_HANDLE DeviceHandle; + EFI_DEVICE_PATH *FilePath; + VOID *Reserved; + + UINT32 LoadOptionsSize; + VOID *LoadOptions; + + VOID *ImageBase; + UINT64 ImageSize; + EFI_MEMORY_TYPE ImageCodeType; + EFI_MEMORY_TYPE ImageDataType; + + EFI_IMAGE_UNLOAD Unload; +} EFI_LOADED_IMAGE; + +/* + * EFI table header. + */ + +typedef struct _EFI_TABLE_HEADER { + UINT64 Signature; + UINT32 Revision; + UINT32 HeaderSize; + UINT32 CRC32; + UINT32 Reserved; +} EFI_TABLE_HEADER; + +/* + * EFI runtime services table definitions. + */ + +#define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552 +#define EFI_RUNTIME_SERVICES_REVISION EFI_SPECIFICATION_VERSION + +typedef struct { + EFI_TABLE_HEADER Hdr; + + EFI_HANDLE GetTime; + EFI_HANDLE SetTime; + EFI_HANDLE GetWakeupTime; + EFI_HANDLE SetWakeupTime; + + EFI_HANDLE SetVirtualAddressMap; + EFI_HANDLE ConvertPointer; + + EFI_HANDLE GetVariable; + EFI_HANDLE GetNextVariableName; + EFI_HANDLE SetVariable; + + EFI_HANDLE GetNextHighMonotonicCount; + EFI_HANDLE ResetSystem; + + EFI_HANDLE UpdateCapsule; + EFI_HANDLE QueryCapsuleCapabilities; + EFI_HANDLE QueryVariableInfo; +} EFI_RUNTIME_SERVICES; + +/* + * EFI boot services table definitions. + */ + +#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42 +#define EFI_BOOT_SERVICES_REVISION EFI_SPECIFICATION_VERSION + +typedef +EFI_STATUS +(EFIAPI *EFI_HANDLE_PROTOCOL) ( + IN EFI_HANDLE Handle, + IN EFI_GUID *Protocol, + OUT VOID **Interface + ); + +typedef struct _EFI_BOOT_SERVICES { + EFI_TABLE_HEADER Hdr; + + EFI_HANDLE RaiseTPL; + EFI_HANDLE RestoreTPL; + + EFI_HANDLE AllocatePages; + EFI_HANDLE FreePages; + EFI_HANDLE GetMemoryMap; + EFI_HANDLE AllocatePool; + EFI_HANDLE FreePool; + + EFI_HANDLE CreateEvent; + EFI_HANDLE SetTimer; + EFI_HANDLE WaitForEvent; + EFI_HANDLE SignalEvent; + EFI_HANDLE CloseEvent; + EFI_HANDLE CheckEvent; + + EFI_HANDLE InstallProtocolInterface; + EFI_HANDLE ReinstallProtocolInterface; + EFI_HANDLE UninstallProtocolInterface; + EFI_HANDLE_PROTOCOL HandleProtocol; + EFI_HANDLE AlternateHandleProtocol; + EFI_HANDLE RegisterProtocolNotify; + EFI_HANDLE LocateHandle; + EFI_HANDLE LocateDevicePath; + EFI_HANDLE InstallConfigurationTable; + + EFI_HANDLE LoadImage; + EFI_HANDLE StartImage; + EFI_HANDLE Exit; + EFI_HANDLE UnloadImage; + EFI_HANDLE ExitBootServices; + + EFI_HANDLE GetNextHighMonotonicCount; + EFI_HANDLE Stall; + EFI_HANDLE SetWatchdogTimer; + + EFI_HANDLE ConnectController; + EFI_HANDLE DisconnectController; + + EFI_HANDLE OpenProtocol; + EFI_HANDLE CloseProtocol; + EFI_HANDLE OpenProtocolInformation; + + EFI_HANDLE ProtocolsPerHandle; + EFI_HANDLE LocateHandleBuffer; + EFI_HANDLE LocateProtocol; + EFI_HANDLE InstallMultipleProtocolInterfaces; + EFI_HANDLE UninstallMultipleProtocolInterfaces; + + EFI_HANDLE CalculateCrc32; + + EFI_HANDLE CopyMem; + EFI_HANDLE SetMem; + EFI_HANDLE CreateEventEx; +} EFI_BOOT_SERVICES; + +/* + * EFI configuration table definitions. + */ + +#define MPS_TABLE_GUID \ + { 0xeb9d2d2f, 0x2d88, 0x11d3, { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } } + +#define ACPI_TABLE_GUID \ + { 0x8868e871, 0xe4f1, 0x11d3, { 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } } + +#define ACPI_20_TABLE_GUID \ + { 0x8868e871, 0xe4f1, 0x11d3, { 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } } + +#define SMBIOS_TABLE_GUID \ + { 0xeb9d2d31, 0x2d88, 0x11d3, { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } } + +#define SMBIOS3_TABLE_GUID \ + { 0xf2fd1544, 0x9794, 0x4a2c, { 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94 } } + +#define SAL_SYSTEM_TABLE_GUID \ + { 0xeb9d2d32, 0x2d88, 0x11d3, { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } } + +#define EFI_DTB_TABLE_GUID \ + { 0xb1b621d5, 0xf19c, 0x41a5, { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } } + +typedef struct _EFI_CONFIGURATION_TABLE { + EFI_GUID VendorGuid; + VOID *VendorTable; +} EFI_CONFIGURATION_TABLE; + +/* + * EFI system table definitions. + */ + +#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 +#define EFI_SYSTEM_TABLE_REVISION EFI_SPECIFICATION_VERSION + +typedef struct _EFI_SYSTEM_TABLE { + EFI_TABLE_HEADER Hdr; + + CHAR16 *FirmwareVendor; + UINT32 FirmwareRevision; + + EFI_HANDLE ConsoleInHandle; + SIMPLE_INPUT_INTERFACE *ConIn; + + EFI_HANDLE ConsoleOutHandle; + SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut; + + EFI_HANDLE StandardErrorHandle; + SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr; + + EFI_RUNTIME_SERVICES *RuntimeServices; + EFI_BOOT_SERVICES *BootServices; + + UINTN NumberOfTableEntries; + EFI_CONFIGURATION_TABLE *ConfigurationTable; +} EFI_SYSTEM_TABLE; + +#endif diff --git a/BOOT/ENVIRON/INC/eficon.h b/BOOT/ENVIRON/INC/eficon.h new file mode 100644 index 0000000..6710196 --- /dev/null +++ b/BOOT/ENVIRON/INC/eficon.h @@ -0,0 +1,308 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + eficon.h + +Abstract: + + Provides EFI console protocol definitions. + +--*/ + +#ifndef _EFICON_H +#define _EFICON_H + +/* + * Text output protocol definitions. + */ + +INTERFACE_DECL(_SIMPLE_TEXT_OUTPUT_INTERFACE); + +#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \ + { 0x387477c2, 0x69c7, 0x11d2, { 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b } } +#define SIMPLE_TEXT_OUTPUT_PROTOCOL EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID + +typedef +EFI_STATUS +(EFIAPI *EFI_TEXT_RESET) ( + IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, + IN BOOLEAN ExtendedVerification + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_TEXT_OUTPUT_STRING) ( + IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, + IN CHAR16 *String + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_TEXT_TEST_STRING) ( + IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, + IN CHAR16 *String + ); + +/* + * Text attribute definitions. + */ + +typedef +EFI_STATUS +(EFIAPI *EFI_TEXT_SET_ATTRIBUTE) ( + IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, + IN UINTN Attribute + ); + +#define EFI_TEXT_ATTR(f,b) ((f) | ((b) << 4)) + +#define EFI_BLACK 0x00 +#define EFI_BLUE 0x01 +#define EFI_GREEN 0x02 +#define EFI_RED 0x04 +#define EFI_BRIGHT 0x08 +#define EFI_CYAN (EFI_BLUE | EFI_GREEN) +#define EFI_MAGENTA (EFI_BLUE | EFI_RED) +#define EFI_BROWN (EFI_GREEN | EFI_RED) +#define EFI_LIGHTGRAY (EFI_BLUE | EFI_GREEN | EFI_RED) +#define EFI_DARKGRAY (EFI_BRIGHT) +#define EFI_LIGHTBLUE (EFI_BLUE | EFI_BRIGHT) +#define EFI_LIGHTGREEN (EFI_GREEN | EFI_BRIGHT) +#define EFI_LIGHTCYAN (EFI_CYAN | EFI_BRIGHT) +#define EFI_LIGHTRED (EFI_RED | EFI_BRIGHT) +#define EFI_LIGHTMAGENTA (EFI_MAGENTA | EFI_BRIGHT) +#define EFI_YELLOW (EFI_BROWN | EFI_BRIGHT) +#define EFI_WHITE (EFI_BLUE | EFI_GREEN | EFI_RED | EFI_BRIGHT) + +#define EFI_BACKGROUND_BLACK 0x00 +#define EFI_BACKGROUND_BLUE 0x10 +#define EFI_BACKGROUND_GREEN 0x20 +#define EFI_BACKGROUND_RED 0x40 +#define EFI_BACKGROUND_CYAN (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN) +#define EFI_BACKGROUND_MAGENTA (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_RED) +#define EFI_BACKGROUND_BROWN (EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED) +#define EFI_BACKGROUND_LIGHTGRAY (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED) + +/* + * Mode/cursor definitions. + */ + +typedef +EFI_STATUS +(EFIAPI *EFI_TEXT_QUERY_MODE) ( + IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, + IN UINTN ModeNumber, + OUT UINTN *Columns, + OUT UINTN *Rows + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_TEXT_SET_MODE) ( + IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, + IN UINTN ModeNumber + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_TEXT_CLEAR_SCREEN) ( + IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_TEXT_SET_CURSOR_POSITION) ( + IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, + IN UINTN Column, + IN UINTN Row + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_TEXT_ENABLE_CURSOR) ( + IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, + IN BOOLEAN Enable + ); + +typedef struct { + INT32 MaxMode; + INT32 Mode; + INT32 Attribute; + INT32 CursorColumn; + INT32 CursorRow; + BOOLEAN CursorVisible; +} SIMPLE_TEXT_OUTPUT_MODE; + +typedef struct _SIMPLE_TEXT_OUTPUT_INTERFACE { + EFI_TEXT_RESET Reset; + + EFI_TEXT_OUTPUT_STRING OutputString; + EFI_TEXT_TEST_STRING TestString; + + EFI_TEXT_QUERY_MODE QueryMode; + EFI_TEXT_SET_MODE SetMode; + EFI_TEXT_SET_ATTRIBUTE SetAttribute; + + EFI_TEXT_CLEAR_SCREEN ClearScreen; + EFI_TEXT_SET_CURSOR_POSITION SetCursorPosition; + EFI_TEXT_ENABLE_CURSOR EnableCursor; + + SIMPLE_TEXT_OUTPUT_MODE *Mode; +} SIMPLE_TEXT_OUTPUT_INTERFACE, EFI_SIMPLE_TEXT_OUT_PROTOCOL; + +/* + * Unicode Box Draw definitions. + */ + +#define BOXDRAW_HORIZONTAL 0x2500 +#define BOXDRAW_VERTICAL 0x2502 +#define BOXDRAW_DOWN_RIGHT 0x250c +#define BOXDRAW_DOWN_LEFT 0x2510 +#define BOXDRAW_UP_RIGHT 0x2514 +#define BOXDRAW_UP_LEFT 0x2518 +#define BOXDRAW_VERTICAL_RIGHT 0x251c +#define BOXDRAW_VERTICAL_LEFT 0x2524 +#define BOXDRAW_DOWN_HORIZONTAL 0x252c +#define BOXDRAW_UP_HORIZONTAL 0x2534 +#define BOXDRAW_VERTICAL_HORIZONTAL 0x253c + +#define BOXDRAW_DOUBLE_HORIZONTAL 0x2550 +#define BOXDRAW_DOUBLE_VERTICAL 0x2551 +#define BOXDRAW_DOWN_RIGHT_DOUBLE 0x2552 +#define BOXDRAW_DOWN_DOUBLE_RIGHT 0x2553 +#define BOXDRAW_DOUBLE_DOWN_RIGHT 0x2554 + +#define BOXDRAW_DOWN_LEFT_DOUBLE 0x2555 +#define BOXDRAW_DOWN_DOUBLE_LEFT 0x2556 +#define BOXDRAW_DOUBLE_DOWN_LEFT 0x2557 + +#define BOXDRAW_UP_RIGHT_DOUBLE 0x2558 +#define BOXDRAW_UP_DOUBLE_RIGHT 0x2559 +#define BOXDRAW_DOUBLE_UP_RIGHT 0x255a + +#define BOXDRAW_UP_LEFT_DOUBLE 0x255b +#define BOXDRAW_UP_DOUBLE_LEFT 0x255c +#define BOXDRAW_DOUBLE_UP_LEFT 0x255d + +#define BOXDRAW_VERTICAL_RIGHT_DOUBLE 0x255e +#define BOXDRAW_VERTICAL_DOUBLE_RIGHT 0x255f +#define BOXDRAW_DOUBLE_VERTICAL_RIGHT 0x2560 + +#define BOXDRAW_VERTICAL_LEFT_DOUBLE 0x2561 +#define BOXDRAW_VERTICAL_DOUBLE_LEFT 0x2562 +#define BOXDRAW_DOUBLE_VERTICAL_LEFT 0x2563 + +#define BOXDRAW_DOWN_HORIZONTAL_DOUBLE 0x2564 +#define BOXDRAW_DOWN_DOUBLE_HORIZONTAL 0x2565 +#define BOXDRAW_DOUBLE_DOWN_HORIZONTAL 0x2566 + +#define BOXDRAW_UP_HORIZONTAL_DOUBLE 0x2567 +#define BOXDRAW_UP_DOUBLE_HORIZONTAL 0x2568 +#define BOXDRAW_DOUBLE_UP_HORIZONTAL 0x2569 + +#define BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE 0x256a +#define BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL 0x256b +#define BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL 0x256c + +/* + * Required Block Elements definitions. + */ + +#define BLOCKELEMENT_FULL_BLOCK 0x2588 +#define BLOCKELEMENT_LIGHT_SHADE 0x2591 + +/* + * Required Geometric Shapes definitions. + */ + +#define GEOMETRICSHAPE_UP_TRIANGLE 0x25b2 +#define GEOMETRICSHAPE_RIGHT_TRIANGLE 0x25ba +#define GEOMETRICSHAPE_DOWN_TRIANGLE 0x25bc +#define GEOMETRICSHAPE_LEFT_TRIANGLE 0x25c4 + +/* + * Required Arrow Shapes definitions. + */ + +#define ARROW_UP 0x2191 +#define ARROW_DOWN 0x2193 + +/* + * Text input protocol definitions. + */ + +INTERFACE_DECL(_SIMPLE_INPUT_INTERFACE); + +#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \ + { 0x387477c1, 0x69c7, 0x11d2, { 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b } } +#define SIMPLE_TEXT_INPUT_PROTOCOL EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID + +typedef struct { + UINT16 ScanCode; + CHAR16 UnicodeChar; +} EFI_INPUT_KEY; + +/* + * Unicode control definitions. + */ + +#define CHAR_NULL 0x0000 +#define CHAR_BACKSPACE 0x0008 +#define CHAR_TAB 0x0009 +#define CHAR_LINEFEED 0x000A +#define CHAR_CARRIAGE_RETURN 0x000D + +/* + * Scancode definitions. + */ + +#define SCAN_NULL 0x0000 +#define SCAN_UP 0x0001 +#define SCAN_DOWN 0x0002 +#define SCAN_RIGHT 0x0003 +#define SCAN_LEFT 0x0004 +#define SCAN_HOME 0x0005 +#define SCAN_END 0x0006 +#define SCAN_INSERT 0x0007 +#define SCAN_DELETE 0x0008 +#define SCAN_PAGE_UP 0x0009 +#define SCAN_PAGE_DOWN 0x000A +#define SCAN_F1 0x000B +#define SCAN_F2 0x000C +#define SCAN_F3 0x000D +#define SCAN_F4 0x000E +#define SCAN_F5 0x000F +#define SCAN_F6 0x0010 +#define SCAN_F7 0x0011 +#define SCAN_F8 0x0012 +#define SCAN_F9 0x0013 +#define SCAN_F10 0x0014 +#define SCAN_F11 0x0015 +#define SCAN_F12 0x0016 +#define SCAN_ESC 0x0017 + +typedef +EFI_STATUS +(EFIAPI *EFI_INPUT_RESET) ( + IN struct _SIMPLE_INPUT_INTERFACE *This, + IN BOOLEAN ExtendedVerification + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_INPUT_READ_KEY) ( + IN struct _SIMPLE_INPUT_INTERFACE *This, + OUT EFI_INPUT_KEY *Key + ); + +typedef struct _SIMPLE_INPUT_INTERFACE { + EFI_INPUT_RESET Reset; + EFI_INPUT_READ_KEY ReadKeyStroke; + EFI_EVENT WaitForKey; +} SIMPLE_INPUT_INTERFACE, EFI_SIMPLE_TEXT_IN_PROTOCOL; + +#endif diff --git a/BOOT/ENVIRON/INC/efidef.h b/BOOT/ENVIRON/INC/efidef.h new file mode 100644 index 0000000..a89d925 --- /dev/null +++ b/BOOT/ENVIRON/INC/efidef.h @@ -0,0 +1,196 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + efidef.h + +Abstract: + + Provides basic EFI type/structure definitions. + +--*/ + +#ifndef _EFIDEF_H +#define _EFIDEF_H + +#ifndef VOID + #define VOID void +#endif + +#ifndef CONST + #define CONST const +#endif + +#ifndef NULL +#if defined(__cplusplus) + #define NULL 0 +#else + #define NULL ((VOID *) 0) +#endif +#endif + +#if defined(__cplusplus) + typedef bool BOOLEAN; +#else + typedef UINT8 BOOLEAN; +#endif + +#ifndef TRUE +#if defined(__cplusplus) + typedef bool BOOLEAN; + #define TRUE true + #define FALSE false +#else + typedef UINT8 BOOLEAN; + #define TRUE ((BOOLEAN) 1) + #define FALSE ((BOOLEAN) 0) +#endif +#endif + +typedef UINT16 CHAR16; +typedef UINT8 CHAR8; + +typedef UINTN EFI_STATUS; +typedef UINT64 EFI_LBA; +typedef UINTN EFI_TPL; +typedef VOID *EFI_HANDLE; +typedef VOID *EFI_EVENT; + +/* + * Decorators to show parameter direction. + * + * IN - argument passed into routine. + * OUT - argument pointer returned by routine. + * OPTIONAL - argument is not required. + */ + +#ifndef IN + #define IN + #define OUT + #define OPTIONAL +#endif + +/* + * Globally Unique IDentifier. + */ + +typedef struct { + UINT32 Data1; + UINT16 Data2; + UINT16 Data3; + UINT8 Data4[8]; +} EFI_GUID; + +/* + * Time definitons. + */ + +typedef struct { + UINT16 Year; + UINT8 Month; + UINT8 Day; + UINT8 Hour; + UINT8 Minute; + UINT8 Second; + UINT8 Pad1; + UINT32 Nanosecond; + INT16 Timezone; + UINT8 Daylight; + UINT8 Pad2; +} EFI_TIME; + +/* For EFI_TIME.Daylight */ +#define EFI_TIME_ADJUST_DAYLIGHT 0x01 +#define EFI_TIME_IN_DAYLIGHT 0x02 + +/* For EFI_TIME.TimeZone */ +#define EFI_UNSPECIFIED_TIMEZONE 0x07FF + +/* + * Networking definitions. + */ + +typedef struct { + UINT8 Addr[4]; +} EFI_IPv4_ADDRESS; + +typedef struct { + UINT8 Addr[16]; +} EFI_IPv6_ADDRESS; + +typedef struct { + UINT8 Addr[32]; +} EFI_MAC_ADDRESS; + +/* + * Memory definitions. + */ + +typedef UINT64 EFI_PHYSICAL_ADDRESS; +typedef UINT64 EFI_VIRTUAL_ADDRESS; + +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, + EfiUnacceptedMemoryType, + EfiMaxMemoryType +} EFI_MEMORY_TYPE; + +/* Memory range caching types */ +#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 + +/* Memory range protection flags */ +#define EFI_MEMORY_WP 0x0000000000001000 +#define EFI_MEMORY_RP 0x0000000000002000 +#define EFI_MEMORY_XP 0x0000000000004000 +#define EFI_MEMORY_RO 0x0000000000020000 + +/* Memory type runtime mapping flags */ +#define EFI_MEMORY_NV 0x0000000000008000 +#define EFI_MEMORY_RUNTIME 0x8000000000000000 + +#define EFI_MEMORY_DESCRIPTOR_VERSION 1 + +typedef struct { + UINT32 Type; + UINT32 Pad; + EFI_PHYSICAL_ADDRESS PhysicalStart; + EFI_VIRTUAL_ADDRESS VirtualStart; + UINT64 NumberOfPages; + UINT64 Attribute; +} EFI_MEMORY_DESCRIPTOR; + +#define EFI_PAGE_SIZE 4096 +#define EFI_PAGE_MASK 0xFFF +#define EFI_PAGE_SHIFT 12 + +#define EFI_SIZE_TO_PAGES(s) (((s) >> EFI_PAGE_SHIFT) + ((s) & EFI_PAGE_MASK ? 1 : 0)) + +#endif diff --git a/BOOT/ENVIRON/INC/efidevp.h b/BOOT/ENVIRON/INC/efidevp.h new file mode 100644 index 0000000..dcfc6e1 --- /dev/null +++ b/BOOT/ENVIRON/INC/efidevp.h @@ -0,0 +1,28 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + efidevp.h + +Abstract: + + Provides EFI device path definitions. + +--*/ + +#ifndef _EFIDEVP_H +#define _EFIDEVP_H + +typedef struct _EFI_DEVICE_PATH_PROTOCOL { + UINT8 Type; + UINT8 SubType; + UINT8 Length[2]; +} EFI_DEVICE_PATH_PROTOCOL; + +typedef struct _EFI_DEVICE_PATH_PROTOCOL _EFI_DEVICE_PATH; +typedef EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH; + +#endif diff --git a/BOOT/ENVIRON/INC/efierr.h b/BOOT/ENVIRON/INC/efierr.h new file mode 100644 index 0000000..3fd4b59 --- /dev/null +++ b/BOOT/ENVIRON/INC/efierr.h @@ -0,0 +1,65 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + efierr.h + +Abstract: + + Provides EFI error definitions. + +--*/ + +#ifndef _EFIERR_H +#define _EFIERR_H + +#define EFIWARN(a) (a) +#define EFI_ERROR(a) (((INTN) a) < 0) + +#define EFI_SUCCESS 0 +#define EFI_LOAD_ERROR EFIERR(1) +#define EFI_INVALID_PARAMETER EFIERR(2) +#define EFI_UNSUPPORTED EFIERR(3) +#define EFI_BAD_BUFFER_SIZE EFIERR(4) +#define EFI_BUFFER_TOO_SMALL EFIERR(5) +#define EFI_NOT_READY EFIERR(6) +#define EFI_DEVICE_ERROR EFIERR(7) +#define EFI_WRITE_PROTECTED EFIERR(8) +#define EFI_OUT_OF_RESOURCES EFIERR(9) +#define EFI_VOLUME_CORRUPTED EFIERR(10) +#define EFI_VOLUME_FULL EFIERR(11) +#define EFI_NO_MEDIA EFIERR(12) +#define EFI_MEDIA_CHANGED EFIERR(13) +#define EFI_NOT_FOUND EFIERR(14) +#define EFI_ACCESS_DENIED EFIERR(15) +#define EFI_NO_RESPONSE EFIERR(16) +#define EFI_NO_MAPPING EFIERR(17) +#define EFI_TIMEOUT EFIERR(18) +#define EFI_NOT_STARTED EFIERR(19) +#define EFI_ALREADY_STARTED EFIERR(20) +#define EFI_ABORTED EFIERR(21) +#define EFI_ICMP_ERROR EFIERR(22) +#define EFI_TFTP_ERROR EFIERR(23) +#define EFI_PROTOCOL_ERROR EFIERR(24) +#define EFI_INCOMPATIBLE_VERSION EFIERR(25) +#define EFI_SECURITY_VIOLATION EFIERR(26) +#define EFI_CRC_ERROR EFIERR(27) +#define EFI_END_OF_MEDIA EFIERR(28) +#define EFI_END_OF_FILE EFIERR(31) +#define EFI_INVALID_LANGUAGE EFIERR(32) +#define EFI_COMPROMISED_DATA EFIERR(33) +#define EFI_IP_ADDRESS_CONFLICT EFIERR(34) +#define EFI_HTTP_ERROR EFIERR(35) + +#define EFI_WARN_UNKOWN_GLYPH EFIWARN(1) +#define EFI_WARN_DELETE_FAILURE EFIWARN(2) +#define EFI_WARN_WRITE_FAILURE EFIWARN(3) +#define EFI_WARN_BUFFER_TOO_SMALL EFIWARN(4) +#define EFI_WARN_STALE_DATA EFIWARN(5) +#define EFI_WARN_FILE_SYSTEM EFIWARN(6) +#define EFI_WARN_RESET_REQUESTED EFIWARN(7) + +#endif diff --git a/BOOT/ENVIRON/INC/efiprot.h b/BOOT/ENVIRON/INC/efiprot.h new file mode 100644 index 0000000..b51e00a --- /dev/null +++ b/BOOT/ENVIRON/INC/efiprot.h @@ -0,0 +1,27 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + efiprot.h + +Abstract: + + Provides EFI protocol definitions. + +--*/ + +#ifndef _EFIPROT_H +#define _EFIPROT_H + +/* + * Device path protocol definitions. + */ + +#define EFI_DEVICE_PATH_PROTOCOL_GUID \ + { 0x9576e91, 0x6d3f, 0x11d2, { 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b } } +#define DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH_PROTOCOL_GUID + +#endif diff --git a/BOOT/ENVIRON/INC/nt.h b/BOOT/ENVIRON/INC/nt.h new file mode 100644 index 0000000..fdbd4c9 --- /dev/null +++ b/BOOT/ENVIRON/INC/nt.h @@ -0,0 +1,23 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + nt.h + +Abstract: + + Provides NT header files. + +--*/ + +#ifndef _NT_H +#define _NT_H + +#include +#include +#include + +#endif diff --git a/BOOT/ENVIRON/INC/ntdef.h b/BOOT/ENVIRON/INC/ntdef.h new file mode 100644 index 0000000..e994b12 --- /dev/null +++ b/BOOT/ENVIRON/INC/ntdef.h @@ -0,0 +1,146 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + ntdef.h + +Abstract: + + Provides basic NT definitions. + +--*/ + +#ifndef _NTDEF_H +#define _NTDEF_H + +#ifndef VOID + #define VOID void +#endif + +#ifndef CONST + #define CONST const +#endif + +#ifndef IN + #define IN + #define OUT + #define OPTIONAL +#endif + +#ifndef ANYSIZE_ARRAY + #define ANYSIZE_ARRAY 1 +#endif + +#ifndef FORCEINLINE +#if defined(_MSC_EXTENSIONS) + #define FORCEINLINE __inline +#else + #define FORCEINLINE static inline +#endif +#endif + +#ifndef FASTCALL + #define FASTCALL +#endif + +#ifndef NTAPI + #define NTAPI +#endif + +// +// Basic types. +// +typedef char CHAR; +typedef short SHORT; +typedef long LONG; +typedef unsigned char UCHAR; +typedef unsigned short USHORT; +typedef unsigned long ULONG; + +// +// Basic type pointers. +// +typedef void *PVOID; +typedef CHAR *PCHAR; +typedef SHORT *PSHORT; +typedef UCHAR *PUCHAR; +typedef USHORT *PUSHORT; +typedef ULONG *PULONG; + +// +// Wide characters. +// +typedef USHORT WCHAR; +typedef WCHAR *PWCHAR; + +// +// Logical values. +// +typedef ULONG LOGICAL; +typedef ULONG *PLOGICAL; + +// +// Status codes. +// +typedef LONG NTSTATUS; +typedef NTSTATUS *PNTSTATUS; + +// +// Status code utilities. +// +#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) +#define NT_INFORMATION(Status) ((ULONG)(Status) >> 30 == 1) +#define NT_WARNING(Status) ((ULONG)(Status) >> 30 == 2) +#define NT_ERROR(Status) ((ULONG)(Status) >> 30 == 3) + +// +// Long long type definitions. +// +#if defined(_MSC_EXTENSIONS) + typedef unsigned __int64 ULONGLONG; + typedef __int64 LONGLONG; +#elif defined(UNIX_LP64) + typedef unsigned long ULONGLONG; + typedef long LONGLONG; +#else + typedef unsigned long long ULONGLONG; + typedef long long LONGLONG; +#endif + +// +// Large (64-bit) integer value. +// +typedef union LARGE_INTEGER { + struct { + ULONG LowPart; + LONG HighPart; + }; + + LONGLONG QuadPart; +} LARGE_INTEGER, *PLARGE_INTEGER; + +// +// Large (64-bit) unsigned integer value. +// +typedef union ULARGE_INTEGER { + struct { + ULONG LowPart; + ULONG HighPart; + }; + + ULONGLONG QuadPart; +} ULARGE_INTEGER, *PULARGE_INTEGER; + +// +// Struct field offset helper. +// +#if !defined(__GNUC__) && !defined(__clang__) +#define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field)) +#else +#define FIELD_OFFSET(type, field) ((ULONG)__builtin_offsetof(type, field)) +#endif + +#endif diff --git a/BOOT/ENVIRON/INC/ntimage.h b/BOOT/ENVIRON/INC/ntimage.h new file mode 100644 index 0000000..14dde57 --- /dev/null +++ b/BOOT/ENVIRON/INC/ntimage.h @@ -0,0 +1,26 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + ntimage.h + +Abstract: + + Provides NT image file definitions. + +--*/ + +#ifndef _NTIMAGE_H +#define _NTIMAGE_H + +// +// Machine type values. +// +#define IMAGE_FILE_MACHINE_UNKNOWN 0 +#define IMAGE_FILE_MACHINE_I386 0x014c +#define IMAGE_FILE_MACHINE_AMD64 0x8664 + +#endif diff --git a/BOOT/ENVIRON/INC/ntstatus.h b/BOOT/ENVIRON/INC/ntstatus.h new file mode 100644 index 0000000..9b742fc --- /dev/null +++ b/BOOT/ENVIRON/INC/ntstatus.h @@ -0,0 +1,44 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + ntstatus.h + +Abstract: + + Provides NT status code values. + +--*/ + +#ifndef _NTSTATUS_H +#define _NTSTATUS_H + +#define STATUS_SUCCESS ((NTSTATUS) 0x00000000L) + +// +// TODO: There are an insane amount of status values. +// +#define STATUS_MEDIA_CHANGED ((NTSTATUS) 0x8000001CL) +#define STATUS_INVALID_PARAMETER ((NTSTATUS) 0xC000000DL) +#define STATUS_ACCESS_DENIED ((NTSTATUS) 0xC0000022L) +#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS) 0xC0000023L) +#define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS) 0xC0000032L) +#define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS) 0xC0000038L) +#define STATUS_DISK_FULL ((NTSTATUS) 0xC000007FL) +#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS) 0xC000009AL) +#define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS) 0xC00000A2L) +#define STATUS_DEVICE_NOT_READY ((NTSTATUS) 0xC00000A3L) +#define STATUS_NOT_SUPPORTED ((NTSTATUS) 0xC00000BBL) +#define STATUS_TIMEOUT ((NTSTATUS) 0x00000102L) +#define STATUS_NO_MEDIA ((NTSTATUS) 0xC0000178L) +#define STATUS_IO_DEVICE_ERROR ((NTSTATUS) 0xC0000185L) +#define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS) 0xC0000206L) +#define STATUS_NOT_FOUND ((NTSTATUS) 0xC0000225L) +#define STATUS_REQUEST_ABORTED ((NTSTATUS) 0xC0000240L) +#define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS) 0xC000026CL) +#define STATUS_NO_MATCH ((NTSTATUS) 0xC0000272L) + +#endif diff --git a/BOOT/ENVIRON/LIB/EFI/efistatus.c b/BOOT/ENVIRON/LIB/EFI/efistatus.c new file mode 100644 index 0000000..6300655 --- /dev/null +++ b/BOOT/ENVIRON/LIB/EFI/efistatus.c @@ -0,0 +1,84 @@ +/*++ + +Copyright (c) 2024, the LibreXP developers. +Provided under the BSD 3-Clause license. + +Module Name: + + efistatus.c + +Abstract: + + Provides EFI status code utilities. + +--*/ + +#include "bootmgr.h" + +EFI_STATUS +EfiGetEfiStatusCode ( + IN NTSTATUS Status + ) + +/*++ + +Routine Description: + + Converts an NT status code into an EFI status code. + +Arguments: + + Status - The NT status code to be converted. + +Return Value: + + The EFI status code. + +--*/ + +{ + switch (Status) { + case STATUS_SUCCESS: + return EFI_SUCCESS; + case STATUS_DRIVER_UNABLE_TO_LOAD: + return EFI_LOAD_ERROR; + case STATUS_INVALID_PARAMETER: + return EFI_INVALID_PARAMETER; + case STATUS_NOT_SUPPORTED: + return EFI_UNSUPPORTED; + case STATUS_INVALID_BUFFER_SIZE: + return EFI_BAD_BUFFER_SIZE; + case STATUS_BUFFER_TOO_SMALL: + return EFI_BUFFER_TOO_SMALL; + case STATUS_IO_DEVICE_ERROR: + return EFI_DEVICE_ERROR; + case STATUS_MEDIA_WRITE_PROTECTED: + return EFI_WRITE_PROTECTED; + case STATUS_INSUFFICIENT_RESOURCES: + return EFI_OUT_OF_RESOURCES; + case STATUS_DISK_CORRUPT_ERROR: + return EFI_VOLUME_CORRUPTED; + case STATUS_DISK_FULL: + return EFI_VOLUME_FULL; + case STATUS_NO_MEDIA: + return EFI_NO_MEDIA; + case STATUS_MEDIA_CHANGED: + return EFI_MEDIA_CHANGED; + case STATUS_NOT_FOUND: + return EFI_NOT_FOUND; + case STATUS_ACCESS_DENIED: + return EFI_ACCESS_DENIED; + case STATUS_NO_MATCH: + return EFI_NO_MAPPING; + case STATUS_TIMEOUT: + return EFI_TIMEOUT; + case STATUS_DEVICE_NOT_READY: + return EFI_NOT_STARTED; + case STATUS_DEVICE_ALREADY_ATTACHED: + return EFI_ALREADY_STARTED; + case STATUS_REQUEST_ABORTED: + return EFI_ABORTED; + default: + return EFI_NO_MAPPING; + } +}