1434 lines
58 KiB
C
1434 lines
58 KiB
C
|
/*
|
||
|
* uefi.h
|
||
|
* https://gitlab.com/bztsrc/posix-uefi
|
||
|
*
|
||
|
* Copyright (C) 2021 bzt (bztsrc@gitlab)
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person
|
||
|
* obtaining a copy of this software and associated documentation
|
||
|
* files (the "Software"), to deal in the Software without
|
||
|
* restriction, including without limitation the rights to use, copy,
|
||
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||
|
* of the Software, and to permit persons to whom the Software is
|
||
|
* furnished to do so, subject to the following conditions:
|
||
|
*
|
||
|
* The above copyright notice and this permission notice shall be
|
||
|
* included in all copies or substantial portions of the Software.
|
||
|
*
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||
|
* DEALINGS IN THE SOFTWARE.
|
||
|
*
|
||
|
* This file is part of the POSIX-UEFI package.
|
||
|
* @brief Main (and only) header file
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef _UEFI_H_
|
||
|
#define _UEFI_H_
|
||
|
|
||
|
/*** configuration ***/
|
||
|
/* #define UEFI_NO_UTF8 */ /* use wchar_t in your application */
|
||
|
/* #define UEFI_NO_TRACK_ALLOC */ /* do not track allocated buffers' size */
|
||
|
/*** configuration ends ***/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/* get these from the compiler or the efi headers, only define if we have neither */
|
||
|
#if !defined(_STDINT_H) && !defined(_GCC_STDINT_H) && !defined(_EFI_INCLUDE_)
|
||
|
#define _STDINT_H
|
||
|
typedef char int8_t;
|
||
|
typedef unsigned char uint8_t;
|
||
|
typedef short int16_t;
|
||
|
typedef unsigned short uint16_t;
|
||
|
typedef int int32_t;
|
||
|
typedef unsigned int uint32_t;
|
||
|
#ifndef __clang__
|
||
|
typedef long int int64_t;
|
||
|
typedef unsigned long int uint64_t;
|
||
|
typedef unsigned long int uintptr_t;
|
||
|
#else
|
||
|
typedef long long int64_t;
|
||
|
typedef unsigned long long uint64_t;
|
||
|
typedef unsigned long long uintptr_t;
|
||
|
#endif
|
||
|
#endif
|
||
|
extern char c_assert1[sizeof(uint32_t) == 4 ? 1 : -1];
|
||
|
extern char c_assert2[sizeof(uint64_t) == 8 ? 1 : -1];
|
||
|
extern char c_assert3[sizeof(uintptr_t) == 8 ? 1 : -1];
|
||
|
|
||
|
#ifndef NULL
|
||
|
#define NULL ((void*)0)
|
||
|
#endif
|
||
|
/*** common defines and typedefs ***/
|
||
|
typedef int64_t intn_t;
|
||
|
typedef uint8_t boolean_t;
|
||
|
typedef uint16_t wchar_t;
|
||
|
typedef uint64_t uintn_t;
|
||
|
typedef uint64_t size_t;
|
||
|
typedef uint64_t time_t;
|
||
|
typedef uint64_t mode_t;
|
||
|
typedef uint64_t off_t;
|
||
|
typedef uint64_t blkcnt_t;
|
||
|
typedef uint64_t efi_status_t;
|
||
|
typedef uint64_t efi_tpl_t;
|
||
|
typedef uint64_t efi_lba_t;
|
||
|
typedef uint64_t efi_physical_address_t;
|
||
|
typedef uint64_t efi_virtual_address_t;
|
||
|
typedef void *efi_handle_t;
|
||
|
typedef void *efi_event_t;
|
||
|
#ifndef UEFI_NO_UTF8
|
||
|
typedef char char_t;
|
||
|
#define CL(a) a
|
||
|
extern char *__argvutf8;
|
||
|
#else
|
||
|
typedef wchar_t char_t;
|
||
|
#define CL(a) L ## a
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t Data1;
|
||
|
uint16_t Data2;
|
||
|
uint16_t Data3;
|
||
|
uint8_t Data4[8];
|
||
|
} efi_guid_t;
|
||
|
|
||
|
typedef struct {
|
||
|
uint8_t Type;
|
||
|
uint8_t SubType;
|
||
|
uint8_t Length[2];
|
||
|
} efi_device_path_t;
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t Type;
|
||
|
uint32_t Pad;
|
||
|
efi_physical_address_t PhysicalStart;
|
||
|
efi_virtual_address_t VirtualStart;
|
||
|
uint64_t NumberOfPages;
|
||
|
uint64_t Attribute;
|
||
|
} efi_memory_descriptor_t;
|
||
|
|
||
|
typedef struct {
|
||
|
uint64_t Signature;
|
||
|
uint32_t Revision;
|
||
|
uint32_t HeaderSize;
|
||
|
uint32_t CRC32;
|
||
|
uint32_t Reserved;
|
||
|
} efi_table_header_t;
|
||
|
|
||
|
/*** definitions only needed when efi.h (either from EDK II or gnu-efi) is NOT included ***/
|
||
|
|
||
|
#ifndef EFI_SPECIFICATION_MAJOR_REVISION
|
||
|
|
||
|
/* efibind.h */
|
||
|
#ifndef __WCHAR_TYPE__
|
||
|
# define __WCHAR_TYPE__ short
|
||
|
#endif
|
||
|
#define EFIERR(a) (0x8000000000000000 | (unsigned int)(a))
|
||
|
#define EFI_ERROR_MASK 0x8000000000000000
|
||
|
#define EFIERR_OEM(a) (0xc000000000000000 | (unsigned int)(a))
|
||
|
|
||
|
#define BAD_POINTER 0xFBFBFBFBFBFBFBFB
|
||
|
#define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF
|
||
|
|
||
|
#define EFI_SIGNATURE_16(A,B) ((A) | (B<<8))
|
||
|
#define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16))
|
||
|
#define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((uint64_t)(EFI_SIGNATURE_32(E,F,G,H)) << 32))
|
||
|
|
||
|
#ifndef EFIAPI
|
||
|
# ifdef _MSC_EXTENSIONS
|
||
|
# define EFIAPI __cdecl
|
||
|
# elif defined(HAVE_USE_MS_ABI)
|
||
|
# define EFIAPI __attribute__((ms_abi))
|
||
|
# else
|
||
|
# define EFIAPI
|
||
|
# endif
|
||
|
#endif
|
||
|
|
||
|
/* efistdarg.h */
|
||
|
typedef __builtin_va_list va_list;
|
||
|
#define va_start(v,l) __builtin_va_start(v,l)
|
||
|
#define va_end(v) __builtin_va_end(v)
|
||
|
#define va_arg(v,l) __builtin_va_arg(v,l)
|
||
|
#define va_copy(d,s) __builtin_va_copy(d,s)
|
||
|
|
||
|
/* efierr.h */
|
||
|
#define EFIWARN(a) (a)
|
||
|
#define EFI_ERROR(a) (((intn_t) 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_WARN_UNKOWN_GLYPH EFIWARN(1)
|
||
|
#define EFI_WARN_UNKNOWN_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)
|
||
|
|
||
|
/* efisetjmp.h */
|
||
|
#ifdef __x86_64__
|
||
|
typedef struct {
|
||
|
uint64_t Rbx;
|
||
|
uint64_t Rsp;
|
||
|
uint64_t Rbp;
|
||
|
uint64_t Rdi;
|
||
|
uint64_t Rsi;
|
||
|
uint64_t R12;
|
||
|
uint64_t R13;
|
||
|
uint64_t R14;
|
||
|
uint64_t R15;
|
||
|
uint64_t Rip;
|
||
|
uint64_t MxCsr;
|
||
|
uint8_t XmmBuffer[160];
|
||
|
} __attribute__((aligned(8))) jmp_buf[1];
|
||
|
#endif
|
||
|
#ifdef __aarch64__
|
||
|
typedef struct {
|
||
|
uint64_t X19;
|
||
|
uint64_t X20;
|
||
|
uint64_t X21;
|
||
|
uint64_t X22;
|
||
|
uint64_t X23;
|
||
|
uint64_t X24;
|
||
|
uint64_t X25;
|
||
|
uint64_t X26;
|
||
|
uint64_t X27;
|
||
|
uint64_t X28;
|
||
|
uint64_t FP;
|
||
|
uint64_t LR;
|
||
|
uint64_t IP0;
|
||
|
uint64_t reserved;
|
||
|
uint64_t D8;
|
||
|
uint64_t D9;
|
||
|
uint64_t D10;
|
||
|
uint64_t D11;
|
||
|
uint64_t D12;
|
||
|
uint64_t D13;
|
||
|
uint64_t D14;
|
||
|
uint64_t D15;
|
||
|
} __attribute__((aligned(8))) jmp_buf[1];
|
||
|
#endif
|
||
|
#if defined(__riscv) && __riscv_xlen == 64
|
||
|
typedef struct {
|
||
|
uint64_t pc;
|
||
|
uint64_t sp;
|
||
|
uint64_t regs[12];
|
||
|
double fp[12];
|
||
|
} __attribute__((aligned(8))) jmp_buf[1];
|
||
|
#endif
|
||
|
extern uintn_t setjmp(jmp_buf env) __attribute__((returns_twice));
|
||
|
extern void longjmp(jmp_buf env, uintn_t value) __attribute__((noreturn));
|
||
|
|
||
|
/* efidevp.h */
|
||
|
#define EFI_DEVICE_PATH_PROTOCOL_GUID { 0x9576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||
|
#define EFI_DP_TYPE_MASK 0x7F
|
||
|
#define EFI_DP_TYPE_UNPACKED 0x80
|
||
|
#define END_DEVICE_PATH_TYPE 0x7f
|
||
|
#define END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff
|
||
|
#define END_INSTANCE_DEVICE_PATH_SUBTYPE 0x01
|
||
|
#define END_DEVICE_PATH_LENGTH (sizeof(efi_device_path_t))
|
||
|
#define DP_IS_END_TYPE(a)
|
||
|
#define DP_IS_END_SUBTYPE(a) ( ((a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
|
||
|
#define DevicePathType(a) ( ((a)->Type) & EFI_DP_TYPE_MASK )
|
||
|
#define DevicePathSubType(a) ( (a)->SubType )
|
||
|
#define DevicePathNodeLength(a) ( ((a)->Length[0]) | ((a)->Length[1] << 8) )
|
||
|
#define NextDevicePathNode(a) ( (efi_device_path_t *) ( ((uint8_t *) (a)) + DevicePathNodeLength(a)))
|
||
|
#define IsDevicePathEndType(a) ( DevicePathType(a) == END_DEVICE_PATH_TYPE )
|
||
|
#define IsDevicePathEndSubType(a) ( (a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
|
||
|
#define IsDevicePathEnd(a) ( IsDevicePathEndType(a) && IsDevicePathEndSubType(a) )
|
||
|
#define IsDevicePathUnpacked(a) ( (a)->Type & EFI_DP_TYPE_UNPACKED )
|
||
|
#define SetDevicePathNodeLength(a,l) { \
|
||
|
(a)->Length[0] = (uint8_t) (l); \
|
||
|
(a)->Length[1] = (uint8_t) ((l) >> 8); \
|
||
|
}
|
||
|
#define SetDevicePathEndNode(a) { \
|
||
|
(a)->Type = END_DEVICE_PATH_TYPE; \
|
||
|
(a)->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE; \
|
||
|
(a)->Length[0] = sizeof(efi_device_path_t); \
|
||
|
(a)->Length[1] = 0; \
|
||
|
}
|
||
|
|
||
|
/* efiapi.h */
|
||
|
#define EFI_SPECIFICATION_MAJOR_REVISION 1
|
||
|
#define EFI_SPECIFICATION_MINOR_REVISION 02
|
||
|
|
||
|
#define TPL_APPLICATION 4
|
||
|
#define TPL_CALLBACK 8
|
||
|
#define TPL_NOTIFY 16
|
||
|
#define TPL_HIGH_LEVEL 31
|
||
|
#define EFI_TPL_APPLICATION TPL_APPLICATION
|
||
|
#define EFI_TPL_CALLBACK TPL_CALLBACK
|
||
|
#define EFI_TPL_NOTIFY TPL_NOTIFY
|
||
|
#define EFI_TPL_HIGH_LEVEL TPL_HIGH_LEVEL
|
||
|
|
||
|
#define NextMemoryDescriptor(Ptr,Size) ((efi_memory_descriptor_t *) (((uint8_t *) Ptr) + Size))
|
||
|
|
||
|
#define EFI_PAGE_SIZE 4096
|
||
|
#define EFI_PAGE_MASK 0xFFF
|
||
|
#define EFI_PAGE_SHIFT 12
|
||
|
|
||
|
#define EFI_SIZE_TO_PAGES(a) ( ((a) >> EFI_PAGE_SHIFT) + ((a) & EFI_PAGE_MASK ? 1 : 0) )
|
||
|
|
||
|
#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_RUNTIME 0x8000000000000000
|
||
|
#define EFI_MEMORY_DESCRIPTOR_VERSION 1
|
||
|
|
||
|
#define EVT_TIMER 0x80000000
|
||
|
#define EVT_RUNTIME 0x40000000
|
||
|
#define EVT_RUNTIME_CONTEXT 0x20000000
|
||
|
|
||
|
#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_EFI_SIGNAL_MASK 0x000000FF
|
||
|
#define EVT_EFI_SIGNAL_MAX 4
|
||
|
|
||
|
#define EFI_EVENT_TIMER EVT_TIMER
|
||
|
#define EFI_EVENT_RUNTIME EVT_RUNTIME
|
||
|
#define EFI_EVENT_RUNTIME_CONTEXT EVT_RUNTIME_CONTEXT
|
||
|
#define EFI_EVENT_NOTIFY_WAIT EVT_NOTIFY_WAIT
|
||
|
#define EFI_EVENT_NOTIFY_SIGNAL EVT_NOTIFY_SIGNAL
|
||
|
#define EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES EVT_SIGNAL_EXIT_BOOT_SERVICES
|
||
|
#define EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE
|
||
|
#define EFI_EVENT_EFI_SIGNAL_MASK EVT_EFI_SIGNAL_MASK
|
||
|
#define EFI_EVENT_EFI_SIGNAL_MAX EVT_EFI_SIGNAL_MAX
|
||
|
|
||
|
#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_OPTIONAL_PTR 0x00000001
|
||
|
#define EFI_INTERNAL_FNC 0x00000002
|
||
|
#define EFI_INTERNAL_PTR 0x00000004
|
||
|
|
||
|
#define EFI_GLOBAL_VARIABLE { 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} }
|
||
|
#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
|
||
|
#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010
|
||
|
#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020
|
||
|
#define EFI_VARIABLE_APPEND_WRITE 0x00000040
|
||
|
#define EFI_MAXIMUM_VARIABLE_SIZE 1024
|
||
|
|
||
|
#define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000
|
||
|
#define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000
|
||
|
#define CAPSULE_FLAGS_INITIATE_RESET 0x00040000
|
||
|
|
||
|
#define MPS_TABLE_GUID { 0xeb9d2d2f, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||
|
#define ACPI_TABLE_GUID { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
|
||
|
#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_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552
|
||
|
#define EFI_RUNTIME_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
|
||
|
|
||
|
#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
|
||
|
#define EFI_BOOT_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
|
||
|
|
||
|
#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
|
||
|
#define EFI_SYSTEM_TABLE_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
|
||
|
|
||
|
/* eficon.h */
|
||
|
#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID { 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||
|
#define EFI_BLACK 0x00
|
||
|
#define EFI_BLUE 0x01
|
||
|
#define EFI_GREEN 0x02
|
||
|
#define EFI_CYAN (EFI_BLUE | EFI_GREEN)
|
||
|
#define EFI_RED 0x04
|
||
|
#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_BRIGHT 0x08
|
||
|
#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_TEXT_ATTR(f,b) ((f) | ((b) << 4))
|
||
|
#define EFI_BACKGROUND_BLACK 0x00
|
||
|
#define EFI_BACKGROUND_BLUE 0x10
|
||
|
#define EFI_BACKGROUND_GREEN 0x20
|
||
|
#define EFI_BACKGROUND_CYAN (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN)
|
||
|
#define EFI_BACKGROUND_RED 0x40
|
||
|
#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)
|
||
|
#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
|
||
|
#define BLOCKELEMENT_FULL_BLOCK 0x2588
|
||
|
#define BLOCKELEMENT_LIGHT_SHADE 0x2591
|
||
|
#define GEOMETRICSHAPE_UP_TRIANGLE 0x25b2
|
||
|
#define GEOMETRICSHAPE_RIGHT_TRIANGLE 0x25ba
|
||
|
#define GEOMETRICSHAPE_DOWN_TRIANGLE 0x25bc
|
||
|
#define GEOMETRICSHAPE_LEFT_TRIANGLE 0x25c4
|
||
|
#define ARROW_UP 0x2191
|
||
|
#define ARROW_DOWN 0x2193
|
||
|
|
||
|
#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID { 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||
|
#define CHAR_NULL 0x0000
|
||
|
#define CHAR_BACKSPACE 0x0008
|
||
|
#define CHAR_TAB 0x0009
|
||
|
#define CHAR_LINEFEED 0x000A
|
||
|
#define CHAR_CARRIAGE_RETURN 0x000D
|
||
|
#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
|
||
|
|
||
|
/* efigpt.h */
|
||
|
#define PRIMARY_PART_HEADER_LBA 1
|
||
|
#define EFI_PTAB_HEADER_ID "EFI PART"
|
||
|
#define EFI_PART_USED_BY_EFI 0x0000000000000001
|
||
|
#define EFI_PART_REQUIRED_TO_FUNCTION 0x0000000000000002
|
||
|
#define EFI_PART_USED_BY_OS 0x0000000000000004
|
||
|
#define EFI_PART_REQUIRED_BY_OS 0x0000000000000008
|
||
|
#define EFI_PART_BACKUP_REQUIRED 0x0000000000000010
|
||
|
#define EFI_PART_USER_DATA 0x0000000000000020
|
||
|
#define EFI_PART_CRITICAL_USER_DATA 0x0000000000000040
|
||
|
#define EFI_PART_REDUNDANT_PARTITION 0x0000000000000080
|
||
|
#define EFI_PART_TYPE_UNUSED_GUID { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }
|
||
|
#define EFI_PART_TYPE_EFI_SYSTEM_PART_GUID { 0xc12a7328, 0xf81f, 0x11d2, {0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} }
|
||
|
#define EFI_PART_TYPE_LEGACY_MBR_GUID { 0x024dee41, 0x33e7, 0x11d3, {0x9d, 0x69, 0x00, 0x08, 0xc7, 0x81, 0xf3, 0x9f} }
|
||
|
|
||
|
/* Protocol GUIDs */
|
||
|
#ifndef INTERNAL_SHELL_GUID
|
||
|
#define INTERNAL_SHELL_GUID { 0xd65a6b8c, 0x71e5, 0x4df0, {0xa9, 0x09, 0xf0, 0xd2, 0x99, 0x2b, 0x5a, 0xa9} }
|
||
|
#endif
|
||
|
|
||
|
typedef enum {
|
||
|
AllocateAnyPages,
|
||
|
AllocateMaxAddress,
|
||
|
AllocateAddress,
|
||
|
MaxAllocateType
|
||
|
} efi_allocate_type_t;
|
||
|
|
||
|
typedef enum {
|
||
|
EfiReservedMemoryType,
|
||
|
EfiLoaderCode,
|
||
|
EfiLoaderData,
|
||
|
EfiBootServicesCode,
|
||
|
EfiBootServicesData,
|
||
|
EfiRuntimeServicesCode,
|
||
|
EfiRuntimeServicesData,
|
||
|
EfiConventionalMemory,
|
||
|
EfiUnusableMemory,
|
||
|
EfiACPIReclaimMemory,
|
||
|
EfiACPIMemoryNVS,
|
||
|
EfiMemoryMappedIO,
|
||
|
EfiMemoryMappedIOPortSpace,
|
||
|
EfiPalCode,
|
||
|
EfiPersistentMemory,
|
||
|
EfiUnacceptedMemoryType,
|
||
|
EfiMaxMemoryType
|
||
|
} efi_memory_type_t;
|
||
|
|
||
|
typedef enum {
|
||
|
TimerCancel,
|
||
|
TimerPeriodic,
|
||
|
TimerRelative,
|
||
|
TimerTypeMax
|
||
|
} efi_timer_delay_t;
|
||
|
|
||
|
typedef enum {
|
||
|
AllHandles,
|
||
|
ByRegisterNotify,
|
||
|
ByProtocol
|
||
|
} efi_locate_search_type_t;
|
||
|
|
||
|
typedef enum {
|
||
|
EfiResetCold,
|
||
|
EfiResetWarm,
|
||
|
EfiResetShutdown
|
||
|
} efi_reset_type_t;
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define efi_allocate_type_t EFI_ALLOCATE_TYPE
|
||
|
#define efi_memory_type_t EFI_MEMORY_TYPE
|
||
|
#define efi_timer_delay_t EFI_TIMER_DELAY
|
||
|
#define efi_locate_search_type_t EFI_LOCATE_SEARCH_TYPE
|
||
|
#define efi_reset_type_t EFI_RESET_TYPE
|
||
|
|
||
|
#endif
|
||
|
|
||
|
/*** standard input, output and error streams via ConIn, ConOut and StdErr ***/
|
||
|
typedef struct {
|
||
|
uint16_t ScanCode;
|
||
|
wchar_t UnicodeChar;
|
||
|
} efi_input_key_t;
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_input_reset_t)(void *This, boolean_t ExtendedVerification);
|
||
|
typedef efi_status_t (EFIAPI *efi_input_read_key_t)(void *This, efi_input_key_t *Key);
|
||
|
|
||
|
typedef struct {
|
||
|
efi_input_reset_t Reset;
|
||
|
efi_input_read_key_t ReadKeyStroke;
|
||
|
efi_event_t WaitForKey;
|
||
|
} simple_input_interface_t;
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_text_reset_t)(void *This, boolean_t ExtendedVerification);
|
||
|
typedef efi_status_t (EFIAPI *efi_text_output_string_t)(void *This, wchar_t *String);
|
||
|
typedef efi_status_t (EFIAPI *efi_text_test_string_t)(void *This, wchar_t *String);
|
||
|
typedef efi_status_t (EFIAPI *efi_text_query_mode_t)(void *This, uintn_t ModeNumber, uintn_t *Column, uintn_t *Row);
|
||
|
typedef efi_status_t (EFIAPI *efi_text_set_mode_t)(void *This, uintn_t ModeNumber);
|
||
|
typedef efi_status_t (EFIAPI *efi_text_set_attribute_t)(void *This, uintn_t Attribute);
|
||
|
typedef efi_status_t (EFIAPI *efi_text_clear_screen_t)(void *This);
|
||
|
typedef efi_status_t (EFIAPI *efi_text_set_cursor_t)(void *This, uintn_t Column, uintn_t Row);
|
||
|
typedef efi_status_t (EFIAPI *efi_text_enable_cursor_t)(void *This, boolean_t Enable);
|
||
|
|
||
|
typedef struct {
|
||
|
int32_t MaxMode;
|
||
|
int32_t Mode;
|
||
|
int32_t Attribute;
|
||
|
int32_t CursorColumn;
|
||
|
int32_t CursorRow;
|
||
|
boolean_t CursorVisible;
|
||
|
} simple_text_output_mode_t;
|
||
|
|
||
|
typedef struct {
|
||
|
efi_text_reset_t Reset;
|
||
|
efi_text_output_string_t OutputString;
|
||
|
efi_text_test_string_t TestString;
|
||
|
efi_text_query_mode_t QueryMode;
|
||
|
efi_text_set_mode_t SetMode;
|
||
|
efi_text_set_attribute_t SetAttribute;
|
||
|
efi_text_clear_screen_t ClearScreen;
|
||
|
efi_text_set_cursor_t SetCursorPosition;
|
||
|
efi_text_enable_cursor_t EnableCursor;
|
||
|
simple_text_output_mode_t *Mode;
|
||
|
} simple_text_output_interface_t;
|
||
|
|
||
|
/*** Runtime Services ***/
|
||
|
typedef struct {
|
||
|
uint16_t Year; /* 1998 - 2XXX */
|
||
|
uint8_t Month; /* 1 - 12 */
|
||
|
uint8_t Day; /* 1 - 31 */
|
||
|
uint8_t Hour; /* 0 - 23 */
|
||
|
uint8_t Minute; /* 0 - 59 */
|
||
|
uint8_t Second; /* 0 - 59 */
|
||
|
uint8_t Pad1;
|
||
|
uint32_t Nanosecond; /* 0 - 999,999,999 */
|
||
|
int16_t TimeZone; /* -1440 to 1440 or 2047 */
|
||
|
uint8_t Daylight;
|
||
|
uint8_t Pad2;
|
||
|
} efi_time_t;
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t Resolution;
|
||
|
uint32_t Accuracy;
|
||
|
boolean_t SetsToZero;
|
||
|
} efi_time_capabilities_t;
|
||
|
|
||
|
typedef struct {
|
||
|
efi_guid_t CapsuleGuid;
|
||
|
uint32_t HeaderSize;
|
||
|
uint32_t Flags;
|
||
|
uint32_t CapsuleImageSize;
|
||
|
} efi_capsule_header_t;
|
||
|
|
||
|
#ifndef DataBlock
|
||
|
#define DataBlock ContinuationPointer
|
||
|
#endif
|
||
|
typedef struct {
|
||
|
uint64_t Length;
|
||
|
efi_physical_address_t ContinuationPointer;
|
||
|
} efi_capsule_block_descriptor_t;
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_get_time_t)(efi_time_t *Time, efi_time_capabilities_t *Capabilities);
|
||
|
typedef efi_status_t (EFIAPI *efi_set_time_t)(efi_time_t *Time);
|
||
|
typedef efi_status_t (EFIAPI *efi_get_wakeup_time_t)(boolean_t *Enable, boolean_t *Pending, efi_time_t *Time);
|
||
|
typedef efi_status_t (EFIAPI *efi_set_wakeup_time_t)(boolean_t Enable, efi_time_t *Time);
|
||
|
typedef efi_status_t (EFIAPI *efi_set_virtual_address_map_t)(uintn_t MemoryMapSize, uintn_t DescriptorSize,
|
||
|
uint32_t DescriptorVersion, efi_memory_descriptor_t *VirtualMap);
|
||
|
typedef efi_status_t (EFIAPI *efi_convert_pointer_t)(uintn_t DebugDisposition, void **Address);
|
||
|
typedef efi_status_t (EFIAPI *efi_get_variable_t)(wchar_t *VariableName, efi_guid_t *VendorGuid, uint32_t *Attributes,
|
||
|
uintn_t *DataSize, void *Data);
|
||
|
typedef efi_status_t (EFIAPI *efi_get_next_variable_name_t)(uintn_t *VariableNameSize, wchar_t *VariableName,
|
||
|
efi_guid_t *VendorGuid);
|
||
|
typedef efi_status_t (EFIAPI *efi_set_variable_t)(wchar_t *VariableName, efi_guid_t *VendorGuid, uint32_t Attributes,
|
||
|
uintn_t DataSize, void *Data);
|
||
|
typedef efi_status_t (EFIAPI *efi_get_next_high_mono_t)(uint64_t *Count);
|
||
|
typedef efi_status_t (EFIAPI *efi_reset_system_t)(efi_reset_type_t ResetType, efi_status_t ResetStatus, uintn_t DataSize,
|
||
|
wchar_t *ResetData);
|
||
|
typedef efi_status_t (EFIAPI *efi_update_capsule_t)(efi_capsule_header_t **CapsuleHeaderArray, uintn_t CapsuleCount,
|
||
|
efi_physical_address_t ScatterGatherList);
|
||
|
typedef efi_status_t (EFIAPI *efi_query_capsule_capabilities_t)(efi_capsule_header_t **CapsuleHeaderArray, uintn_t CapsuleCount,
|
||
|
uint64_t *MaximumCapsuleSize, efi_reset_type_t *ResetType);
|
||
|
typedef efi_status_t (EFIAPI *efi_query_variable_info_t)(uint32_t Attributes, uint64_t *MaximumVariableStorageSize,
|
||
|
uint64_t *RemainingVariableStorageSize, uint64_t *MaximumVariableSize);
|
||
|
|
||
|
typedef struct {
|
||
|
efi_table_header_t Hdr;
|
||
|
|
||
|
efi_get_time_t GetTime;
|
||
|
efi_set_time_t SetTime;
|
||
|
efi_get_wakeup_time_t GetWakeupTime;
|
||
|
efi_set_wakeup_time_t SetWakeupTime;
|
||
|
|
||
|
efi_set_virtual_address_map_t SetVirtualAddressMap;
|
||
|
efi_convert_pointer_t ConvertPointer;
|
||
|
|
||
|
efi_get_variable_t GetVariable;
|
||
|
efi_get_next_variable_name_t GetNextVariableName;
|
||
|
efi_set_variable_t SetVariable;
|
||
|
|
||
|
efi_get_next_high_mono_t GetNextHighMonotonicCount;
|
||
|
efi_reset_system_t ResetSystem;
|
||
|
|
||
|
efi_update_capsule_t UpdateCapsule;
|
||
|
efi_query_capsule_capabilities_t QueryCapsuleCapabilities;
|
||
|
efi_query_variable_info_t QueryVariableInfo;
|
||
|
} efi_runtime_services_t;
|
||
|
extern efi_runtime_services_t *RT;
|
||
|
#define gRT RT
|
||
|
|
||
|
/** Boot Services ***/
|
||
|
typedef struct {
|
||
|
efi_handle_t AgentHandle;
|
||
|
efi_handle_t ControllerHandle;
|
||
|
uint32_t Attributes;
|
||
|
uint32_t OpenCount;
|
||
|
} efi_open_protocol_information_entry_t;
|
||
|
|
||
|
typedef efi_tpl_t (EFIAPI *efi_raise_tpl_t)(efi_tpl_t NewTpl);
|
||
|
typedef efi_tpl_t (EFIAPI *efi_restore_tpl_t)(efi_tpl_t OldTpl);
|
||
|
typedef efi_status_t (EFIAPI *efi_allocate_pages_t)(efi_allocate_type_t Type, efi_memory_type_t MemoryType,
|
||
|
uintn_t NoPages, efi_physical_address_t *Memory);
|
||
|
typedef efi_status_t (EFIAPI *efi_free_pages_t)(efi_physical_address_t Memory, uintn_t NoPages);
|
||
|
typedef efi_status_t (EFIAPI *efi_get_memory_map_t)(uintn_t *MemoryMapSize, efi_memory_descriptor_t *MemoryMap,
|
||
|
uintn_t *MapKey, uintn_t *DescriptorSize, uint32_t *DescriptorVersion);
|
||
|
typedef efi_status_t (EFIAPI *efi_allocate_pool_t)(efi_memory_type_t PoolType, uintn_t Size, void **Buffer);
|
||
|
typedef efi_status_t (EFIAPI *efi_free_pool_t)(void *Buffer);
|
||
|
typedef void (EFIAPI *efi_event_notify_t)(efi_event_t Event, void *Context);
|
||
|
typedef efi_status_t (EFIAPI *efi_create_event_t)(uint32_t Type, efi_tpl_t NotifyTpl, efi_event_notify_t NotifyFunction,
|
||
|
void *NextContext, efi_event_t *Event);
|
||
|
typedef efi_status_t (EFIAPI *efi_set_timer_t)(efi_event_t Event, efi_timer_delay_t Type, uint64_t TriggerTime);
|
||
|
typedef efi_status_t (EFIAPI *efi_wait_for_event_t)(uintn_t NumberOfEvents, efi_event_t *Event, uintn_t *Index);
|
||
|
typedef efi_status_t (EFIAPI *efi_signal_event_t)(efi_event_t Event);
|
||
|
typedef efi_status_t (EFIAPI *efi_close_event_t)(efi_event_t Event);
|
||
|
typedef efi_status_t (EFIAPI *efi_check_event_t)(efi_event_t Event);
|
||
|
typedef efi_status_t (EFIAPI *efi_handle_protocol_t)(efi_handle_t Handle, efi_guid_t *Protocol, void **Interface);
|
||
|
typedef efi_status_t (EFIAPI *efi_register_protocol_notify_t)(efi_guid_t *Protocol, efi_event_t Event, void **Registration);
|
||
|
typedef efi_status_t (EFIAPI *efi_locate_handle_t)(efi_locate_search_type_t SearchType, efi_guid_t *Protocol,
|
||
|
void *SearchKey, uintn_t *BufferSize, efi_handle_t *Buffer);
|
||
|
typedef efi_status_t (EFIAPI *efi_locate_device_path_t)(efi_guid_t *Protocol, efi_device_path_t **DevicePath,
|
||
|
efi_handle_t *Device);
|
||
|
typedef efi_status_t (EFIAPI *efi_install_configuration_table_t)(efi_guid_t *Guid, void *Table);
|
||
|
typedef efi_status_t (EFIAPI *efi_image_load_t)(boolean_t BootPolicy, efi_handle_t ParentImageHandle, efi_device_path_t *FilePath,
|
||
|
void *SourceBuffer, uintn_t SourceSize, efi_handle_t *ImageHandle);
|
||
|
typedef efi_status_t (EFIAPI *efi_image_start_t)(efi_handle_t ImageHandle, uintn_t *ExitDataSize, wchar_t **ExitData);
|
||
|
typedef efi_status_t (EFIAPI *efi_exit_t)(efi_handle_t ImageHandle, efi_status_t ExitStatus, uintn_t ExitDataSize,
|
||
|
wchar_t *ExitData);
|
||
|
typedef efi_status_t (EFIAPI *efi_exit_boot_services_t)(efi_handle_t ImageHandle, uintn_t MapKey);
|
||
|
typedef efi_status_t (EFIAPI *efi_get_next_monotonic_t)(uint64_t *Count);
|
||
|
typedef efi_status_t (EFIAPI *efi_stall_t)(uintn_t Microseconds);
|
||
|
typedef efi_status_t (EFIAPI *efi_set_watchdog_timer_t)(uintn_t Timeout, uint64_t WatchdogCode, uintn_t DataSize,
|
||
|
wchar_t *WatchdogData);
|
||
|
typedef efi_status_t (EFIAPI *efi_connect_controller_t)(efi_handle_t ControllerHandle, efi_handle_t *DriverImageHandle,
|
||
|
efi_device_path_t *RemainingDevicePath, boolean_t Recursive);
|
||
|
typedef efi_status_t (EFIAPI *efi_disconnect_controller_t)(efi_handle_t ControllerHandle, efi_handle_t DriverImageHandle,
|
||
|
efi_handle_t ChildHandle);
|
||
|
typedef efi_status_t (EFIAPI *efi_open_protocol_t)(efi_handle_t Handle, efi_guid_t *Protocol, void **Interface,
|
||
|
efi_handle_t AgentHandle, efi_handle_t ControllerHandle, uint32_t Attributes);
|
||
|
typedef efi_status_t (EFIAPI *efi_close_protocol_t)(efi_handle_t Handle, efi_guid_t *Protocol, efi_handle_t AgentHandle,
|
||
|
efi_handle_t ControllerHandle);
|
||
|
typedef efi_status_t (EFIAPI *efi_open_protocol_information_t)(efi_handle_t Handle, efi_guid_t *Protocol,
|
||
|
efi_open_protocol_information_entry_t**EntryBuffer, uintn_t *EntryCount);
|
||
|
typedef efi_status_t (EFIAPI *efi_protocols_per_handle_t)(efi_handle_t Handle, efi_guid_t ***ProtocolBuffer,
|
||
|
uintn_t *ProtocolBufferCount);
|
||
|
typedef efi_status_t (EFIAPI *efi_locate_handle_buffer_t)(efi_locate_search_type_t SearchType, efi_guid_t *Protocol,
|
||
|
void *SearchKey, uintn_t *NoHandles, efi_handle_t **Handles);
|
||
|
typedef efi_status_t (EFIAPI *efi_locate_protocol_t)(efi_guid_t *Protocol, void *Registration, void **Interface);
|
||
|
typedef efi_status_t (EFIAPI *efi_calculate_crc32_t)(void *Data, uintn_t DataSize, uint32_t *Crc32);
|
||
|
|
||
|
typedef struct {
|
||
|
efi_table_header_t Hdr;
|
||
|
|
||
|
efi_raise_tpl_t RaiseTPL;
|
||
|
efi_restore_tpl_t RestoreTPL;
|
||
|
|
||
|
efi_allocate_pages_t AllocatePages;
|
||
|
efi_free_pages_t FreePages;
|
||
|
efi_get_memory_map_t GetMemoryMap;
|
||
|
efi_allocate_pool_t AllocatePool;
|
||
|
efi_free_pool_t FreePool;
|
||
|
|
||
|
efi_create_event_t CreateEvent;
|
||
|
efi_set_timer_t SetTimer;
|
||
|
efi_wait_for_event_t WaitForEvent;
|
||
|
efi_signal_event_t SignalEvent;
|
||
|
efi_close_event_t CloseEvent;
|
||
|
efi_check_event_t CheckEvent;
|
||
|
|
||
|
void* InstallProtocolInterface; /* not defined yet */
|
||
|
void* ReinstallProtocolInterface;
|
||
|
void* UninstallProtocolInterface;
|
||
|
efi_handle_protocol_t HandleProtocol;
|
||
|
efi_handle_protocol_t PCHandleProtocol;
|
||
|
efi_register_protocol_notify_t RegisterProtocolNotify;
|
||
|
efi_locate_handle_t LocateHandle;
|
||
|
efi_locate_device_path_t LocateDevicePath;
|
||
|
efi_install_configuration_table_t InstallConfigurationTable;
|
||
|
|
||
|
efi_image_load_t LoadImage;
|
||
|
efi_image_start_t StartImage;
|
||
|
efi_exit_t Exit;
|
||
|
void* UnloadImage; /* not defined in gnu-efi either */
|
||
|
efi_exit_boot_services_t ExitBootServices;
|
||
|
|
||
|
efi_get_next_monotonic_t GetNextHighMonotonicCount;
|
||
|
efi_stall_t Stall;
|
||
|
efi_set_watchdog_timer_t SetWatchdogTimer;
|
||
|
|
||
|
efi_connect_controller_t ConnectController;
|
||
|
efi_disconnect_controller_t DisconnectController;
|
||
|
|
||
|
efi_open_protocol_t OpenProtocol;
|
||
|
efi_close_protocol_t CloseProtocol;
|
||
|
efi_open_protocol_information_t OpenProtocolInformation;
|
||
|
|
||
|
efi_protocols_per_handle_t ProtocolsPerHandle;
|
||
|
efi_locate_handle_buffer_t LocateHandleBuffer;
|
||
|
efi_locate_protocol_t LocateProtocol;
|
||
|
void* InstallMultipleProtocolInterfaces;
|
||
|
void* UninstallMultipleProtocolInterfaces;
|
||
|
|
||
|
efi_calculate_crc32_t CalculateCrc32;
|
||
|
} efi_boot_services_t;
|
||
|
extern efi_boot_services_t *BS;
|
||
|
#define gBS BS
|
||
|
|
||
|
/*** Loaded Image Protocol ***/
|
||
|
#ifndef EFI_LOADED_IMAGE_PROTOCOL_GUID
|
||
|
#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_LOADED_IMAGE_PROTOCOL_REVISION 0x1000
|
||
|
#define EFI_IMAGE_INFORMATION_REVISION EFI_LOADED_IMAGE_PROTOCOL_REVISION
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t Revision;
|
||
|
efi_handle_t ParentHandle;
|
||
|
void *SystemTable;
|
||
|
efi_handle_t DeviceHandle;
|
||
|
efi_device_path_t *FilePath;
|
||
|
void *Reserved;
|
||
|
uint32_t LoadOptionsSize;
|
||
|
void *LoadOptions;
|
||
|
void *ImageBase;
|
||
|
uint64_t ImageSize;
|
||
|
efi_memory_type_t ImageCodeType;
|
||
|
efi_memory_type_t ImageDataType;
|
||
|
} efi_loaded_image_protocol_t;
|
||
|
extern efi_loaded_image_protocol_t *LIP;
|
||
|
extern efi_handle_t IM;
|
||
|
|
||
|
/*** System Table ***/
|
||
|
typedef struct {
|
||
|
efi_guid_t VendorGuid;
|
||
|
void *VendorTable;
|
||
|
} efi_configuration_table_t;
|
||
|
|
||
|
typedef struct {
|
||
|
efi_table_header_t Hdr;
|
||
|
|
||
|
wchar_t *FirmwareVendor;
|
||
|
uint32_t FirmwareRevision;
|
||
|
|
||
|
efi_handle_t ConsoleInHandle;
|
||
|
simple_input_interface_t *ConIn;
|
||
|
|
||
|
efi_handle_t ConsoleOutHandle;
|
||
|
simple_text_output_interface_t *ConOut;
|
||
|
|
||
|
efi_handle_t ConsoleErrorHandle;
|
||
|
simple_text_output_interface_t *StdErr;
|
||
|
|
||
|
efi_runtime_services_t *RuntimeServices;
|
||
|
efi_boot_services_t *BootServices;
|
||
|
|
||
|
uintn_t NumberOfTableEntries;
|
||
|
efi_configuration_table_t *ConfigurationTable;
|
||
|
} efi_system_table_t;
|
||
|
extern efi_system_table_t *ST;
|
||
|
#define gST ST
|
||
|
|
||
|
/*** Simple File System Protocol ***/
|
||
|
#ifndef EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID
|
||
|
#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||
|
|
||
|
#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION 0x00010000
|
||
|
#define EFI_FILE_IO_INTERFACE_REVISION EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION
|
||
|
|
||
|
#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
|
||
|
|
||
|
#define EFI_FILE_PROTOCOL_REVISION 0x00010000
|
||
|
#define EFI_FILE_HANDLE_REVISION EFI_FILE_PROTOCOL_REVISION
|
||
|
#endif
|
||
|
|
||
|
#ifndef EFI_FILE_INFO_GUID
|
||
|
#define EFI_FILE_INFO_GUID { 0x9576e92, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||
|
#endif
|
||
|
|
||
|
#ifndef FILENAME_MAX
|
||
|
#define FILENAME_MAX 262 /* from FAT spec */
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
uint64_t Size;
|
||
|
uint64_t FileSize;
|
||
|
uint64_t PhysicalSize;
|
||
|
efi_time_t CreateTime;
|
||
|
efi_time_t LastAccessTime;
|
||
|
efi_time_t ModificationTime;
|
||
|
uint64_t Attribute;
|
||
|
wchar_t FileName[FILENAME_MAX];
|
||
|
} efi_file_info_t;
|
||
|
|
||
|
typedef struct efi_file_handle_s efi_file_handle_t;
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_volume_open_t)(void *This, efi_file_handle_t **Root);
|
||
|
typedef struct {
|
||
|
uint64_t Revision;
|
||
|
efi_volume_open_t OpenVolume;
|
||
|
} efi_simple_file_system_protocol_t;
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_file_open_t)(efi_file_handle_t *File, efi_file_handle_t **NewHandle, wchar_t *FileName,
|
||
|
uint64_t OpenMode, uint64_t Attributes);
|
||
|
typedef efi_status_t (EFIAPI *efi_file_close_t)(efi_file_handle_t *File);
|
||
|
typedef efi_status_t (EFIAPI *efi_file_delete_t)(efi_file_handle_t *File);
|
||
|
typedef efi_status_t (EFIAPI *efi_file_read_t)(efi_file_handle_t *File, uintn_t *BufferSize, void *Buffer);
|
||
|
typedef efi_status_t (EFIAPI *efi_file_write_t)(efi_file_handle_t *File, uintn_t *BufferSize, void *Buffer);
|
||
|
typedef efi_status_t (EFIAPI *efi_file_get_pos_t)(efi_file_handle_t *File, uint64_t *Position);
|
||
|
typedef efi_status_t (EFIAPI *efi_file_set_pos_t)(efi_file_handle_t *File, uint64_t Position);
|
||
|
typedef efi_status_t (EFIAPI *efi_file_get_info_t)(efi_file_handle_t *File, efi_guid_t *InformationType, uintn_t *BufferSize,
|
||
|
void *Buffer);
|
||
|
typedef efi_status_t (EFIAPI *efi_file_set_info_t)(efi_file_handle_t *File, efi_guid_t *InformationType, uintn_t BufferSize,
|
||
|
void *Buffer);
|
||
|
typedef efi_status_t (EFIAPI *efi_file_flush_t)(efi_file_handle_t *File);
|
||
|
|
||
|
struct efi_file_handle_s {
|
||
|
uint64_t Revision;
|
||
|
efi_file_open_t Open;
|
||
|
efi_file_close_t Close;
|
||
|
efi_file_delete_t Delete;
|
||
|
efi_file_read_t Read;
|
||
|
efi_file_write_t Write;
|
||
|
efi_file_get_pos_t GetPosition;
|
||
|
efi_file_set_pos_t SetPosition;
|
||
|
efi_file_get_info_t GetInfo;
|
||
|
efi_file_set_info_t SetInfo;
|
||
|
efi_file_flush_t Flush;
|
||
|
};
|
||
|
|
||
|
/*** Shell Parameter Protocols ***/
|
||
|
#ifndef EFI_SHELL_PARAMETERS_PROTOCOL_GUID
|
||
|
#define EFI_SHELL_PARAMETERS_PROTOCOL_GUID { 0x752f3136, 0x4e16, 0x4fdc, {0xa2, 0x2a, 0xe5, 0xf4, 0x68, 0x12, 0xf4, 0xca} }
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
wchar_t **Argv;
|
||
|
uintn_t Argc;
|
||
|
efi_handle_t StdIn;
|
||
|
efi_handle_t StdOut;
|
||
|
efi_handle_t StdErr;
|
||
|
} efi_shell_parameters_protocol_t;
|
||
|
|
||
|
#ifndef SHELL_INTERFACE_PROTOCOL_GUID
|
||
|
#define SHELL_INTERFACE_PROTOCOL_GUID { 0x47c7b223, 0xc42a, 0x11d2, {0x8e, 0x57, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
efi_handle_t ImageHandle;
|
||
|
void* *Info;
|
||
|
wchar_t **Argv;
|
||
|
uintn_t Argc;
|
||
|
wchar_t **RedirArgv;
|
||
|
uintn_t RedirArgc;
|
||
|
efi_handle_t StdIn;
|
||
|
efi_handle_t StdOut;
|
||
|
efi_handle_t StdErr;
|
||
|
} efi_shell_interface_protocol_t;
|
||
|
|
||
|
/*** Random Number Generator ***/
|
||
|
#ifndef EFI_RNG_PROTOCOL_GUID
|
||
|
#define EFI_RNG_PROTOCOL_GUID { 0x3152bca5, 0xeade, 0x433d, {0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44} }
|
||
|
#endif
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_rng_get_info_t)(void *This, uintn_t *RNGAlgorithmListSize, efi_guid_t *RNGAlgorithmList);
|
||
|
typedef efi_status_t (EFIAPI *efi_rng_get_rng_t)(void *This, efi_guid_t *RNGAlgorithm, uintn_t RNGValueLength, uint8_t *RNGValue);
|
||
|
|
||
|
typedef struct {
|
||
|
efi_rng_get_info_t GetInfo;
|
||
|
efi_rng_get_rng_t GetRNG;
|
||
|
} efi_rng_protocol_t;
|
||
|
|
||
|
/*** Serial IO Protocol ***/
|
||
|
#ifndef EFI_SERIAL_IO_PROTOCOL_GUID
|
||
|
#define EFI_SERIAL_IO_PROTOCOL_GUID { 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD} }
|
||
|
|
||
|
#define SERIAL_IO_INTERFACE_REVISION 0x00010000
|
||
|
#define EFI_SERIAL_CLEAR_TO_SEND 0x0010
|
||
|
#define EFI_SERIAL_DATA_SET_READY 0x0020
|
||
|
#define EFI_SERIAL_RING_INDICATE 0x0040
|
||
|
#define EFI_SERIAL_CARRIER_DETECT 0x0080
|
||
|
#define EFI_SERIAL_REQUEST_TO_SEND 0x0002
|
||
|
#define EFI_SERIAL_DATA_TERMINAL_READY 0x0001
|
||
|
#define EFI_SERIAL_INPUT_BUFFER_EMPTY 0x0100
|
||
|
#define EFI_SERIAL_OUTPUT_BUFFER_EMPTY 0x0200
|
||
|
#define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x1000
|
||
|
#define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x2000
|
||
|
#define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x4000
|
||
|
|
||
|
typedef enum {
|
||
|
DefaultParity,
|
||
|
NoParity,
|
||
|
EvenParity,
|
||
|
OddParity,
|
||
|
MarkParity,
|
||
|
SpaceParity
|
||
|
} efi_parity_type_t;
|
||
|
|
||
|
typedef enum {
|
||
|
DefaultStopBits,
|
||
|
OneStopBit,
|
||
|
OneFiveStopBits,
|
||
|
TwoStopBits
|
||
|
} efi_stop_bits_type_t;
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define efi_parity_type_t EFI_PARITY_TYPE
|
||
|
#define efi_stop_bits_type_t EFI_STOP_BITS_TYPE
|
||
|
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t ControlMask;
|
||
|
uint32_t Timeout;
|
||
|
uint64_t BaudRate;
|
||
|
uint32_t ReceiveFifoDepth;
|
||
|
uint32_t DataBits;
|
||
|
uint32_t Parity;
|
||
|
uint32_t StopBits;
|
||
|
} efi_serial_io_mode_t;
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_serial_reset_t)(void *This);
|
||
|
typedef efi_status_t (EFIAPI *efi_serial_set_attributes_t)(void *This, uint64_t BaudRate, uint32_t ReceiveFifoDepth,
|
||
|
uint32_t Timeout, efi_parity_type_t Parity, uint8_t DataBits, efi_stop_bits_type_t StopBits);
|
||
|
typedef efi_status_t (EFIAPI *efi_serial_set_control_bits_t)(void *This, uint32_t Control);
|
||
|
typedef efi_status_t (EFIAPI *efi_serial_get_control_bits_t)(void *This, uint32_t *Control);
|
||
|
typedef efi_status_t (EFIAPI *efi_serial_write_t)(void *This, uintn_t *BufferSize, void *Buffer);
|
||
|
typedef efi_status_t (EFIAPI *efi_serial_read_t)(void *This, uintn_t *BufferSize, void *Buffer);
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t Revision;
|
||
|
efi_serial_reset_t Reset;
|
||
|
efi_serial_set_attributes_t SetAttributes;
|
||
|
efi_serial_set_control_bits_t SetControl;
|
||
|
efi_serial_get_control_bits_t GetControl;
|
||
|
efi_serial_write_t Write;
|
||
|
efi_serial_read_t Read;
|
||
|
efi_serial_io_mode_t *Mode;
|
||
|
} efi_serial_io_protocol_t;
|
||
|
|
||
|
/*** Block IO Protocol ***/
|
||
|
#ifndef EFI_BLOCK_IO_PROTOCOL_GUID
|
||
|
#define EFI_BLOCK_IO_PROTOCOL_GUID { 0x964e5b21, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
|
||
|
|
||
|
#define EFI_BLOCK_IO_PROTOCOL_REVISION 0x00010000
|
||
|
#define EFI_BLOCK_IO_INTERFACE_REVISION EFI_BLOCK_IO_PROTOCOL_REVISION
|
||
|
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t MediaId;
|
||
|
boolean_t RemovableMedia;
|
||
|
boolean_t MediaPresent;
|
||
|
boolean_t LogicalPartition;
|
||
|
boolean_t ReadOnly;
|
||
|
boolean_t WriteCaching;
|
||
|
uint32_t BlockSize;
|
||
|
uint32_t IoAlign;
|
||
|
efi_lba_t LastBlock;
|
||
|
} efi_block_io_media_t;
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_block_reset_t)(void *This, boolean_t ExtendedVerification);
|
||
|
typedef efi_status_t (EFIAPI *efi_block_read_t)(void *This, uint32_t MediaId, efi_lba_t LBA, uintn_t BufferSize, void *Buffer);
|
||
|
typedef efi_status_t (EFIAPI *efi_block_write_t)(void *This, uint32_t MediaId, efi_lba_t LBA, uintn_t BufferSize, void *Buffer);
|
||
|
typedef efi_status_t (EFIAPI *efi_block_flush_t)(void *This);
|
||
|
|
||
|
typedef struct {
|
||
|
uint64_t Revision;
|
||
|
efi_block_io_media_t *Media;
|
||
|
efi_block_reset_t Reset;
|
||
|
efi_block_read_t ReadBlocks;
|
||
|
efi_block_write_t WriteBlocks;
|
||
|
efi_block_flush_t FlushBlocks;
|
||
|
} efi_block_io_t;
|
||
|
|
||
|
typedef struct {
|
||
|
off_t offset;
|
||
|
efi_block_io_t *bio;
|
||
|
} block_file_t;
|
||
|
|
||
|
/*** Graphics Output Protocol (not used, but could be useful to have) ***/
|
||
|
#ifndef EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID
|
||
|
#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_gop_pixel_format_t;
|
||
|
|
||
|
typedef enum {
|
||
|
EfiBltVideoFill,
|
||
|
EfiBltVideoToBltBuffer,
|
||
|
EfiBltBufferToVideo,
|
||
|
EfiBltVideoToVideo,
|
||
|
EfiGraphicsOutputBltOperationMax
|
||
|
} efi_gop_blt_operation_t;
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define efi_gop_pixel_format_t EFI_GRAPHICS_PIXEL_FORMAT
|
||
|
#define efi_gop_blt_operation_t EFI_GRAPHICS_OUTPUT_BLT_OPERATION
|
||
|
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t RedMask;
|
||
|
uint32_t GreenMask;
|
||
|
uint32_t BlueMask;
|
||
|
uint32_t ReservedMask;
|
||
|
} efi_gop_pixel_bitmask_t;
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t Version;
|
||
|
uint32_t HorizontalResolution;
|
||
|
uint32_t VerticalResolution;
|
||
|
efi_gop_pixel_format_t PixelFormat;
|
||
|
efi_gop_pixel_bitmask_t PixelInformation;
|
||
|
uint32_t PixelsPerScanLine;
|
||
|
} efi_gop_mode_info_t;
|
||
|
|
||
|
typedef struct {
|
||
|
uint32_t MaxMode;
|
||
|
uint32_t Mode;
|
||
|
efi_gop_mode_info_t *Information;
|
||
|
uintn_t SizeOfInfo;
|
||
|
efi_physical_address_t FrameBufferBase;
|
||
|
uintn_t FrameBufferSize;
|
||
|
} efi_gop_mode_t;
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_gop_query_mode_t)(void *This, uint32_t ModeNumber, uintn_t *SizeOfInfo,
|
||
|
efi_gop_mode_info_t **Info);
|
||
|
typedef efi_status_t (EFIAPI *efi_gop_set_mode_t)(void *This, uint32_t ModeNumber);
|
||
|
typedef efi_status_t (EFIAPI *efi_gop_blt_t)(void *This, uint32_t *BltBuffer, efi_gop_blt_operation_t BltOperation,
|
||
|
uintn_t SourceX, uintn_t SourceY, uintn_t DestinationX, uintn_t DestionationY, uintn_t Width, uintn_t Height, uintn_t Delta);
|
||
|
|
||
|
typedef struct {
|
||
|
efi_gop_query_mode_t QueryMode;
|
||
|
efi_gop_set_mode_t SetMode;
|
||
|
efi_gop_blt_t Blt;
|
||
|
efi_gop_mode_t *Mode;
|
||
|
} efi_gop_t;
|
||
|
|
||
|
/*** Simple Pointer Protocol (not used, but could be useful to have) ***/
|
||
|
#ifndef EFI_SIMPLE_POINTER_PROTOCOL_GUID
|
||
|
#define EFI_SIMPLE_POINTER_PROTOCOL_GUID { 0x31878c87, 0xb75, 0x11d5, { 0x9a, 0x4f, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
int32_t RelativeMovementX;
|
||
|
int32_t RelativeMovementY;
|
||
|
int32_t RelativeMovementZ;
|
||
|
boolean_t LeftButton;
|
||
|
boolean_t RightButton;
|
||
|
} efi_simple_pointer_state_t;
|
||
|
|
||
|
typedef struct {
|
||
|
uint64_t ResolutionX;
|
||
|
uint64_t ResolutionY;
|
||
|
uint64_t ResolutionZ;
|
||
|
boolean_t LeftButton;
|
||
|
boolean_t RightButton;
|
||
|
} efi_simple_pointer_mode_t;
|
||
|
|
||
|
typedef efi_status_t (EFIAPI *efi_simple_pointer_reset_t) (void *This, boolean_t ExtendedVerification);
|
||
|
typedef efi_status_t (EFIAPI *efi_simple_pointer_get_state_t) (void *This, efi_simple_pointer_state_t *State);
|
||
|
|
||
|
typedef struct {
|
||
|
efi_simple_pointer_reset_t Reset;
|
||
|
efi_simple_pointer_get_state_t GetState;
|
||
|
efi_event_t WaitForInput;
|
||
|
efi_simple_pointer_mode_t *Mode;
|
||
|
} efi_simple_pointer_protocol_t;
|
||
|
|
||
|
/*** Option ROM Protocol (not used, but could be useful to have) ***/
|
||
|
#ifndef EFI_PCI_OPTION_ROM_TABLE_GUID
|
||
|
#define EFI_PCI_OPTION_ROM_TABLE_GUID { 0x7462660f, 0x1cbd, 0x48da, {0xad, 0x11, 0x91, 0x71, 0x79, 0x13, 0x83, 0x1c} }
|
||
|
#endif
|
||
|
|
||
|
typedef struct {
|
||
|
efi_physical_address_t RomAddress;
|
||
|
efi_memory_type_t MemoryType;
|
||
|
uint32_t RomLength;
|
||
|
uint32_t Seg;
|
||
|
uint8_t Bus;
|
||
|
uint8_t Dev;
|
||
|
uint8_t Func;
|
||
|
boolean_t ExecutedLegacyBiosImage;
|
||
|
boolean_t DontLoadEfiRom;
|
||
|
} efi_pci_option_rom_descriptor_t;
|
||
|
|
||
|
typedef struct {
|
||
|
uint64_t PciOptionRomCount;
|
||
|
efi_pci_option_rom_descriptor_t *PciOptionRomDescriptors;
|
||
|
} efi_pci_option_rom_table_t;
|
||
|
|
||
|
/*** GPT partitioning table (not used, but could be useful to have) ***/
|
||
|
typedef struct {
|
||
|
efi_table_header_t Header;
|
||
|
efi_lba_t MyLBA;
|
||
|
efi_lba_t AlternateLBA;
|
||
|
efi_lba_t FirstUsableLBA;
|
||
|
efi_lba_t LastUsableLBA;
|
||
|
efi_guid_t DiskGUID;
|
||
|
efi_lba_t PartitionEntryLBA;
|
||
|
uint32_t NumberOfPartitionEntries;
|
||
|
uint32_t SizeOfPartitionEntry;
|
||
|
uint32_t PartitionEntryArrayCRC32;
|
||
|
} efi_partition_table_header_t;
|
||
|
|
||
|
typedef struct {
|
||
|
efi_guid_t PartitionTypeGUID;
|
||
|
efi_guid_t UniquePartitionGUID;
|
||
|
efi_lba_t StartingLBA;
|
||
|
efi_lba_t EndingLBA;
|
||
|
uint64_t Attributes;
|
||
|
wchar_t PartitionName[36];
|
||
|
} efi_partition_entry_t;
|
||
|
|
||
|
/*** POSIX definitions ***/
|
||
|
#define abs(x) ((x)<0?-(x):(x))
|
||
|
#define min(x,y) ((x)<(y)?(x):(y))
|
||
|
#define max(x,y) ((x)>(y)?(x):(y))
|
||
|
|
||
|
/* dirent.h */
|
||
|
#define IFTODT(mode) (((mode) & 0170000) >> 12)
|
||
|
#define DTTOIF(dirtype) ((dirtype) << 12)
|
||
|
#define DT_DIR 4
|
||
|
#define DT_REG 8
|
||
|
struct dirent {
|
||
|
unsigned short int d_reclen;
|
||
|
unsigned char d_type;
|
||
|
char_t d_name[FILENAME_MAX];
|
||
|
};
|
||
|
typedef struct efi_file_handle_s DIR;
|
||
|
extern DIR *opendir (const char_t *__name);
|
||
|
extern struct dirent *readdir (DIR *__dirp);
|
||
|
extern void rewinddir (DIR *__dirp);
|
||
|
extern int closedir (DIR *__dirp);
|
||
|
|
||
|
/* errno.h */
|
||
|
extern int errno;
|
||
|
#define EPERM 1 /* Operation not permitted */
|
||
|
#define ENOENT 2 /* No such file or directory */
|
||
|
#define ESRCH 3 /* No such process */
|
||
|
#define EINTR 4 /* Interrupted system call */
|
||
|
#define EIO 5 /* I/O error */
|
||
|
#define ENXIO 6 /* No such device or address */
|
||
|
#define E2BIG 7 /* Argument list too long */
|
||
|
#define ENOEXEC 8 /* Exec format error */
|
||
|
#define EBADF 9 /* Bad file number */
|
||
|
#define ECHILD 10 /* No child processes */
|
||
|
#define EAGAIN 11 /* Try again */
|
||
|
#define ENOMEM 12 /* Out of memory */
|
||
|
#define EACCES 13 /* Permission denied */
|
||
|
#define EFAULT 14 /* Bad address */
|
||
|
#define ENOTBLK 15 /* Block device required */
|
||
|
#define EBUSY 16 /* Device or resource busy */
|
||
|
#define EEXIST 17 /* File exists */
|
||
|
#define EXDEV 18 /* Cross-device link */
|
||
|
#define ENODEV 19 /* No such device */
|
||
|
#define ENOTDIR 20 /* Not a directory */
|
||
|
#define EISDIR 21 /* Is a directory */
|
||
|
#define EINVAL 22 /* Invalid argument */
|
||
|
#define ENFILE 23 /* File table overflow */
|
||
|
#define EMFILE 24 /* Too many open files */
|
||
|
#define ENOTTY 25 /* Not a typewriter */
|
||
|
#define ETXTBSY 26 /* Text file busy */
|
||
|
#define EFBIG 27 /* File too large */
|
||
|
#define ENOSPC 28 /* No space left on device */
|
||
|
#define ESPIPE 29 /* Illegal seek */
|
||
|
#define EROFS 30 /* Read-only file system */
|
||
|
#define EMLINK 31 /* Too many links */
|
||
|
#define EPIPE 32 /* Broken pipe */
|
||
|
#define EDOM 33 /* Math argument out of domain of func */
|
||
|
#define ERANGE 34 /* Math result not representable */
|
||
|
|
||
|
/* stdlib.h */
|
||
|
#define RAND_MAX 2147483647
|
||
|
typedef int (*__compar_fn_t) (const void *, const void *);
|
||
|
extern int atoi (const char_t *__nptr);
|
||
|
extern int64_t atol (const char_t *__nptr);
|
||
|
extern int64_t strtol (const char_t *__nptr, char_t **__endptr, int __base);
|
||
|
extern void *malloc (size_t __size);
|
||
|
extern void *calloc (size_t __nmemb, size_t __size);
|
||
|
extern void *realloc (void *__ptr, size_t __size);
|
||
|
extern void free (void *__ptr);
|
||
|
extern void abort (void);
|
||
|
extern void exit (int __status);
|
||
|
/* exit Boot Services function. Returns 0 on success. */
|
||
|
extern int exit_bs(void);
|
||
|
extern void *bsearch (const void *__key, const void *__base, size_t __nmemb, size_t __size, __compar_fn_t __compar);
|
||
|
extern void qsort (void *__base, size_t __nmemb, size_t __size, __compar_fn_t __compar);
|
||
|
extern int mblen (const char *__s, size_t __n);
|
||
|
extern int mbtowc (wchar_t * __pwc, const char * __s, size_t __n);
|
||
|
extern int wctomb (char *__s, wchar_t __wchar);
|
||
|
extern size_t mbstowcs (wchar_t *__pwcs, const char *__s, size_t __n);
|
||
|
extern size_t wcstombs (char *__s, const wchar_t *__pwcs, size_t __n);
|
||
|
extern void srand(unsigned int __seed);
|
||
|
extern int rand(void);
|
||
|
extern uint8_t *getenv(char_t *name, uintn_t *len);
|
||
|
extern int setenv(char_t *name, uintn_t len, uint8_t *data);
|
||
|
|
||
|
/* stdio.h */
|
||
|
#ifndef BUFSIZ
|
||
|
#define BUFSIZ 8192
|
||
|
#endif
|
||
|
#define SEEK_SET 0 /* Seek from beginning of file. */
|
||
|
#define SEEK_CUR 1 /* Seek from current position. */
|
||
|
#define SEEK_END 2 /* Seek from end of file. */
|
||
|
#define stdin (FILE*)ST->ConsoleInHandle
|
||
|
#define stdout (FILE*)ST->ConsoleOutHandle
|
||
|
#define stderr (FILE*)ST->ConsoleErrorHandle
|
||
|
typedef struct efi_file_handle_s FILE;
|
||
|
extern int fclose (FILE *__stream);
|
||
|
extern int fflush (FILE *__stream);
|
||
|
extern int remove (const char_t *__filename);
|
||
|
extern FILE *fopen (const char_t *__filename, const char_t *__modes);
|
||
|
extern size_t fread (void *__ptr, size_t __size, size_t __n, FILE *__stream);
|
||
|
extern size_t fwrite (const void *__ptr, size_t __size, size_t __n, FILE *__s);
|
||
|
extern int fseek (FILE *__stream, long int __off, int __whence);
|
||
|
extern long int ftell (FILE *__stream);
|
||
|
extern int feof (FILE *__stream);
|
||
|
extern int fprintf (FILE *__stream, const char_t *__format, ...);
|
||
|
extern int printf (const char_t *__format, ...);
|
||
|
extern int sprintf (char_t *__s, const char_t *__format, ...);
|
||
|
extern int vfprintf (FILE *__s, const char_t *__format, __builtin_va_list __arg);
|
||
|
extern int vprintf (const char_t *__format, __builtin_va_list __arg);
|
||
|
extern int vsprintf (char_t *__s, const char_t *__format, __builtin_va_list __arg);
|
||
|
extern int snprintf (char_t *__s, size_t __maxlen, const char_t *__format, ...);
|
||
|
extern int vsnprintf (char_t *__s, size_t __maxlen, const char_t *__format, __builtin_va_list __arg);
|
||
|
extern int getchar (void);
|
||
|
/* non-blocking, only returns UNICODE if there's any key pressed, 0 otherwise */
|
||
|
extern int getchar_ifany (void);
|
||
|
extern int putchar (int __c);
|
||
|
|
||
|
/* string.h */
|
||
|
extern void *memcpy(void *__dest, const void *__src, size_t __n);
|
||
|
extern void *memmove(void *__dest, const void *__src, size_t __n);
|
||
|
extern void *memset(void *__s, int __c, size_t __n);
|
||
|
extern int memcmp(const void *__s1, const void *__s2, size_t __n);
|
||
|
extern void *memchr(const void *__s, int __c, size_t __n);
|
||
|
extern void *memrchr(const void *__s, int __c, size_t __n);
|
||
|
void *memmem(const void *haystack, size_t hl, const void *needle, size_t nl);
|
||
|
void *memrmem(const void *haystack, size_t hl, const void *needle, size_t nl);
|
||
|
extern char_t *strcpy (char_t *__dest, const char_t *__src);
|
||
|
extern char_t *strncpy (char_t *__dest, const char_t *__src, size_t __n);
|
||
|
extern char_t *strcat (char_t *__dest, const char_t *__src);
|
||
|
extern char_t *strncat (char_t *__dest, const char_t *__src, size_t __n);
|
||
|
extern int strcmp (const char_t *__s1, const char_t *__s2);
|
||
|
extern int strncmp (const char_t *__s1, const char_t *__s2, size_t __n);
|
||
|
extern char_t *strdup (const char_t *__s);
|
||
|
extern char_t *strchr (const char_t *__s, int __c);
|
||
|
extern char_t *strrchr (const char_t *__s, int __c);
|
||
|
extern char_t *strstr (const char_t *__haystack, const char_t *__needle);
|
||
|
extern char_t *strtok (char_t *__s, const char_t *__delim);
|
||
|
extern char_t *strtok_r (char_t *__s, const char_t *__delim, char_t **__save_ptr);
|
||
|
extern size_t strlen (const char_t *__s);
|
||
|
|
||
|
/* sys/stat.h */
|
||
|
#define S_IREAD 0400 /* Read by owner. */
|
||
|
#define S_IWRITE 0200 /* Write by owner. */
|
||
|
#define S_IFMT 0170000 /* These bits determine file type. */
|
||
|
#define S_IFIFO 0010000 /* FIFO. */
|
||
|
#define S_IFCHR 0020000 /* Character device. */
|
||
|
#define S_IFDIR 0040000 /* Directory. */
|
||
|
#define S_IFBLK 0060000 /* Block device. */
|
||
|
#define S_IFREG 0100000 /* Regular file. */
|
||
|
#define S_ISTYPE(mode, mask) (((mode) & S_IFMT) == (mask))
|
||
|
#define S_ISCHR(mode) S_ISTYPE((mode), S_IFCHR)
|
||
|
#define S_ISDIR(mode) S_ISTYPE((mode), S_IFDIR)
|
||
|
#define S_ISBLK(mode) S_ISTYPE((mode), S_IFBLK)
|
||
|
#define S_ISREG(mode) S_ISTYPE((mode), S_IFREG)
|
||
|
#define S_ISFIFO(mode) S_ISTYPE((mode), S_IFIFO)
|
||
|
struct stat {
|
||
|
mode_t st_mode;
|
||
|
off_t st_size;
|
||
|
blkcnt_t st_blocks;
|
||
|
time_t st_atime;
|
||
|
time_t st_mtime;
|
||
|
time_t st_ctime;
|
||
|
};
|
||
|
extern int stat (const char_t *__file, struct stat *__buf);
|
||
|
extern int fstat (FILE *__f, struct stat *__buf);
|
||
|
extern int mkdir (const char_t *__path, mode_t __mode);
|
||
|
|
||
|
/* time.h */
|
||
|
struct tm {
|
||
|
int tm_sec; /* Seconds. [0-60] (1 leap second) */
|
||
|
int tm_min; /* Minutes. [0-59] */
|
||
|
int tm_hour; /* Hours. [0-23] */
|
||
|
int tm_mday; /* Day. [1-31] */
|
||
|
int tm_mon; /* Month. [0-11] */
|
||
|
int tm_year; /* Year - 1900. */
|
||
|
int tm_wday; /* Day of week. [0-6] (not set) */
|
||
|
int tm_yday; /* Days in year.[0-365] (not set) */
|
||
|
int tm_isdst; /* DST. [-1/0/1]*/
|
||
|
};
|
||
|
extern struct tm *localtime (const time_t *__timer);
|
||
|
extern time_t mktime(const struct tm *__tm);
|
||
|
extern time_t time(time_t *__timer);
|
||
|
|
||
|
/* unistd.h */
|
||
|
extern unsigned int sleep (unsigned int __seconds);
|
||
|
extern int usleep (unsigned long int __useconds);
|
||
|
extern int unlink (const wchar_t *__filename);
|
||
|
extern int rmdir (const wchar_t *__filename);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* _UEFI_H_ */
|