Fully implemented Runtime Services

This commit is contained in:
Jozef Nagy 2024-01-21 00:04:13 +01:00
parent 296d62f96e
commit 9d885a0986
No known key found for this signature in database
GPG key ID: 2D281D7D04AF4A3C
2 changed files with 306 additions and 45 deletions

343
efi.h
View file

@ -4,54 +4,97 @@
#include "guid.h"
#include "efi_types.h"
// Variable-size array
#define ANYSIZE_ARRAY 1
// Event types
#define EVT_TIMER 0x80000000
#define EVT_RUNTIME 0x40000000
#define EVT_TIMER 0x80000000
#define EVT_RUNTIME 0x40000000
#define EVT_NOTIFY_WAIT 0x00000100
#define EVT_NOTIFY_SIGNAL 0x00000200
#define EVT_NOTIFY_WAIT 0x00000100
#define EVT_NOTIFY_SIGNAL 0x00000200
#define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201
#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202
#define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201
#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202
//
// Task Priority Levels
#define TPL_APPLICATION 4
#define TPL_CALLBACK 8
#define TPL_NOTIFY 16
#define TPL_HIGH_LEVEL 31
#define TPL_APPLICATION 4
#define TPL_CALLBACK 8
#define TPL_NOTIFY 16
#define TPL_HIGH_LEVEL 31
//
// OS Indications
#define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001
#define EFI_OS_INDICATIONS_TIMESTAMP_REVOCATION 0x0000000000000002
#define EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED 0x0000000000000004
#define EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED 0x0000000000000008
#define EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED 0x0000000000000010
#define EFI_OS_INDICATIONS_START_OS_RECOVERY 0x0000000000000020
#define EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY 0x0000000000000040
#define EFI_OS_INDICATIONS_JSON_CONFIG_DATA_REFRESH 0x0000000000000080
//
// Memory Attributes
#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_ISA_VALID 0x4000000000000000
#define EFI_MEMORY_ISA_MASK 0x0FFFF00000000000
#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_ISA_VALID 0x4000000000000000
#define EFI_MEMORY_ISA_MASK 0x0FFFF00000000000
//
// Capsule Flags
#define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000
#define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000
#define CAPSULE_FLAGS_INITIATE_RESET 0x00040000
//
// Time
#define EFI_TIME_ADJUST_DAYLIGHT 0x01
#define EFI_TIME_IN_DAYLIGHT 0x02
#define EFI_UNSPECIFIED_TIMEZONE 0x07FF
//
// Optional Pointer
#define EFI_OPTIONAL_PTR 0x00000001
//
// Variable Attributes
#define EFI_VARIABLE_NON_VOLATILE 0x00000001
#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002
#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004
#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x00000008
// NOTE: EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS is deprecated
// and should be considered reserved.
#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010
#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020
#define EFI_VARIABLE_APPEND_WRITE 0x00000040
#define EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS 0x00000080
// EFI Open Protocol Attributes
#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
#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
//
// Memory Descriptor Version Number
#define EFI_MEMORY_DESCRIPTOR_VERSION 1
#define EFI_MEMORY_DESCRIPTOR_VERSION 1
// EFI Simple Text Input Protocol
typedef struct EFI_SIMPLE_TEXT_INPUT_PROTOCOL EFI_SIMPLE_TEXT_INPUT_PROTOCOL;
@ -79,6 +122,27 @@ typedef struct EFI_GUID {
UINT8 Data4[8];
} EFI_GUID;
// EFI Certificate RSA2048 SHA256 Block
typedef struct _EFI_CERT_BLOCK_RSA_2048_SHA256 {
EFI_GUID HashType;
UINT8 PublicKey[256];
UINT8 Signature[256];
} EFI_CERT_BLOCK_RSA_2048_SHA256;
// EFI WinCertificate
typedef struct _WIN_CERTIFICATE {
UINT32 dwLength;
UINT16 wRevision;
UINT16 wCertificateType;
UINT8 bCertificate[ANYSIZE_ARRAY];
} WIN_CERTIFICATE;
typedef struct _WIN_CERTIFICATE_UEFI_GUID {
WIN_CERTIFICATE Hdr;
EFI_GUID CertType;
UINT8 CertData[ANYSIZE_ARRAY];
} WIN_CERTIFICATE_UEFI_GUID;
// EFI Simple Text Output Mode
typedef struct {
INT32 MaxNode;
@ -97,6 +161,28 @@ typedef struct {
CHAR16 UnicodeChar;
} EFI_INPUT_KEY;
// EFI Time
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;
// EFI Time Capabilities
typedef struct {
UINT32 Resolution;
UINT32 Accuracy;
BOOLEAN SetsToZero;
} EFI_TIME_CAPABILITIES;
// EFI HII Package List Header
typedef struct {
EFI_GUID PackageListGuid;
@ -112,6 +198,12 @@ typedef struct {
UINT32 Reserved;
} EFI_TABLE_HEADER;
// EFI Variable Authentication
typedef struct {
UINT64 MonotonicCount;
WIN_CERTIFICATE_UEFI_GUID AuthInfo;
} EFI_VARIABLE_AUTHENTICATION;
// EFI Memory Descriptor
typedef struct {
UINT32 Type;
@ -121,6 +213,65 @@ typedef struct {
UINT64 Attribute;
} EFI_MEMORY_DESCRIPTOR;
typedef struct {
EFI_PHYSICAL_ADDRESS Address;
UINT64 Length;
} EFI_MEMORY_RANGE;
// EFI Capsule Header
typedef struct {
EFI_GUID CapsuleGuid;
UINT32 HeaderSize;
UINT32 Flags;
UINT32 CapsuleImageSize;
} EFI_CAPSULE_HEADER;
// EFI Capsule Block
typedef struct {
UINT64 Length;
union {
EFI_PHYSICAL_ADDRESS DataBlock;
EFI_PHYSICAL_ADDRESS ContinuationPointer;
} Union;
} EFI_CAPSULE_BLOCK_DESCRIPTOR;
// EFI Memory Range Capsule
typedef struct {
EFI_CAPSULE_HEADER Header;
UINT32 OsRequestedMemoryType;
UINT64 NumberOfMemoryRanges;
EFI_MEMORY_RANGE MemoryRanges[];
} EFI_MEMORY_RANGE_CAPSULE;
typedef struct {
UINT64 FirmwareMemoryRequirement;
UINT64 NumberOfMemoryRanges;
} EFI_MEMORY_RANGE_CAPSULE_RESULT;
typedef struct {
UINT32 VariableTotalSize;
UINT32 Reserved;
EFI_GUID CapsuleGuid;
EFI_TIME CapsuleProcessed;
EFI_STATUS CapsuleStatus;
} EFI_CAPSULE_RESULT_VARIABLE_HEADER;
typedef struct {
UINT16 Version;
UINT8 PayloadIndex;
UINT8 UpdateImageIndex;
EFI_GUID UpdateImageTypeId;
//CHAR16 CapsuleFileName[];
//CHAR16 CapsuleTarget[];
} EFI_CAPSULE_RESULT_VARIABLE_FMP;
typedef struct {
UINT32 Version;
UINT32 CapsuleId;
UINT32 RespLength;
UINT8 Resp[];
} EFI_CAPSULE_RESULT_VARIABLE_JSON;
// Open Protocol Information Entry
typedef struct {
EFI_HANDLE AgentHandle;
@ -283,6 +434,77 @@ EFI_STATUS
OUT VOID *Data OPTIONAL
);
typedef
EFI_STATUS
(EFIAPI *EFI_GET_NEXT_VARIABLE_NAME)(
IN OUT UINTN *VariableNameSize,
IN OUT CHAR16 *VariableName,
IN OUT EFI_GUID *VendorGuid
);
typedef
EFI_STATUS
(EFIAPI *EFI_SET_VARIABLE)(
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
);
typedef
EFI_STATUS
(EFIAPI *EFI_QUERY_VARIABLE_INFO)(
IN UINT32 Attributes,
OUT UINT64 *MaximumVariableStorageSize,
OUT UINT64 *RemainingVariableStorageSize,
OUT UINT64 *MaximumVariableSize
);
typedef
EFI_STATUS
(EFIAPI *EFI_GET_TIME)(
OUT EFI_TIME *Time,
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
);
typedef
EFI_STATUS
(EFIAPI *EFI_SET_TIME)(
IN EFI_TIME *Time
);
typedef
EFI_STATUS
(EFIAPI *EFI_GET_WAKEUP_TIME)(
OUT BOOLEAN *Enable,
OUT BOOLEAN *Pending,
OUT EFI_TIME *Time
);
typedef
EFI_STATUS
(EFIAPI *EFI_SET_WAKEUP_TIME)(
IN BOOLEAN Enable,
IN EFI_TIME *Time
);
typedef
EFI_STATUS
(EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP)(
IN UINTN MemoryMapSize,
IN UINTN DescriptorSize,
IN UINT32 DescriptorVersion,
IN EFI_MEMORY_DESCRIPTOR *VirtualMap
);
typedef
EFI_STATUS
(EFIAPI *EFI_CONVERT_POINTER)(
IN UINTN DebugDisposition,
IN VOID **Address
);
typedef
EFI_STATUS
(EFIAPI *EFI_RESET_SYSTEM)(
@ -292,6 +514,31 @@ EFI_STATUS
IN VOID *ResetData OPTIONAL
);
typedef
EFI_STATUS
(EFIAPI *EFI_GET_NEXT_HIGH_MONOTONIC_COUNT)(
OUT UINT32 *HighCount
);
typedef
EFI_STATUS
(EFIAPI *EFI_UPDATE_CAPSULE)(
IN EFI_CAPSULE_HEADER **CapsuleHeaderArray,
IN UINTN CapsuleCount,
IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL
);
typedef
EFI_STATUS
(EFIAPI *EFI_QUERY_CAPSULE_CAPABILITIES)(
IN EFI_CAPSULE_HEADER **CapsuleHeaderArray,
IN UINTN CapsuleCount,
OUT UINT64 *MaximumCapsuleSize,
OUT EFI_RESET_TYPE *ResetType
);
// EFI Boot Services
typedef
@ -684,30 +931,30 @@ typedef struct EFI_RUNTIME_SERVICES {
EFI_TABLE_HEADER Hdr;
// Time Services
void *GetTime;
void *SetTime;
void *GetWakeupTime;
void *SetWakeupTime;
EFI_GET_TIME GetTime;
EFI_SET_TIME SetTime;
EFI_GET_WAKEUP_TIME GetWakeupTime;
EFI_SET_WAKEUP_TIME SetWakeupTime;
// Virtual Memory Services
void *SetVirtualAddressMap;
void *ConvertPointer;
EFI_SET_VIRTUAL_ADDRESS_MAP SetVirtualAddressMap;
EFI_CONVERT_POINTER ConvertPointer;
// Variable Services
EFI_GET_VARIABLE GetVariable;
void *GetNextVariableName;
void *SetVariable;
EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName;
EFI_SET_VARIABLE SetVariable;
// Miscellaneous Services
void *GetNextHighMonotonicCount;
EFI_GET_NEXT_HIGH_MONOTONIC_COUNT GetNextHighMonotonicCount;
EFI_RESET_SYSTEM ResetSystem;
// UEFI 2.0 Capsule Services
void *UpdateCapsule;
void *QueryCapsuleCapabilities;
EFI_UPDATE_CAPSULE UpdateCapsule;
EFI_QUERY_CAPSULE_CAPABILITIES QueryCapsuleCapabilities;
// Miscellaneous UEFI 2.0 Service
void *QueryVariableInfo;
EFI_QUERY_VARIABLE_INFO QueryVariableInfo;
} EFI_RUNTIME_SERVICES;
// EFI Boot Services
@ -782,6 +1029,12 @@ typedef struct EFI_BOOT_SERVICES {
EFI_CREATE_EVENT_EX CreateEventEx;
} EFI_BOOT_SERVICES;
// EFI Capsule Table
typedef struct {
UINT32 CapsuleArrayNumber;
VOID *CapsulePtr[ANYSIZE_ARRAY];
} EFI_CAPSULE_TABLE;
// EFI System Table
typedef struct EFI_SYSTEM_TABLE {
EFI_TABLE_HEADER Hdr;

8
guid.h
View file

@ -1,6 +1,10 @@
#ifndef GUID_H
#define GUID_H
// Driver Signing
#define EFI_CERT_TYPE_RSA2048_SHA256_GUID {0xa7717414,0xc616,0x4977, {0x94,0x20,0x84,0x47,0x12,0xa7,0x35,0xbf}}
#define EFI_CERT_TYPE_PKCS7_GUID {0x4aafd29d,0x68df,0x49ee, {0x8a,0xa9,0x34,0x7d,0x37,0x56,0x65,0xa7}}
// Simple Text I/O Protocols
#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID {0x387477c1,0x69c7,0x11d2, {0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b}}
#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID {0x387477c2,0x69c7,0x11d2, {0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b}}
@ -9,4 +13,8 @@
#define EFI_HII_PACKAGE_LIST_PROTOCOL_GUID {0x6a1ee763,0xd47a,0x43b4, {0xaa,0xbe,0xef,0x1d,0xe2,0xab,0x56,0xfc}}
#define EFI_DEVICE_PATH_PROTOCOL_GUID {0x09576e91,0x6d3f,0x11d2, {0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b}}
// Capsules
#define EFI_MEMORY_RANGE_CAPSULE_GUID {0xde9f0ec,0x88b6,0x428f, {0x97,0x7a,0x25,0x8f,0x1d,0xe,0x5e,0x72}}
#define EFI_CAPSULE_REPORT_GUID {0x39b68c46,0xf7fb,0x441b, {0xb6,0xec,0x16,0xb0,0xf6,0x98,0x21,0xf3}};
#endif /* GUID_H */