summaryrefslogtreecommitdiffstats
path: root/include/grub/efi
diff options
context:
space:
mode:
Diffstat (limited to 'include/grub/efi')
-rw-r--r--include/grub/efi/api.h1805
-rw-r--r--include/grub/efi/console.h31
-rw-r--r--include/grub/efi/console_control.h57
-rw-r--r--include/grub/efi/disk.h33
-rw-r--r--include/grub/efi/edid.h54
-rw-r--r--include/grub/efi/efi.h127
-rw-r--r--include/grub/efi/fdtload.h32
-rw-r--r--include/grub/efi/graphics_output.h115
-rw-r--r--include/grub/efi/memory.h38
-rw-r--r--include/grub/efi/pci.h319
-rw-r--r--include/grub/efi/pe32.h334
-rw-r--r--include/grub/efi/sb.h43
-rw-r--r--include/grub/efi/tpm.h198
-rw-r--r--include/grub/efi/uga_draw.h76
14 files changed, 3262 insertions, 0 deletions
diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h
new file mode 100644
index 0000000..f1a5221
--- /dev/null
+++ b/include/grub/efi/api.h
@@ -0,0 +1,1805 @@
+/* efi.h - declare EFI types and functions */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_API_HEADER
+#define GRUB_EFI_API_HEADER 1
+
+#include <grub/types.h>
+#include <grub/symbol.h>
+
+/* For consistency and safety, we name the EFI-defined types differently.
+ All names are transformed into lower case, _t appended, and
+ grub_efi_ prepended. */
+
+/* Constants. */
+#define GRUB_EFI_EVT_TIMER 0x80000000
+#define GRUB_EFI_EVT_RUNTIME 0x40000000
+#define GRUB_EFI_EVT_RUNTIME_CONTEXT 0x20000000
+#define GRUB_EFI_EVT_NOTIFY_WAIT 0x00000100
+#define GRUB_EFI_EVT_NOTIFY_SIGNAL 0x00000200
+#define GRUB_EFI_EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201
+#define GRUB_EFI_EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202
+
+#define GRUB_EFI_TPL_APPLICATION 4
+#define GRUB_EFI_TPL_CALLBACK 8
+#define GRUB_EFI_TPL_NOTIFY 16
+#define GRUB_EFI_TPL_HIGH_LEVEL 31
+
+#define GRUB_EFI_MEMORY_UC 0x0000000000000001LL
+#define GRUB_EFI_MEMORY_WC 0x0000000000000002LL
+#define GRUB_EFI_MEMORY_WT 0x0000000000000004LL
+#define GRUB_EFI_MEMORY_WB 0x0000000000000008LL
+#define GRUB_EFI_MEMORY_UCE 0x0000000000000010LL
+#define GRUB_EFI_MEMORY_WP 0x0000000000001000LL
+#define GRUB_EFI_MEMORY_RP 0x0000000000002000LL
+#define GRUB_EFI_MEMORY_XP 0x0000000000004000LL
+#define GRUB_EFI_MEMORY_NV 0x0000000000008000LL
+#define GRUB_EFI_MEMORY_MORE_RELIABLE 0x0000000000010000LL
+#define GRUB_EFI_MEMORY_RO 0x0000000000020000LL
+#define GRUB_EFI_MEMORY_RUNTIME 0x8000000000000000LL
+
+#define GRUB_EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001
+#define GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002
+#define GRUB_EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004
+#define GRUB_EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
+#define GRUB_EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
+#define GRUB_EFI_OPEN_PROTOCOL_BY_EXCLUSIVE 0x00000020
+
+#define GRUB_EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001ULL
+
+#define GRUB_EFI_VARIABLE_NON_VOLATILE 0x0000000000000001
+#define GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
+#define GRUB_EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004
+
+#define GRUB_EFI_TIME_ADJUST_DAYLIGHT 0x01
+#define GRUB_EFI_TIME_IN_DAYLIGHT 0x02
+
+#define GRUB_EFI_UNSPECIFIED_TIMEZONE 0x07FF
+
+#define GRUB_EFI_OPTIONAL_PTR 0x00000001
+
+#define GRUB_EFI_LOADED_IMAGE_GUID \
+ { 0x5b1b31a1, 0x9562, 0x11d2, \
+ { 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
+ }
+
+#define GRUB_EFI_DISK_IO_GUID \
+ { 0xce345171, 0xba0b, 0x11d2, \
+ { 0x8e, 0x4f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
+ }
+
+#define GRUB_EFI_BLOCK_IO_GUID \
+ { 0x964e5b21, 0x6459, 0x11d2, \
+ { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
+ }
+
+#define GRUB_EFI_SERIAL_IO_GUID \
+ { 0xbb25cf6f, 0xf1d4, 0x11d2, \
+ { 0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0xfd } \
+ }
+
+#define GRUB_EFI_SIMPLE_NETWORK_GUID \
+ { 0xa19832b9, 0xac25, 0x11d3, \
+ { 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_PXE_GUID \
+ { 0x03c4e603, 0xac28, 0x11d3, \
+ { 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_DEVICE_PATH_GUID \
+ { 0x09576e91, 0x6d3f, 0x11d2, \
+ { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
+ }
+
+#define GRUB_EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \
+ { 0x387477c1, 0x69c7, 0x11d2, \
+ { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
+ }
+
+#define GRUB_EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \
+ { 0xdd9e7534, 0x7762, 0x4698, \
+ { 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa } \
+ }
+
+#define GRUB_EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \
+ { 0x387477c2, 0x69c7, 0x11d2, \
+ { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
+ }
+
+#define GRUB_EFI_SIMPLE_POINTER_PROTOCOL_GUID \
+ { 0x31878c87, 0xb75, 0x11d5, \
+ { 0x9a, 0x4f, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_ABSOLUTE_POINTER_PROTOCOL_GUID \
+ { 0x8D59D32B, 0xC655, 0x4AE9, \
+ { 0x9B, 0x15, 0xF2, 0x59, 0x04, 0x99, 0x2A, 0x43 } \
+ }
+
+#define GRUB_EFI_DRIVER_BINDING_PROTOCOL_GUID \
+ { 0x18A031AB, 0xB443, 0x4D1A, \
+ { 0xA5, 0xC0, 0x0C, 0x09, 0x26, 0x1E, 0x9F, 0x71 } \
+ }
+
+#define GRUB_EFI_LOADED_IMAGE_PROTOCOL_GUID \
+ { 0x5B1B31A1, 0x9562, 0x11d2, \
+ { 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } \
+ }
+
+#define GRUB_EFI_LOAD_FILE_PROTOCOL_GUID \
+ { 0x56EC3091, 0x954C, 0x11d2, \
+ { 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B } \
+ }
+
+#define GRUB_EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \
+ { 0x0964e5b22, 0x6459, 0x11d2, \
+ { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
+ }
+
+#define GRUB_EFI_TAPE_IO_PROTOCOL_GUID \
+ { 0x1e93e633, 0xd65a, 0x459e, \
+ { 0xab, 0x84, 0x93, 0xd9, 0xec, 0x26, 0x6d, 0x18 } \
+ }
+
+#define GRUB_EFI_UNICODE_COLLATION_PROTOCOL_GUID \
+ { 0x1d85cd7f, 0xf43d, 0x11d2, \
+ { 0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_SCSI_IO_PROTOCOL_GUID \
+ { 0x932f47e6, 0x2362, 0x4002, \
+ { 0x80, 0x3e, 0x3c, 0xd5, 0x4b, 0x13, 0x8f, 0x85 } \
+ }
+
+#define GRUB_EFI_USB2_HC_PROTOCOL_GUID \
+ { 0x3e745226, 0x9818, 0x45b6, \
+ { 0xa2, 0xac, 0xd7, 0xcd, 0x0e, 0x8b, 0xa2, 0xbc } \
+ }
+
+#define GRUB_EFI_DEBUG_SUPPORT_PROTOCOL_GUID \
+ { 0x2755590C, 0x6F3C, 0x42FA, \
+ { 0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } \
+ }
+
+#define GRUB_EFI_DEBUGPORT_PROTOCOL_GUID \
+ { 0xEBA4E8D2, 0x3858, 0x41EC, \
+ { 0xA2, 0x81, 0x26, 0x47, 0xBA, 0x96, 0x60, 0xD0 } \
+ }
+
+#define GRUB_EFI_DECOMPRESS_PROTOCOL_GUID \
+ { 0xd8117cfe, 0x94a6, 0x11d4, \
+ { 0x9a, 0x3a, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \
+ { 0x8b843e20, 0x8132, 0x4852, \
+ { 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c } \
+ }
+
+#define GRUB_EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID \
+ { 0x379be4e, 0xd706, 0x437d, \
+ { 0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4 } \
+ }
+
+#define GRUB_EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL_GUID \
+ { 0x5c99a21, 0xc70f, 0x4ad2, \
+ { 0x8a, 0x5f, 0x35, 0xdf, 0x33, 0x43, 0xf5, 0x1e } \
+ }
+
+#define GRUB_EFI_ACPI_TABLE_PROTOCOL_GUID \
+ { 0xffe06bdd, 0x6107, 0x46a6, \
+ { 0x7b, 0xb2, 0x5a, 0x9c, 0x7e, 0xc5, 0x27, 0x5c} \
+ }
+
+#define GRUB_EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID \
+ { 0x587e72d7, 0xcc50, 0x4f79, \
+ { 0x82, 0x09, 0xca, 0x29, 0x1f, 0xc1, 0xa1, 0x0f } \
+ }
+
+#define GRUB_EFI_HII_DATABASE_PROTOCOL_GUID \
+ { 0xef9fc172, 0xa1b2, 0x4693, \
+ { 0xb3, 0x27, 0x6d, 0x32, 0xfc, 0x41, 0x60, 0x42 } \
+ }
+
+#define GRUB_EFI_HII_STRING_PROTOCOL_GUID \
+ { 0xfd96974, 0x23aa, 0x4cdc, \
+ { 0xb9, 0xcb, 0x98, 0xd1, 0x77, 0x50, 0x32, 0x2a } \
+ }
+
+#define GRUB_EFI_HII_IMAGE_PROTOCOL_GUID \
+ { 0x31a6406a, 0x6bdf, 0x4e46, \
+ { 0xb2, 0xa2, 0xeb, 0xaa, 0x89, 0xc4, 0x9, 0x20 } \
+ }
+
+#define GRUB_EFI_HII_FONT_PROTOCOL_GUID \
+ { 0xe9ca4775, 0x8657, 0x47fc, \
+ { 0x97, 0xe7, 0x7e, 0xd6, 0x5a, 0x8, 0x43, 0x24 } \
+ }
+
+#define GRUB_EFI_HII_CONFIGURATION_ACCESS_PROTOCOL_GUID \
+ { 0x330d4706, 0xf2a0, 0x4e4f, \
+ { 0xa3, 0x69, 0xb6, 0x6f, 0xa8, 0xd5, 0x43, 0x85 } \
+ }
+
+#define GRUB_EFI_COMPONENT_NAME2_PROTOCOL_GUID \
+ { 0x6a7a5cff, 0xe8d9, 0x4f70, \
+ { 0xba, 0xda, 0x75, 0xab, 0x30, 0x25, 0xce, 0x14} \
+ }
+
+#define GRUB_EFI_USB_IO_PROTOCOL_GUID \
+ { 0x2B2F68D6, 0x0CD2, 0x44cf, \
+ { 0x8E, 0x8B, 0xBB, 0xA2, 0x0B, 0x1B, 0x5B, 0x75 } \
+ }
+
+#define GRUB_EFI_TIANO_CUSTOM_DECOMPRESS_GUID \
+ { 0xa31280ad, 0x481e, 0x41b6, \
+ { 0x95, 0xe8, 0x12, 0x7f, 0x4c, 0x98, 0x47, 0x79 } \
+ }
+
+#define GRUB_EFI_CRC32_GUIDED_SECTION_EXTRACTION_GUID \
+ { 0xfc1bcdb0, 0x7d31, 0x49aa, \
+ { 0x93, 0x6a, 0xa4, 0x60, 0x0d, 0x9d, 0xd0, 0x83 } \
+ }
+
+#define GRUB_EFI_LZMA_CUSTOM_DECOMPRESS_GUID \
+ { 0xee4e5898, 0x3914, 0x4259, \
+ { 0x9d, 0x6e, 0xdc, 0x7b, 0xd7, 0x94, 0x03, 0xcf } \
+ }
+
+#define GRUB_EFI_TSC_FREQUENCY_GUID \
+ { 0xdba6a7e3, 0xbb57, 0x4be7, \
+ { 0x8a, 0xf8, 0xd5, 0x78, 0xdb, 0x7e, 0x56, 0x87 } \
+ }
+
+#define GRUB_EFI_SYSTEM_RESOURCE_TABLE_GUID \
+ { 0xb122a263, 0x3661, 0x4f68, \
+ { 0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80 } \
+ }
+
+#define GRUB_EFI_DXE_SERVICES_TABLE_GUID \
+ { 0x05ad34ba, 0x6f02, 0x4214, \
+ { 0x95, 0x2e, 0x4d, 0xa0, 0x39, 0x8e, 0x2b, 0xb9 } \
+ }
+
+#define GRUB_EFI_HOB_LIST_GUID \
+ { 0x7739f24c, 0x93d7, 0x11d4, \
+ { 0x9a, 0x3a, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_MEMORY_TYPE_INFORMATION_GUID \
+ { 0x4c19049f, 0x4137, 0x4dd3, \
+ { 0x9c, 0x10, 0x8b, 0x97, 0xa8, 0x3f, 0xfd, 0xfa } \
+ }
+
+#define GRUB_EFI_DEBUG_IMAGE_INFO_TABLE_GUID \
+ { 0x49152e77, 0x1ada, 0x4764, \
+ { 0xb7, 0xa2, 0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b } \
+ }
+
+#define GRUB_EFI_MPS_TABLE_GUID \
+ { 0xeb9d2d2f, 0x2d88, 0x11d3, \
+ { 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_ACPI_TABLE_GUID \
+ { 0xeb9d2d30, 0x2d88, 0x11d3, \
+ { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_ACPI_20_TABLE_GUID \
+ { 0x8868e871, 0xe4f1, 0x11d3, \
+ { 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
+ }
+
+#define GRUB_EFI_SMBIOS_TABLE_GUID \
+ { 0xeb9d2d31, 0x2d88, 0x11d3, \
+ { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_SMBIOS3_TABLE_GUID \
+ { 0xf2fd1544, 0x9794, 0x4a2c, \
+ { 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94 } \
+ }
+
+#define GRUB_EFI_SAL_TABLE_GUID \
+ { 0xeb9d2d32, 0x2d88, 0x11d3, \
+ { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
+ }
+
+#define GRUB_EFI_HCDP_TABLE_GUID \
+ { 0xf951938d, 0x620b, 0x42ef, \
+ { 0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98 } \
+ }
+
+#define GRUB_EFI_RT_PROPERTIES_TABLE_GUID \
+ { 0xeb66918a, 0x7eef, 0x402a, \
+ { 0x84, 0x2e, 0x93, 0x1d, 0x21, 0xc3, 0x8a, 0xe9 } \
+ }
+
+#define GRUB_EFI_DEVICE_TREE_GUID \
+ { 0xb1b621d5, 0xf19c, 0x41a5, \
+ { 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 } \
+ }
+
+#define GRUB_EFI_VENDOR_APPLE_GUID \
+ { 0x2B0585EB, 0xD8B8, 0x49A9, \
+ { 0x8B, 0x8C, 0xE2, 0x1B, 0x01, 0xAE, 0xF2, 0xB7 } \
+ }
+
+#define GRUB_EFI_SHIM_LOCK_GUID \
+ { 0x605dab50, 0xe046, 0x4300, \
+ { 0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23 } \
+ }
+
+#define GRUB_EFI_RNG_PROTOCOL_GUID \
+ { 0x3152bca5, 0xeade, 0x433d, \
+ { 0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44 } \
+ }
+
+struct grub_efi_sal_system_table
+{
+ grub_uint32_t signature;
+ grub_uint32_t total_table_len;
+ grub_uint16_t sal_rev;
+ grub_uint16_t entry_count;
+ grub_uint8_t checksum;
+ grub_uint8_t reserved1[7];
+ grub_uint16_t sal_a_version;
+ grub_uint16_t sal_b_version;
+ grub_uint8_t oem_id[32];
+ grub_uint8_t product_id[32];
+ grub_uint8_t reserved2[8];
+ grub_uint8_t entries[0];
+};
+
+enum
+ {
+ GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_ENTRYPOINT_DESCRIPTOR = 0,
+ GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_MEMORY_DESCRIPTOR = 1,
+ GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PLATFORM_FEATURES = 2,
+ GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_TRANSLATION_REGISTER_DESCRIPTOR = 3,
+ GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_PURGE_TRANSLATION_COHERENCE = 4,
+ GRUB_EFI_SAL_SYSTEM_TABLE_TYPE_AP_WAKEUP = 5
+ };
+
+struct grub_efi_sal_system_table_entrypoint_descriptor
+{
+ grub_uint8_t type;
+ grub_uint8_t pad[7];
+ grub_uint64_t pal_proc_addr;
+ grub_uint64_t sal_proc_addr;
+ grub_uint64_t global_data_ptr;
+ grub_uint64_t reserved[2];
+};
+
+struct grub_efi_sal_system_table_memory_descriptor
+{
+ grub_uint8_t type;
+ grub_uint8_t sal_used;
+ grub_uint8_t attr;
+ grub_uint8_t ar;
+ grub_uint8_t attr_mask;
+ grub_uint8_t mem_type;
+ grub_uint8_t usage;
+ grub_uint8_t unknown;
+ grub_uint64_t addr;
+ grub_uint64_t len;
+ grub_uint64_t unknown2;
+};
+
+struct grub_efi_sal_system_table_platform_features
+{
+ grub_uint8_t type;
+ grub_uint8_t flags;
+ grub_uint8_t reserved[14];
+};
+
+struct grub_efi_sal_system_table_translation_register_descriptor
+{
+ grub_uint8_t type;
+ grub_uint8_t register_type;
+ grub_uint8_t register_number;
+ grub_uint8_t reserved[5];
+ grub_uint64_t addr;
+ grub_uint64_t page_size;
+ grub_uint64_t reserver;
+};
+
+struct grub_efi_sal_system_table_purge_translation_coherence
+{
+ grub_uint8_t type;
+ grub_uint8_t reserved[3];
+ grub_uint32_t ndomains;
+ grub_uint64_t coherence;
+};
+
+struct grub_efi_sal_system_table_ap_wakeup
+{
+ grub_uint8_t type;
+ grub_uint8_t mechanism;
+ grub_uint8_t reserved[6];
+ grub_uint64_t vector;
+};
+
+enum
+ {
+ GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_BUSLOCK = 1,
+ GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IRQREDIRECT = 2,
+ GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_IPIREDIRECT = 4,
+ GRUB_EFI_SAL_SYSTEM_TABLE_PLATFORM_FEATURE_ITCDRIFT = 8,
+ };
+
+typedef enum grub_efi_parity_type
+ {
+ GRUB_EFI_SERIAL_DEFAULT_PARITY,
+ GRUB_EFI_SERIAL_NO_PARITY,
+ GRUB_EFI_SERIAL_EVEN_PARITY,
+ GRUB_EFI_SERIAL_ODD_PARITY
+ }
+grub_efi_parity_type_t;
+
+typedef enum grub_efi_stop_bits
+ {
+ GRUB_EFI_SERIAL_DEFAULT_STOP_BITS,
+ GRUB_EFI_SERIAL_1_STOP_BIT,
+ GRUB_EFI_SERIAL_1_5_STOP_BITS,
+ GRUB_EFI_SERIAL_2_STOP_BITS
+ }
+ grub_efi_stop_bits_t;
+
+/* Enumerations. */
+enum grub_efi_timer_delay
+ {
+ GRUB_EFI_TIMER_CANCEL,
+ GRUB_EFI_TIMER_PERIODIC,
+ GRUB_EFI_TIMER_RELATIVE
+ };
+typedef enum grub_efi_timer_delay grub_efi_timer_delay_t;
+
+enum grub_efi_allocate_type
+ {
+ GRUB_EFI_ALLOCATE_ANY_PAGES,
+ GRUB_EFI_ALLOCATE_MAX_ADDRESS,
+ GRUB_EFI_ALLOCATE_ADDRESS,
+ GRUB_EFI_MAX_ALLOCATION_TYPE
+ };
+typedef enum grub_efi_allocate_type grub_efi_allocate_type_t;
+
+enum grub_efi_memory_type
+ {
+ GRUB_EFI_RESERVED_MEMORY_TYPE,
+ GRUB_EFI_LOADER_CODE,
+ GRUB_EFI_LOADER_DATA,
+ GRUB_EFI_BOOT_SERVICES_CODE,
+ GRUB_EFI_BOOT_SERVICES_DATA,
+ GRUB_EFI_RUNTIME_SERVICES_CODE,
+ GRUB_EFI_RUNTIME_SERVICES_DATA,
+ GRUB_EFI_CONVENTIONAL_MEMORY,
+ GRUB_EFI_UNUSABLE_MEMORY,
+ GRUB_EFI_ACPI_RECLAIM_MEMORY,
+ GRUB_EFI_ACPI_MEMORY_NVS,
+ GRUB_EFI_MEMORY_MAPPED_IO,
+ GRUB_EFI_MEMORY_MAPPED_IO_PORT_SPACE,
+ GRUB_EFI_PAL_CODE,
+ GRUB_EFI_PERSISTENT_MEMORY,
+ GRUB_EFI_MAX_MEMORY_TYPE
+ };
+typedef enum grub_efi_memory_type grub_efi_memory_type_t;
+
+enum grub_efi_interface_type
+ {
+ GRUB_EFI_NATIVE_INTERFACE
+ };
+typedef enum grub_efi_interface_type grub_efi_interface_type_t;
+
+enum grub_efi_locate_search_type
+ {
+ GRUB_EFI_ALL_HANDLES,
+ GRUB_EFI_BY_REGISTER_NOTIFY,
+ GRUB_EFI_BY_PROTOCOL
+ };
+typedef enum grub_efi_locate_search_type grub_efi_locate_search_type_t;
+
+enum grub_efi_reset_type
+ {
+ GRUB_EFI_RESET_COLD,
+ GRUB_EFI_RESET_WARM,
+ GRUB_EFI_RESET_SHUTDOWN
+ };
+typedef enum grub_efi_reset_type grub_efi_reset_type_t;
+
+/* Types. */
+typedef char grub_efi_boolean_t;
+#if GRUB_CPU_SIZEOF_VOID_P == 8
+typedef grub_int64_t grub_efi_intn_t;
+typedef grub_uint64_t grub_efi_uintn_t;
+#else
+typedef grub_int32_t grub_efi_intn_t;
+typedef grub_uint32_t grub_efi_uintn_t;
+#endif
+typedef grub_int8_t grub_efi_int8_t;
+typedef grub_uint8_t grub_efi_uint8_t;
+typedef grub_int16_t grub_efi_int16_t;
+typedef grub_uint16_t grub_efi_uint16_t;
+typedef grub_int32_t grub_efi_int32_t;
+typedef grub_uint32_t grub_efi_uint32_t;
+typedef grub_int64_t grub_efi_int64_t;
+typedef grub_uint64_t grub_efi_uint64_t;
+typedef grub_uint8_t grub_efi_char8_t;
+typedef grub_uint16_t grub_efi_char16_t;
+
+typedef grub_efi_uintn_t grub_efi_status_t;
+
+#define GRUB_EFI_ERROR_CODE(value) \
+ ((((grub_efi_status_t) 1) << (sizeof (grub_efi_status_t) * 8 - 1)) | (value))
+
+#define GRUB_EFI_WARNING_CODE(value) (value)
+
+#define GRUB_EFI_SUCCESS 0
+
+#define GRUB_EFI_LOAD_ERROR GRUB_EFI_ERROR_CODE (1)
+#define GRUB_EFI_INVALID_PARAMETER GRUB_EFI_ERROR_CODE (2)
+#define GRUB_EFI_UNSUPPORTED GRUB_EFI_ERROR_CODE (3)
+#define GRUB_EFI_BAD_BUFFER_SIZE GRUB_EFI_ERROR_CODE (4)
+#define GRUB_EFI_BUFFER_TOO_SMALL GRUB_EFI_ERROR_CODE (5)
+#define GRUB_EFI_NOT_READY GRUB_EFI_ERROR_CODE (6)
+#define GRUB_EFI_DEVICE_ERROR GRUB_EFI_ERROR_CODE (7)
+#define GRUB_EFI_WRITE_PROTECTED GRUB_EFI_ERROR_CODE (8)
+#define GRUB_EFI_OUT_OF_RESOURCES GRUB_EFI_ERROR_CODE (9)
+#define GRUB_EFI_VOLUME_CORRUPTED GRUB_EFI_ERROR_CODE (10)
+#define GRUB_EFI_VOLUME_FULL GRUB_EFI_ERROR_CODE (11)
+#define GRUB_EFI_NO_MEDIA GRUB_EFI_ERROR_CODE (12)
+#define GRUB_EFI_MEDIA_CHANGED GRUB_EFI_ERROR_CODE (13)
+#define GRUB_EFI_NOT_FOUND GRUB_EFI_ERROR_CODE (14)
+#define GRUB_EFI_ACCESS_DENIED GRUB_EFI_ERROR_CODE (15)
+#define GRUB_EFI_NO_RESPONSE GRUB_EFI_ERROR_CODE (16)
+#define GRUB_EFI_NO_MAPPING GRUB_EFI_ERROR_CODE (17)
+#define GRUB_EFI_TIMEOUT GRUB_EFI_ERROR_CODE (18)
+#define GRUB_EFI_NOT_STARTED GRUB_EFI_ERROR_CODE (19)
+#define GRUB_EFI_ALREADY_STARTED GRUB_EFI_ERROR_CODE (20)
+#define GRUB_EFI_ABORTED GRUB_EFI_ERROR_CODE (21)
+#define GRUB_EFI_ICMP_ERROR GRUB_EFI_ERROR_CODE (22)
+#define GRUB_EFI_TFTP_ERROR GRUB_EFI_ERROR_CODE (23)
+#define GRUB_EFI_PROTOCOL_ERROR GRUB_EFI_ERROR_CODE (24)
+#define GRUB_EFI_INCOMPATIBLE_VERSION GRUB_EFI_ERROR_CODE (25)
+#define GRUB_EFI_SECURITY_VIOLATION GRUB_EFI_ERROR_CODE (26)
+#define GRUB_EFI_CRC_ERROR GRUB_EFI_ERROR_CODE (27)
+
+#define GRUB_EFI_WARN_UNKNOWN_GLYPH GRUB_EFI_WARNING_CODE (1)
+#define GRUB_EFI_WARN_DELETE_FAILURE GRUB_EFI_WARNING_CODE (2)
+#define GRUB_EFI_WARN_WRITE_FAILURE GRUB_EFI_WARNING_CODE (3)
+#define GRUB_EFI_WARN_BUFFER_TOO_SMALL GRUB_EFI_WARNING_CODE (4)
+
+typedef void *grub_efi_handle_t;
+typedef void *grub_efi_event_t;
+typedef grub_efi_uint64_t grub_efi_lba_t;
+typedef grub_efi_uintn_t grub_efi_tpl_t;
+typedef grub_uint8_t grub_efi_mac_address_t[32];
+typedef grub_uint8_t grub_efi_ipv4_address_t[4];
+typedef grub_uint16_t grub_efi_ipv6_address_t[8];
+typedef grub_uint8_t grub_efi_ip_address_t[8] __attribute__ ((aligned(4)));
+typedef grub_efi_uint64_t grub_efi_physical_address_t;
+typedef grub_efi_uint64_t grub_efi_virtual_address_t;
+
+struct grub_efi_guid
+{
+ grub_uint32_t data1;
+ grub_uint16_t data2;
+ grub_uint16_t data3;
+ grub_uint8_t data4[8];
+} __attribute__ ((aligned(8)));
+typedef struct grub_efi_guid grub_efi_guid_t;
+
+struct grub_efi_packed_guid
+{
+ grub_uint32_t data1;
+ grub_uint16_t data2;
+ grub_uint16_t data3;
+ grub_uint8_t data4[8];
+} GRUB_PACKED;
+typedef struct grub_efi_packed_guid grub_efi_packed_guid_t;
+
+/* XXX although the spec does not specify the padding, this actually
+ must have the padding! */
+struct grub_efi_memory_descriptor
+{
+ grub_efi_uint32_t type;
+ grub_efi_uint32_t padding;
+ grub_efi_physical_address_t physical_start;
+ grub_efi_virtual_address_t virtual_start;
+ grub_efi_uint64_t num_pages;
+ grub_efi_uint64_t attribute;
+} GRUB_PACKED;
+typedef struct grub_efi_memory_descriptor grub_efi_memory_descriptor_t;
+
+/* Device Path definitions. */
+struct grub_efi_device_path
+{
+ grub_efi_uint8_t type;
+ grub_efi_uint8_t subtype;
+ grub_efi_uint16_t length;
+} GRUB_PACKED;
+typedef struct grub_efi_device_path grub_efi_device_path_t;
+/* XXX EFI does not define EFI_DEVICE_PATH_PROTOCOL but uses it.
+ It seems to be identical to EFI_DEVICE_PATH. */
+typedef struct grub_efi_device_path grub_efi_device_path_protocol_t;
+
+#define GRUB_EFI_DEVICE_PATH_TYPE(dp) ((dp)->type & 0x7f)
+#define GRUB_EFI_DEVICE_PATH_SUBTYPE(dp) ((dp)->subtype)
+#define GRUB_EFI_DEVICE_PATH_LENGTH(dp) ((dp)->length)
+#define GRUB_EFI_DEVICE_PATH_VALID(dp) ((dp) != NULL && GRUB_EFI_DEVICE_PATH_LENGTH (dp) >= 4)
+
+/* The End of Device Path nodes. */
+#define GRUB_EFI_END_DEVICE_PATH_TYPE (0xff & 0x7f)
+
+#define GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff
+#define GRUB_EFI_END_THIS_DEVICE_PATH_SUBTYPE 0x01
+
+#define GRUB_EFI_END_ENTIRE_DEVICE_PATH(dp) \
+ (!GRUB_EFI_DEVICE_PATH_VALID (dp) || \
+ (GRUB_EFI_DEVICE_PATH_TYPE (dp) == GRUB_EFI_END_DEVICE_PATH_TYPE \
+ && (GRUB_EFI_DEVICE_PATH_SUBTYPE (dp) \
+ == GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE)))
+
+#define GRUB_EFI_NEXT_DEVICE_PATH(dp) \
+ (GRUB_EFI_DEVICE_PATH_VALID (dp) \
+ ? ((grub_efi_device_path_t *) \
+ ((char *) (dp) + GRUB_EFI_DEVICE_PATH_LENGTH (dp))) \
+ : NULL)
+
+/* Hardware Device Path. */
+#define GRUB_EFI_HARDWARE_DEVICE_PATH_TYPE 1
+
+#define GRUB_EFI_PCI_DEVICE_PATH_SUBTYPE 1
+
+struct grub_efi_pci_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint8_t function;
+ grub_efi_uint8_t device;
+} GRUB_PACKED;
+typedef struct grub_efi_pci_device_path grub_efi_pci_device_path_t;
+
+#define GRUB_EFI_PCCARD_DEVICE_PATH_SUBTYPE 2
+
+struct grub_efi_pccard_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint8_t function;
+} GRUB_PACKED;
+typedef struct grub_efi_pccard_device_path grub_efi_pccard_device_path_t;
+
+#define GRUB_EFI_MEMORY_MAPPED_DEVICE_PATH_SUBTYPE 3
+
+struct grub_efi_memory_mapped_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t memory_type;
+ grub_efi_physical_address_t start_address;
+ grub_efi_physical_address_t end_address;
+} GRUB_PACKED;
+typedef struct grub_efi_memory_mapped_device_path grub_efi_memory_mapped_device_path_t;
+
+#define GRUB_EFI_VENDOR_DEVICE_PATH_SUBTYPE 4
+
+struct grub_efi_vendor_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_packed_guid_t vendor_guid;
+ grub_efi_uint8_t vendor_defined_data[0];
+} GRUB_PACKED;
+typedef struct grub_efi_vendor_device_path grub_efi_vendor_device_path_t;
+
+#define GRUB_EFI_CONTROLLER_DEVICE_PATH_SUBTYPE 5
+
+struct grub_efi_controller_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t controller_number;
+} GRUB_PACKED;
+typedef struct grub_efi_controller_device_path grub_efi_controller_device_path_t;
+
+/* ACPI Device Path. */
+#define GRUB_EFI_ACPI_DEVICE_PATH_TYPE 2
+
+#define GRUB_EFI_ACPI_DEVICE_PATH_SUBTYPE 1
+
+struct grub_efi_acpi_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t hid;
+ grub_efi_uint32_t uid;
+} GRUB_PACKED;
+typedef struct grub_efi_acpi_device_path grub_efi_acpi_device_path_t;
+
+#define GRUB_EFI_EXPANDED_ACPI_DEVICE_PATH_SUBTYPE 2
+
+struct grub_efi_expanded_acpi_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t hid;
+ grub_efi_uint32_t uid;
+ grub_efi_uint32_t cid;
+ char hidstr[0];
+} GRUB_PACKED;
+typedef struct grub_efi_expanded_acpi_device_path grub_efi_expanded_acpi_device_path_t;
+
+#define GRUB_EFI_EXPANDED_ACPI_HIDSTR(dp) \
+ (((grub_efi_expanded_acpi_device_path_t *) dp)->hidstr)
+#define GRUB_EFI_EXPANDED_ACPI_UIDSTR(dp) \
+ (GRUB_EFI_EXPANDED_ACPI_HIDSTR(dp) \
+ + grub_strlen (GRUB_EFI_EXPANDED_ACPI_HIDSTR(dp)) + 1)
+#define GRUB_EFI_EXPANDED_ACPI_CIDSTR(dp) \
+ (GRUB_EFI_EXPANDED_ACPI_UIDSTR(dp) \
+ + grub_strlen (GRUB_EFI_EXPANDED_ACPI_UIDSTR(dp)) + 1)
+
+/* Messaging Device Path. */
+#define GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE 3
+
+#define GRUB_EFI_ATAPI_DEVICE_PATH_SUBTYPE 1
+
+struct grub_efi_atapi_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint8_t primary_secondary;
+ grub_efi_uint8_t slave_master;
+ grub_efi_uint16_t lun;
+} GRUB_PACKED;
+typedef struct grub_efi_atapi_device_path grub_efi_atapi_device_path_t;
+
+#define GRUB_EFI_SCSI_DEVICE_PATH_SUBTYPE 2
+
+struct grub_efi_scsi_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint16_t pun;
+ grub_efi_uint16_t lun;
+} GRUB_PACKED;
+typedef struct grub_efi_scsi_device_path grub_efi_scsi_device_path_t;
+
+#define GRUB_EFI_FIBRE_CHANNEL_DEVICE_PATH_SUBTYPE 3
+
+struct grub_efi_fibre_channel_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t reserved;
+ grub_efi_uint64_t wwn;
+ grub_efi_uint64_t lun;
+} GRUB_PACKED;
+typedef struct grub_efi_fibre_channel_device_path grub_efi_fibre_channel_device_path_t;
+
+#define GRUB_EFI_1394_DEVICE_PATH_SUBTYPE 4
+
+struct grub_efi_1394_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t reserved;
+ grub_efi_uint64_t guid;
+} GRUB_PACKED;
+typedef struct grub_efi_1394_device_path grub_efi_1394_device_path_t;
+
+#define GRUB_EFI_USB_DEVICE_PATH_SUBTYPE 5
+
+struct grub_efi_usb_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint8_t parent_port_number;
+ grub_efi_uint8_t usb_interface;
+} GRUB_PACKED;
+typedef struct grub_efi_usb_device_path grub_efi_usb_device_path_t;
+
+#define GRUB_EFI_USB_CLASS_DEVICE_PATH_SUBTYPE 15
+
+struct grub_efi_usb_class_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint16_t vendor_id;
+ grub_efi_uint16_t product_id;
+ grub_efi_uint8_t device_class;
+ grub_efi_uint8_t device_subclass;
+ grub_efi_uint8_t device_protocol;
+} GRUB_PACKED;
+typedef struct grub_efi_usb_class_device_path grub_efi_usb_class_device_path_t;
+
+#define GRUB_EFI_I2O_DEVICE_PATH_SUBTYPE 6
+
+struct grub_efi_i2o_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t tid;
+} GRUB_PACKED;
+typedef struct grub_efi_i2o_device_path grub_efi_i2o_device_path_t;
+
+#define GRUB_EFI_MAC_ADDRESS_DEVICE_PATH_SUBTYPE 11
+
+struct grub_efi_mac_address_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_mac_address_t mac_address;
+ grub_efi_uint8_t if_type;
+} GRUB_PACKED;
+typedef struct grub_efi_mac_address_device_path grub_efi_mac_address_device_path_t;
+
+#define GRUB_EFI_IPV4_DEVICE_PATH_SUBTYPE 12
+
+struct grub_efi_ipv4_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_ipv4_address_t local_ip_address;
+ grub_efi_ipv4_address_t remote_ip_address;
+ grub_efi_uint16_t local_port;
+ grub_efi_uint16_t remote_port;
+ grub_efi_uint16_t protocol;
+ grub_efi_uint8_t static_ip_address;
+} GRUB_PACKED;
+typedef struct grub_efi_ipv4_device_path grub_efi_ipv4_device_path_t;
+
+#define GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE 13
+
+struct grub_efi_ipv6_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_ipv6_address_t local_ip_address;
+ grub_efi_ipv6_address_t remote_ip_address;
+ grub_efi_uint16_t local_port;
+ grub_efi_uint16_t remote_port;
+ grub_efi_uint16_t protocol;
+ grub_efi_uint8_t static_ip_address;
+} GRUB_PACKED;
+typedef struct grub_efi_ipv6_device_path grub_efi_ipv6_device_path_t;
+
+#define GRUB_EFI_INFINIBAND_DEVICE_PATH_SUBTYPE 9
+
+struct grub_efi_infiniband_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t resource_flags;
+ grub_efi_uint8_t port_gid[16];
+ grub_efi_uint64_t remote_id;
+ grub_efi_uint64_t target_port_id;
+ grub_efi_uint64_t device_id;
+} GRUB_PACKED;
+typedef struct grub_efi_infiniband_device_path grub_efi_infiniband_device_path_t;
+
+#define GRUB_EFI_UART_DEVICE_PATH_SUBTYPE 14
+
+struct grub_efi_uart_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t reserved;
+ grub_efi_uint64_t baud_rate;
+ grub_efi_uint8_t data_bits;
+ grub_efi_uint8_t parity;
+ grub_efi_uint8_t stop_bits;
+} GRUB_PACKED;
+typedef struct grub_efi_uart_device_path grub_efi_uart_device_path_t;
+
+#define GRUB_EFI_SATA_DEVICE_PATH_SUBTYPE 18
+
+struct grub_efi_sata_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint16_t hba_port;
+ grub_efi_uint16_t multiplier_port;
+ grub_efi_uint16_t lun;
+} GRUB_PACKED;
+typedef struct grub_efi_sata_device_path grub_efi_sata_device_path_t;
+
+#define GRUB_EFI_VENDOR_MESSAGING_DEVICE_PATH_SUBTYPE 10
+
+/* Media Device Path. */
+#define GRUB_EFI_MEDIA_DEVICE_PATH_TYPE 4
+
+#define GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE 1
+
+struct grub_efi_hard_drive_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t partition_number;
+ grub_efi_lba_t partition_start;
+ grub_efi_lba_t partition_size;
+ grub_efi_uint8_t partition_signature[16];
+ grub_efi_uint8_t partmap_type;
+ grub_efi_uint8_t signature_type;
+} GRUB_PACKED;
+typedef struct grub_efi_hard_drive_device_path grub_efi_hard_drive_device_path_t;
+
+#define GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE 2
+
+struct grub_efi_cdrom_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint32_t boot_entry;
+ grub_efi_lba_t partition_start;
+ grub_efi_lba_t partition_size;
+} GRUB_PACKED;
+typedef struct grub_efi_cdrom_device_path grub_efi_cdrom_device_path_t;
+
+#define GRUB_EFI_VENDOR_MEDIA_DEVICE_PATH_SUBTYPE 3
+
+struct grub_efi_vendor_media_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_packed_guid_t vendor_guid;
+ grub_efi_uint8_t vendor_defined_data[0];
+} GRUB_PACKED;
+typedef struct grub_efi_vendor_media_device_path grub_efi_vendor_media_device_path_t;
+
+#define GRUB_EFI_FILE_PATH_DEVICE_PATH_SUBTYPE 4
+
+struct grub_efi_file_path_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_char16_t path_name[0];
+} GRUB_PACKED;
+typedef struct grub_efi_file_path_device_path grub_efi_file_path_device_path_t;
+
+#define GRUB_EFI_PROTOCOL_DEVICE_PATH_SUBTYPE 5
+
+struct grub_efi_protocol_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_packed_guid_t guid;
+} GRUB_PACKED;
+typedef struct grub_efi_protocol_device_path grub_efi_protocol_device_path_t;
+
+#define GRUB_EFI_PIWG_DEVICE_PATH_SUBTYPE 6
+
+struct grub_efi_piwg_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_packed_guid_t guid;
+} GRUB_PACKED;
+typedef struct grub_efi_piwg_device_path grub_efi_piwg_device_path_t;
+
+
+/* BIOS Boot Specification Device Path. */
+#define GRUB_EFI_BIOS_DEVICE_PATH_TYPE 5
+
+#define GRUB_EFI_BIOS_DEVICE_PATH_SUBTYPE 1
+
+struct grub_efi_bios_device_path
+{
+ grub_efi_device_path_t header;
+ grub_efi_uint16_t device_type;
+ grub_efi_uint16_t status_flags;
+ char description[0];
+} GRUB_PACKED;
+typedef struct grub_efi_bios_device_path grub_efi_bios_device_path_t;
+
+struct grub_efi_open_protocol_information_entry
+{
+ grub_efi_handle_t agent_handle;
+ grub_efi_handle_t controller_handle;
+ grub_efi_uint32_t attributes;
+ grub_efi_uint32_t open_count;
+};
+typedef struct grub_efi_open_protocol_information_entry grub_efi_open_protocol_information_entry_t;
+
+struct grub_efi_time
+{
+ grub_efi_uint16_t year;
+ grub_efi_uint8_t month;
+ grub_efi_uint8_t day;
+ grub_efi_uint8_t hour;
+ grub_efi_uint8_t minute;
+ grub_efi_uint8_t second;
+ grub_efi_uint8_t pad1;
+ grub_efi_uint32_t nanosecond;
+ grub_efi_int16_t time_zone;
+ grub_efi_uint8_t daylight;
+ grub_efi_uint8_t pad2;
+} GRUB_PACKED;
+typedef struct grub_efi_time grub_efi_time_t;
+
+struct grub_efi_time_capabilities
+{
+ grub_efi_uint32_t resolution;
+ grub_efi_uint32_t accuracy;
+ grub_efi_boolean_t sets_to_zero;
+};
+typedef struct grub_efi_time_capabilities grub_efi_time_capabilities_t;
+
+struct grub_efi_input_key
+{
+ grub_efi_uint16_t scan_code;
+ grub_efi_char16_t unicode_char;
+};
+typedef struct grub_efi_input_key grub_efi_input_key_t;
+
+typedef grub_efi_uint8_t grub_efi_key_toggle_state_t;
+struct grub_efi_key_state
+{
+ grub_efi_uint32_t key_shift_state;
+ grub_efi_key_toggle_state_t key_toggle_state;
+};
+typedef struct grub_efi_key_state grub_efi_key_state_t;
+
+#define GRUB_EFI_SHIFT_STATE_VALID 0x80000000
+#define GRUB_EFI_RIGHT_SHIFT_PRESSED 0x00000001
+#define GRUB_EFI_LEFT_SHIFT_PRESSED 0x00000002
+#define GRUB_EFI_RIGHT_CONTROL_PRESSED 0x00000004
+#define GRUB_EFI_LEFT_CONTROL_PRESSED 0x00000008
+#define GRUB_EFI_RIGHT_ALT_PRESSED 0x00000010
+#define GRUB_EFI_LEFT_ALT_PRESSED 0x00000020
+#define GRUB_EFI_RIGHT_LOGO_PRESSED 0x00000040
+#define GRUB_EFI_LEFT_LOGO_PRESSED 0x00000080
+#define GRUB_EFI_MENU_KEY_PRESSED 0x00000100
+#define GRUB_EFI_SYS_REQ_PRESSED 0x00000200
+
+#define GRUB_EFI_TOGGLE_STATE_VALID 0x80
+#define GRUB_EFI_KEY_STATE_EXPOSED 0x40
+#define GRUB_EFI_SCROLL_LOCK_ACTIVE 0x01
+#define GRUB_EFI_NUM_LOCK_ACTIVE 0x02
+#define GRUB_EFI_CAPS_LOCK_ACTIVE 0x04
+
+struct grub_efi_simple_text_output_mode
+{
+ grub_efi_int32_t max_mode;
+ grub_efi_int32_t mode;
+ grub_efi_int32_t attribute;
+ grub_efi_int32_t cursor_column;
+ grub_efi_int32_t cursor_row;
+ grub_efi_boolean_t cursor_visible;
+};
+typedef struct grub_efi_simple_text_output_mode grub_efi_simple_text_output_mode_t;
+
+/* Tables. */
+struct grub_efi_table_header
+{
+ grub_efi_uint64_t signature;
+ grub_efi_uint32_t revision;
+ grub_efi_uint32_t header_size;
+ grub_efi_uint32_t crc32;
+ grub_efi_uint32_t reserved;
+};
+typedef struct grub_efi_table_header grub_efi_table_header_t;
+
+struct grub_efi_boot_services
+{
+ grub_efi_table_header_t hdr;
+
+ grub_efi_tpl_t
+ (*raise_tpl) (grub_efi_tpl_t new_tpl);
+
+ void
+ (*restore_tpl) (grub_efi_tpl_t old_tpl);
+
+ grub_efi_status_t
+ (*allocate_pages) (grub_efi_allocate_type_t type,
+ grub_efi_memory_type_t memory_type,
+ grub_efi_uintn_t pages,
+ grub_efi_physical_address_t *memory);
+
+ grub_efi_status_t
+ (*free_pages) (grub_efi_physical_address_t memory,
+ grub_efi_uintn_t pages);
+
+ grub_efi_status_t
+ (*get_memory_map) (grub_efi_uintn_t *memory_map_size,
+ grub_efi_memory_descriptor_t *memory_map,
+ grub_efi_uintn_t *map_key,
+ grub_efi_uintn_t *descriptor_size,
+ grub_efi_uint32_t *descriptor_version);
+
+ grub_efi_status_t
+ (*allocate_pool) (grub_efi_memory_type_t pool_type,
+ grub_efi_uintn_t size,
+ void **buffer);
+
+ grub_efi_status_t
+ (*free_pool) (void *buffer);
+
+ grub_efi_status_t
+ (*create_event) (grub_efi_uint32_t type,
+ grub_efi_tpl_t notify_tpl,
+ void (*notify_function) (grub_efi_event_t event,
+ void *context),
+ void *notify_context,
+ grub_efi_event_t *event);
+
+ grub_efi_status_t
+ (*set_timer) (grub_efi_event_t event,
+ grub_efi_timer_delay_t type,
+ grub_efi_uint64_t trigger_time);
+
+ grub_efi_status_t
+ (*wait_for_event) (grub_efi_uintn_t num_events,
+ grub_efi_event_t *event,
+ grub_efi_uintn_t *index);
+
+ grub_efi_status_t
+ (*signal_event) (grub_efi_event_t event);
+
+ grub_efi_status_t
+ (*close_event) (grub_efi_event_t event);
+
+ grub_efi_status_t
+ (*check_event) (grub_efi_event_t event);
+
+ grub_efi_status_t
+ (*install_protocol_interface) (grub_efi_handle_t *handle,
+ grub_efi_guid_t *protocol,
+ grub_efi_interface_type_t protocol_interface_type,
+ void *protocol_interface);
+
+ grub_efi_status_t
+ (*reinstall_protocol_interface) (grub_efi_handle_t handle,
+ grub_efi_guid_t *protocol,
+ void *old_interface,
+ void *new_interface);
+
+ grub_efi_status_t
+ (*uninstall_protocol_interface) (grub_efi_handle_t handle,
+ grub_efi_guid_t *protocol,
+ void *protocol_interface);
+
+ grub_efi_status_t
+ (*handle_protocol) (grub_efi_handle_t handle,
+ grub_efi_guid_t *protocol,
+ void **protocol_interface);
+
+ void *reserved;
+
+ grub_efi_status_t
+ (*register_protocol_notify) (grub_efi_guid_t *protocol,
+ grub_efi_event_t event,
+ void **registration);
+
+ grub_efi_status_t
+ (*locate_handle) (grub_efi_locate_search_type_t search_type,
+ grub_efi_guid_t *protocol,
+ void *search_key,
+ grub_efi_uintn_t *buffer_size,
+ grub_efi_handle_t *buffer);
+
+ grub_efi_status_t
+ (*locate_device_path) (grub_efi_guid_t *protocol,
+ grub_efi_device_path_t **device_path,
+ grub_efi_handle_t *device);
+
+ grub_efi_status_t
+ (*install_configuration_table) (grub_efi_guid_t *guid, void *table);
+
+ grub_efi_status_t
+ (*load_image) (grub_efi_boolean_t boot_policy,
+ grub_efi_handle_t parent_image_handle,
+ grub_efi_device_path_t *file_path,
+ void *source_buffer,
+ grub_efi_uintn_t source_size,
+ grub_efi_handle_t *image_handle);
+
+ grub_efi_status_t
+ (*start_image) (grub_efi_handle_t image_handle,
+ grub_efi_uintn_t *exit_data_size,
+ grub_efi_char16_t **exit_data);
+
+ grub_efi_status_t
+ (*exit) (grub_efi_handle_t image_handle,
+ grub_efi_status_t exit_status,
+ grub_efi_uintn_t exit_data_size,
+ grub_efi_char16_t *exit_data) __attribute__((noreturn));
+
+ grub_efi_status_t
+ (*unload_image) (grub_efi_handle_t image_handle);
+
+ grub_efi_status_t
+ (*exit_boot_services) (grub_efi_handle_t image_handle,
+ grub_efi_uintn_t map_key);
+
+ grub_efi_status_t
+ (*get_next_monotonic_count) (grub_efi_uint64_t *count);
+
+ grub_efi_status_t
+ (*stall) (grub_efi_uintn_t microseconds);
+
+ grub_efi_status_t
+ (*set_watchdog_timer) (grub_efi_uintn_t timeout,
+ grub_efi_uint64_t watchdog_code,
+ grub_efi_uintn_t data_size,
+ grub_efi_char16_t *watchdog_data);
+
+ grub_efi_status_t
+ (*connect_controller) (grub_efi_handle_t controller_handle,
+ grub_efi_handle_t *driver_image_handle,
+ grub_efi_device_path_protocol_t *remaining_device_path,
+ grub_efi_boolean_t recursive);
+
+ grub_efi_status_t
+ (*disconnect_controller) (grub_efi_handle_t controller_handle,
+ grub_efi_handle_t driver_image_handle,
+ grub_efi_handle_t child_handle);
+
+ grub_efi_status_t
+ (*open_protocol) (grub_efi_handle_t handle,
+ grub_efi_guid_t *protocol,
+ void **protocol_interface,
+ grub_efi_handle_t agent_handle,
+ grub_efi_handle_t controller_handle,
+ grub_efi_uint32_t attributes);
+
+ grub_efi_status_t
+ (*close_protocol) (grub_efi_handle_t handle,
+ grub_efi_guid_t *protocol,
+ grub_efi_handle_t agent_handle,
+ grub_efi_handle_t controller_handle);
+
+ grub_efi_status_t
+ (*open_protocol_information) (grub_efi_handle_t handle,
+ grub_efi_guid_t *protocol,
+ grub_efi_open_protocol_information_entry_t **entry_buffer,
+ grub_efi_uintn_t *entry_count);
+
+ grub_efi_status_t
+ (*protocols_per_handle) (grub_efi_handle_t handle,
+ grub_efi_packed_guid_t ***protocol_buffer,
+ grub_efi_uintn_t *protocol_buffer_count);
+
+ grub_efi_status_t
+ (*locate_handle_buffer) (grub_efi_locate_search_type_t search_type,
+ grub_efi_guid_t *protocol,
+ void *search_key,
+ grub_efi_uintn_t *no_handles,
+ grub_efi_handle_t **buffer);
+
+ grub_efi_status_t
+ (*locate_protocol) (grub_efi_guid_t *protocol,
+ void *registration,
+ void **protocol_interface);
+
+ grub_efi_status_t
+ (*install_multiple_protocol_interfaces) (grub_efi_handle_t *handle, ...);
+
+ grub_efi_status_t
+ (*uninstall_multiple_protocol_interfaces) (grub_efi_handle_t handle, ...);
+
+ grub_efi_status_t
+ (*calculate_crc32) (void *data,
+ grub_efi_uintn_t data_size,
+ grub_efi_uint32_t *crc32);
+
+ void
+ (*copy_mem) (void *destination, void *source, grub_efi_uintn_t length);
+
+ void
+ (*set_mem) (void *buffer, grub_efi_uintn_t size, grub_efi_uint8_t value);
+};
+typedef struct grub_efi_boot_services grub_efi_boot_services_t;
+
+struct grub_efi_runtime_services
+{
+ grub_efi_table_header_t hdr;
+
+ grub_efi_status_t
+ (*get_time) (grub_efi_time_t *time,
+ grub_efi_time_capabilities_t *capabilities);
+
+ grub_efi_status_t
+ (*set_time) (grub_efi_time_t *time);
+
+ grub_efi_status_t
+ (*get_wakeup_time) (grub_efi_boolean_t *enabled,
+ grub_efi_boolean_t *pending,
+ grub_efi_time_t *time);
+
+ grub_efi_status_t
+ (*set_wakeup_time) (grub_efi_boolean_t enabled,
+ grub_efi_time_t *time);
+
+ grub_efi_status_t
+ (*set_virtual_address_map) (grub_efi_uintn_t memory_map_size,
+ grub_efi_uintn_t descriptor_size,
+ grub_efi_uint32_t descriptor_version,
+ grub_efi_memory_descriptor_t *virtual_map);
+
+ grub_efi_status_t
+ (*convert_pointer) (grub_efi_uintn_t debug_disposition, void **address);
+
+#define GRUB_EFI_GLOBAL_VARIABLE_GUID \
+ { 0x8BE4DF61, 0x93CA, 0x11d2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }}
+
+
+ grub_efi_status_t
+ (*get_variable) (grub_efi_char16_t *variable_name,
+ const grub_efi_guid_t *vendor_guid,
+ grub_efi_uint32_t *attributes,
+ grub_efi_uintn_t *data_size,
+ void *data);
+
+ grub_efi_status_t
+ (*get_next_variable_name) (grub_efi_uintn_t *variable_name_size,
+ grub_efi_char16_t *variable_name,
+ grub_efi_guid_t *vendor_guid);
+
+ grub_efi_status_t
+ (*set_variable) (grub_efi_char16_t *variable_name,
+ const grub_efi_guid_t *vendor_guid,
+ grub_efi_uint32_t attributes,
+ grub_efi_uintn_t data_size,
+ void *data);
+
+ grub_efi_status_t
+ (*get_next_high_monotonic_count) (grub_efi_uint32_t *high_count);
+
+ void
+ (*reset_system) (grub_efi_reset_type_t reset_type,
+ grub_efi_status_t reset_status,
+ grub_efi_uintn_t data_size,
+ grub_efi_char16_t *reset_data);
+};
+typedef struct grub_efi_runtime_services grub_efi_runtime_services_t;
+
+struct grub_efi_configuration_table
+{
+ grub_efi_packed_guid_t vendor_guid;
+ void *vendor_table;
+} GRUB_PACKED;
+typedef struct grub_efi_configuration_table grub_efi_configuration_table_t;
+
+#define GRUB_EFIEMU_SYSTEM_TABLE_SIGNATURE 0x5453595320494249LL
+#define GRUB_EFIEMU_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552LL
+
+struct grub_efi_serial_io_interface
+{
+ grub_efi_uint32_t revision;
+ void (*reset) (void);
+ grub_efi_status_t (*set_attributes) (struct grub_efi_serial_io_interface *this,
+ grub_efi_uint64_t speed,
+ grub_efi_uint32_t fifo_depth,
+ grub_efi_uint32_t timeout,
+ grub_efi_parity_type_t parity,
+ grub_uint8_t word_len,
+ grub_efi_stop_bits_t stop_bits);
+ grub_efi_status_t (*set_control_bits) (struct grub_efi_serial_io_interface *this,
+ grub_efi_uint32_t flags);
+ void (*get_control_bits) (void);
+ grub_efi_status_t (*write) (struct grub_efi_serial_io_interface *this,
+ grub_efi_uintn_t *buf_size,
+ void *buffer);
+ grub_efi_status_t (*read) (struct grub_efi_serial_io_interface *this,
+ grub_efi_uintn_t *buf_size,
+ void *buffer);
+};
+
+struct grub_efi_simple_input_interface
+{
+ grub_efi_status_t
+ (*reset) (struct grub_efi_simple_input_interface *this,
+ grub_efi_boolean_t extended_verification);
+
+ grub_efi_status_t
+ (*read_key_stroke) (struct grub_efi_simple_input_interface *this,
+ grub_efi_input_key_t *key);
+
+ grub_efi_event_t wait_for_key;
+};
+typedef struct grub_efi_simple_input_interface grub_efi_simple_input_interface_t;
+
+struct grub_efi_key_data {
+ grub_efi_input_key_t key;
+ grub_efi_key_state_t key_state;
+};
+typedef struct grub_efi_key_data grub_efi_key_data_t;
+
+typedef grub_efi_status_t (*grub_efi_key_notify_function_t) (
+ grub_efi_key_data_t *key_data
+ );
+
+struct grub_efi_simple_text_input_ex_interface
+{
+ grub_efi_status_t
+ (*reset) (struct grub_efi_simple_text_input_ex_interface *this,
+ grub_efi_boolean_t extended_verification);
+
+ grub_efi_status_t
+ (*read_key_stroke) (struct grub_efi_simple_text_input_ex_interface *this,
+ grub_efi_key_data_t *key_data);
+
+ grub_efi_event_t wait_for_key;
+
+ grub_efi_status_t
+ (*set_state) (struct grub_efi_simple_text_input_ex_interface *this,
+ grub_efi_key_toggle_state_t *key_toggle_state);
+
+ grub_efi_status_t
+ (*register_key_notify) (struct grub_efi_simple_text_input_ex_interface *this,
+ grub_efi_key_data_t *key_data,
+ grub_efi_key_notify_function_t key_notification_function);
+
+ grub_efi_status_t
+ (*unregister_key_notify) (struct grub_efi_simple_text_input_ex_interface *this,
+ void *notification_handle);
+};
+typedef struct grub_efi_simple_text_input_ex_interface grub_efi_simple_text_input_ex_interface_t;
+
+struct grub_efi_simple_text_output_interface
+{
+ grub_efi_status_t
+ (*reset) (struct grub_efi_simple_text_output_interface *this,
+ grub_efi_boolean_t extended_verification);
+
+ grub_efi_status_t
+ (*output_string) (struct grub_efi_simple_text_output_interface *this,
+ grub_efi_char16_t *string);
+
+ grub_efi_status_t
+ (*test_string) (struct grub_efi_simple_text_output_interface *this,
+ grub_efi_char16_t *string);
+
+ grub_efi_status_t
+ (*query_mode) (struct grub_efi_simple_text_output_interface *this,
+ grub_efi_uintn_t mode_number,
+ grub_efi_uintn_t *columns,
+ grub_efi_uintn_t *rows);
+
+ grub_efi_status_t
+ (*set_mode) (struct grub_efi_simple_text_output_interface *this,
+ grub_efi_uintn_t mode_number);
+
+ grub_efi_status_t
+ (*set_attributes) (struct grub_efi_simple_text_output_interface *this,
+ grub_efi_uintn_t attribute);
+
+ grub_efi_status_t
+ (*clear_screen) (struct grub_efi_simple_text_output_interface *this);
+
+ grub_efi_status_t
+ (*set_cursor_position) (struct grub_efi_simple_text_output_interface *this,
+ grub_efi_uintn_t column,
+ grub_efi_uintn_t row);
+
+ grub_efi_status_t
+ (*enable_cursor) (struct grub_efi_simple_text_output_interface *this,
+ grub_efi_boolean_t visible);
+
+ grub_efi_simple_text_output_mode_t *mode;
+};
+typedef struct grub_efi_simple_text_output_interface grub_efi_simple_text_output_interface_t;
+
+typedef grub_uint8_t grub_efi_pxe_packet_t[1472];
+
+typedef struct grub_efi_pxe_mode
+{
+ grub_uint8_t unused[52];
+ grub_efi_pxe_packet_t dhcp_discover;
+ grub_efi_pxe_packet_t dhcp_ack;
+ grub_efi_pxe_packet_t proxy_offer;
+ grub_efi_pxe_packet_t pxe_discover;
+ grub_efi_pxe_packet_t pxe_reply;
+} grub_efi_pxe_mode_t;
+
+typedef struct grub_efi_pxe
+{
+ grub_uint64_t rev;
+ void (*start) (void);
+ void (*stop) (void);
+ void (*dhcp) (void);
+ void (*discover) (void);
+ void (*mftp) (void);
+ void (*udpwrite) (void);
+ void (*udpread) (void);
+ void (*setipfilter) (void);
+ void (*arp) (void);
+ void (*setparams) (void);
+ void (*setstationip) (void);
+ void (*setpackets) (void);
+ struct grub_efi_pxe_mode *mode;
+} grub_efi_pxe_t;
+
+#define GRUB_EFI_BLACK 0x00
+#define GRUB_EFI_BLUE 0x01
+#define GRUB_EFI_GREEN 0x02
+#define GRUB_EFI_CYAN 0x03
+#define GRUB_EFI_RED 0x04
+#define GRUB_EFI_MAGENTA 0x05
+#define GRUB_EFI_BROWN 0x06
+#define GRUB_EFI_LIGHTGRAY 0x07
+#define GRUB_EFI_BRIGHT 0x08
+#define GRUB_EFI_DARKGRAY 0x08
+#define GRUB_EFI_LIGHTBLUE 0x09
+#define GRUB_EFI_LIGHTGREEN 0x0A
+#define GRUB_EFI_LIGHTCYAN 0x0B
+#define GRUB_EFI_LIGHTRED 0x0C
+#define GRUB_EFI_LIGHTMAGENTA 0x0D
+#define GRUB_EFI_YELLOW 0x0E
+#define GRUB_EFI_WHITE 0x0F
+
+#define GRUB_EFI_BACKGROUND_BLACK 0x00
+#define GRUB_EFI_BACKGROUND_BLUE 0x10
+#define GRUB_EFI_BACKGROUND_GREEN 0x20
+#define GRUB_EFI_BACKGROUND_CYAN 0x30
+#define GRUB_EFI_BACKGROUND_RED 0x40
+#define GRUB_EFI_BACKGROUND_MAGENTA 0x50
+#define GRUB_EFI_BACKGROUND_BROWN 0x60
+#define GRUB_EFI_BACKGROUND_LIGHTGRAY 0x70
+
+#define GRUB_EFI_TEXT_ATTR(fg, bg) ((fg) | ((bg)))
+
+struct grub_efi_system_table
+{
+ grub_efi_table_header_t hdr;
+ grub_efi_char16_t *firmware_vendor;
+ grub_efi_uint32_t firmware_revision;
+ grub_efi_handle_t console_in_handler;
+ grub_efi_simple_input_interface_t *con_in;
+ grub_efi_handle_t console_out_handler;
+ grub_efi_simple_text_output_interface_t *con_out;
+ grub_efi_handle_t standard_error_handle;
+ grub_efi_simple_text_output_interface_t *std_err;
+ grub_efi_runtime_services_t *runtime_services;
+ grub_efi_boot_services_t *boot_services;
+ grub_efi_uintn_t num_table_entries;
+ grub_efi_configuration_table_t *configuration_table;
+};
+typedef struct grub_efi_system_table grub_efi_system_table_t;
+
+struct grub_efi_loaded_image
+{
+ grub_efi_uint32_t revision;
+ grub_efi_handle_t parent_handle;
+ grub_efi_system_table_t *system_table;
+
+ grub_efi_handle_t device_handle;
+ grub_efi_device_path_t *file_path;
+ void *reserved;
+
+ grub_efi_uint32_t load_options_size;
+ void *load_options;
+
+ void *image_base;
+ grub_efi_uint64_t image_size;
+ grub_efi_memory_type_t image_code_type;
+ grub_efi_memory_type_t image_data_type;
+
+ grub_efi_status_t (*unload) (grub_efi_handle_t image_handle);
+};
+typedef struct grub_efi_loaded_image grub_efi_loaded_image_t;
+
+struct grub_efi_disk_io
+{
+ grub_efi_uint64_t revision;
+ grub_efi_status_t (*read) (struct grub_efi_disk_io *this,
+ grub_efi_uint32_t media_id,
+ grub_efi_uint64_t offset,
+ grub_efi_uintn_t buffer_size,
+ void *buffer);
+ grub_efi_status_t (*write) (struct grub_efi_disk_io *this,
+ grub_efi_uint32_t media_id,
+ grub_efi_uint64_t offset,
+ grub_efi_uintn_t buffer_size,
+ void *buffer);
+};
+typedef struct grub_efi_disk_io grub_efi_disk_io_t;
+
+struct grub_efi_block_io_media
+{
+ grub_efi_uint32_t media_id;
+ grub_efi_boolean_t removable_media;
+ grub_efi_boolean_t media_present;
+ grub_efi_boolean_t logical_partition;
+ grub_efi_boolean_t read_only;
+ grub_efi_boolean_t write_caching;
+ grub_efi_uint8_t pad[3];
+ grub_efi_uint32_t block_size;
+ grub_efi_uint32_t io_align;
+ grub_efi_uint8_t pad2[4];
+ grub_efi_lba_t last_block;
+};
+typedef struct grub_efi_block_io_media grub_efi_block_io_media_t;
+
+typedef grub_uint8_t grub_efi_mac_t[32];
+
+struct grub_efi_simple_network_mode
+{
+ grub_uint32_t state;
+ grub_uint32_t hwaddr_size;
+ grub_uint32_t media_header_size;
+ grub_uint32_t max_packet_size;
+ grub_uint32_t nvram_size;
+ grub_uint32_t nvram_access_size;
+ grub_uint32_t receive_filter_mask;
+ grub_uint32_t receive_filter_setting;
+ grub_uint32_t max_mcast_filter_count;
+ grub_uint32_t mcast_filter_count;
+ grub_efi_mac_t mcast_filter[16];
+ grub_efi_mac_t current_address;
+ grub_efi_mac_t broadcast_address;
+ grub_efi_mac_t permanent_address;
+ grub_uint8_t if_type;
+ grub_uint8_t mac_changeable;
+ grub_uint8_t multitx_supported;
+ grub_uint8_t media_present_supported;
+ grub_uint8_t media_present;
+};
+
+enum
+ {
+ GRUB_EFI_NETWORK_STOPPED,
+ GRUB_EFI_NETWORK_STARTED,
+ GRUB_EFI_NETWORK_INITIALIZED,
+ };
+
+enum
+ {
+ GRUB_EFI_SIMPLE_NETWORK_RECEIVE_UNICAST = 0x01,
+ GRUB_EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST = 0x02,
+ GRUB_EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST = 0x04,
+ GRUB_EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS = 0x08,
+ GRUB_EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST = 0x10,
+ };
+
+struct grub_efi_simple_network
+{
+ grub_uint64_t revision;
+ grub_efi_status_t (*start) (struct grub_efi_simple_network *this);
+ grub_efi_status_t (*stop) (struct grub_efi_simple_network *this);
+ grub_efi_status_t (*initialize) (struct grub_efi_simple_network *this,
+ grub_efi_uintn_t extra_rx,
+ grub_efi_uintn_t extra_tx);
+ void (*reset) (void);
+ grub_efi_status_t (*shutdown) (struct grub_efi_simple_network *this);
+ grub_efi_status_t (*receive_filters) (struct grub_efi_simple_network *this,
+ grub_uint32_t enable,
+ grub_uint32_t disable,
+ grub_efi_boolean_t reset_mcast_filter,
+ grub_efi_uintn_t mcast_filter_count,
+ grub_efi_mac_address_t *mcast_filter);
+ void (*station_address) (void);
+ void (*statistics) (void);
+ void (*mcastiptomac) (void);
+ void (*nvdata) (void);
+ grub_efi_status_t (*get_status) (struct grub_efi_simple_network *this,
+ grub_uint32_t *int_status,
+ void **txbuf);
+ grub_efi_status_t (*transmit) (struct grub_efi_simple_network *this,
+ grub_efi_uintn_t header_size,
+ grub_efi_uintn_t buffer_size,
+ void *buffer,
+ grub_efi_mac_t *src_addr,
+ grub_efi_mac_t *dest_addr,
+ grub_efi_uint16_t *protocol);
+ grub_efi_status_t (*receive) (struct grub_efi_simple_network *this,
+ grub_efi_uintn_t *header_size,
+ grub_efi_uintn_t *buffer_size,
+ void *buffer,
+ grub_efi_mac_t *src_addr,
+ grub_efi_mac_t *dest_addr,
+ grub_uint16_t *protocol);
+ void (*waitforpacket) (void);
+ struct grub_efi_simple_network_mode *mode;
+};
+typedef struct grub_efi_simple_network grub_efi_simple_network_t;
+
+
+struct grub_efi_block_io
+{
+ grub_efi_uint64_t revision;
+ grub_efi_block_io_media_t *media;
+ grub_efi_status_t (*reset) (struct grub_efi_block_io *this,
+ grub_efi_boolean_t extended_verification);
+ grub_efi_status_t (*read_blocks) (struct grub_efi_block_io *this,
+ grub_efi_uint32_t media_id,
+ grub_efi_lba_t lba,
+ grub_efi_uintn_t buffer_size,
+ void *buffer);
+ grub_efi_status_t (*write_blocks) (struct grub_efi_block_io *this,
+ grub_efi_uint32_t media_id,
+ grub_efi_lba_t lba,
+ grub_efi_uintn_t buffer_size,
+ void *buffer);
+ grub_efi_status_t (*flush_blocks) (struct grub_efi_block_io *this);
+};
+typedef struct grub_efi_block_io grub_efi_block_io_t;
+
+struct grub_efi_shim_lock_protocol
+{
+ grub_efi_status_t (*verify) (void *buffer, grub_uint32_t size);
+};
+typedef struct grub_efi_shim_lock_protocol grub_efi_shim_lock_protocol_t;
+
+typedef grub_efi_guid_t grub_efi_rng_algorithm_t;
+
+struct grub_efi_rng_protocol
+{
+ grub_efi_status_t (*get_info) (struct grub_efi_rng_protocol *this,
+ grub_efi_uintn_t *rng_algorithm_list_size,
+ grub_efi_rng_algorithm_t *rng_algorithm_list);
+ grub_efi_status_t (*get_rng) (struct grub_efi_rng_protocol *this,
+ grub_efi_rng_algorithm_t *rng_algorithm,
+ grub_efi_uintn_t rng_value_length,
+ grub_efi_uint8_t *rng_value);
+};
+typedef struct grub_efi_rng_protocol grub_efi_rng_protocol_t;
+
+#if (GRUB_TARGET_SIZEOF_VOID_P == 4) || defined (__ia64__) \
+ || defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) \
+ || defined(__riscv)
+
+#define efi_call_0(func) func()
+#define efi_call_1(func, a) func(a)
+#define efi_call_2(func, a, b) func(a, b)
+#define efi_call_3(func, a, b, c) func(a, b, c)
+#define efi_call_4(func, a, b, c, d) func(a, b, c, d)
+#define efi_call_5(func, a, b, c, d, e) func(a, b, c, d, e)
+#define efi_call_6(func, a, b, c, d, e, f) func(a, b, c, d, e, f)
+#define efi_call_7(func, a, b, c, d, e, f, g) func(a, b, c, d, e, f, g)
+#define efi_call_10(func, a, b, c, d, e, f, g, h, i, j) func(a, b, c, d, e, f, g, h, i, j)
+
+#else
+
+#define efi_call_0(func) \
+ efi_wrap_0(func)
+#define efi_call_1(func, a) \
+ efi_wrap_1(func, (grub_uint64_t) (a))
+#define efi_call_2(func, a, b) \
+ efi_wrap_2(func, (grub_uint64_t) (a), (grub_uint64_t) (b))
+#define efi_call_3(func, a, b, c) \
+ efi_wrap_3(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
+ (grub_uint64_t) (c))
+#define efi_call_4(func, a, b, c, d) \
+ efi_wrap_4(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
+ (grub_uint64_t) (c), (grub_uint64_t) (d))
+#define efi_call_5(func, a, b, c, d, e) \
+ efi_wrap_5(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
+ (grub_uint64_t) (c), (grub_uint64_t) (d), (grub_uint64_t) (e))
+#define efi_call_6(func, a, b, c, d, e, f) \
+ efi_wrap_6(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
+ (grub_uint64_t) (c), (grub_uint64_t) (d), (grub_uint64_t) (e), \
+ (grub_uint64_t) (f))
+#define efi_call_7(func, a, b, c, d, e, f, g) \
+ efi_wrap_7(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
+ (grub_uint64_t) (c), (grub_uint64_t) (d), (grub_uint64_t) (e), \
+ (grub_uint64_t) (f), (grub_uint64_t) (g))
+#define efi_call_10(func, a, b, c, d, e, f, g, h, i, j) \
+ efi_wrap_10(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
+ (grub_uint64_t) (c), (grub_uint64_t) (d), (grub_uint64_t) (e), \
+ (grub_uint64_t) (f), (grub_uint64_t) (g), (grub_uint64_t) (h), \
+ (grub_uint64_t) (i), (grub_uint64_t) (j))
+
+grub_uint64_t EXPORT_FUNC(efi_wrap_0) (void *func);
+grub_uint64_t EXPORT_FUNC(efi_wrap_1) (void *func, grub_uint64_t arg1);
+grub_uint64_t EXPORT_FUNC(efi_wrap_2) (void *func, grub_uint64_t arg1,
+ grub_uint64_t arg2);
+grub_uint64_t EXPORT_FUNC(efi_wrap_3) (void *func, grub_uint64_t arg1,
+ grub_uint64_t arg2, grub_uint64_t arg3);
+grub_uint64_t EXPORT_FUNC(efi_wrap_4) (void *func, grub_uint64_t arg1,
+ grub_uint64_t arg2, grub_uint64_t arg3,
+ grub_uint64_t arg4);
+grub_uint64_t EXPORT_FUNC(efi_wrap_5) (void *func, grub_uint64_t arg1,
+ grub_uint64_t arg2, grub_uint64_t arg3,
+ grub_uint64_t arg4, grub_uint64_t arg5);
+grub_uint64_t EXPORT_FUNC(efi_wrap_6) (void *func, grub_uint64_t arg1,
+ grub_uint64_t arg2, grub_uint64_t arg3,
+ grub_uint64_t arg4, grub_uint64_t arg5,
+ grub_uint64_t arg6);
+grub_uint64_t EXPORT_FUNC(efi_wrap_7) (void *func, grub_uint64_t arg1,
+ grub_uint64_t arg2, grub_uint64_t arg3,
+ grub_uint64_t arg4, grub_uint64_t arg5,
+ grub_uint64_t arg6, grub_uint64_t arg7);
+grub_uint64_t EXPORT_FUNC(efi_wrap_10) (void *func, grub_uint64_t arg1,
+ grub_uint64_t arg2, grub_uint64_t arg3,
+ grub_uint64_t arg4, grub_uint64_t arg5,
+ grub_uint64_t arg6, grub_uint64_t arg7,
+ grub_uint64_t arg8, grub_uint64_t arg9,
+ grub_uint64_t arg10);
+#endif
+
+#endif /* ! GRUB_EFI_API_HEADER */
diff --git a/include/grub/efi/console.h b/include/grub/efi/console.h
new file mode 100644
index 0000000..f90b5b7
--- /dev/null
+++ b/include/grub/efi/console.h
@@ -0,0 +1,31 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2002,2005,2006,2007 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_CONSOLE_HEADER
+#define GRUB_EFI_CONSOLE_HEADER 1
+
+#include <grub/types.h>
+#include <grub/symbol.h>
+
+/* Initialize the console system. */
+void grub_console_init (void);
+
+/* Finish the console system. */
+void grub_console_fini (void);
+
+#endif /* ! GRUB_EFI_CONSOLE_HEADER */
diff --git a/include/grub/efi/console_control.h b/include/grub/efi/console_control.h
new file mode 100644
index 0000000..7c358fc
--- /dev/null
+++ b/include/grub/efi/console_control.h
@@ -0,0 +1,57 @@
+/* console_control.h - definitions of the console control protocol */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2006,2007 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* The console control protocol is not a part of the EFI spec,
+ but defined in Intel's Sample Implementation. */
+
+#ifndef GRUB_EFI_CONSOLE_CONTROL_HEADER
+#define GRUB_EFI_CONSOLE_CONTROL_HEADER 1
+
+#define GRUB_EFI_CONSOLE_CONTROL_GUID \
+ { 0xf42f7782, 0x12e, 0x4c12, \
+ { 0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21 } \
+ }
+
+enum grub_efi_screen_mode
+ {
+ GRUB_EFI_SCREEN_TEXT,
+ GRUB_EFI_SCREEN_GRAPHICS,
+ GRUB_EFI_SCREEN_TEXT_MAX_VALUE
+ };
+typedef enum grub_efi_screen_mode grub_efi_screen_mode_t;
+
+struct grub_efi_console_control_protocol
+{
+ grub_efi_status_t
+ (*get_mode) (struct grub_efi_console_control_protocol *this,
+ grub_efi_screen_mode_t *mode,
+ grub_efi_boolean_t *uga_exists,
+ grub_efi_boolean_t *std_in_locked);
+
+ grub_efi_status_t
+ (*set_mode) (struct grub_efi_console_control_protocol *this,
+ grub_efi_screen_mode_t mode);
+
+ grub_efi_status_t
+ (*lock_std_in) (struct grub_efi_console_control_protocol *this,
+ grub_efi_char16_t *password);
+};
+typedef struct grub_efi_console_control_protocol grub_efi_console_control_protocol_t;
+
+#endif /* ! GRUB_EFI_CONSOLE_CONTROL_HEADER */
diff --git a/include/grub/efi/disk.h b/include/grub/efi/disk.h
new file mode 100644
index 0000000..254475c
--- /dev/null
+++ b/include/grub/efi/disk.h
@@ -0,0 +1,33 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2006,2007 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_DISK_HEADER
+#define GRUB_EFI_DISK_HEADER 1
+
+#include <grub/efi/api.h>
+#include <grub/symbol.h>
+#include <grub/disk.h>
+
+grub_efi_handle_t
+EXPORT_FUNC(grub_efidisk_get_device_handle) (grub_disk_t disk);
+char *EXPORT_FUNC(grub_efidisk_get_device_name) (grub_efi_handle_t *handle);
+
+void grub_efidisk_init (void);
+void grub_efidisk_fini (void);
+
+#endif /* ! GRUB_EFI_DISK_HEADER */
diff --git a/include/grub/efi/edid.h b/include/grub/efi/edid.h
new file mode 100644
index 0000000..a0140b8
--- /dev/null
+++ b/include/grub/efi/edid.h
@@ -0,0 +1,54 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2012 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_EDID_HEADER
+#define GRUB_EFI_EDID_HEADER 1
+
+/* Based on UEFI specification. */
+
+#define GRUB_EFI_EDID_ACTIVE_GUID \
+ { 0xbd8c1056, 0x9f36, 0x44ec, { 0x92, 0xa8, 0xa6, 0x33, 0x7f, 0x81, 0x79, 0x86 }}
+
+#define GRUB_EFI_EDID_DISCOVERED_GUID \
+ {0x1c0c34f6,0xd380,0x41fa, {0xa0,0x49,0x8a,0xd0,0x6c,0x1a,0x66,0xaa}}
+
+#define GRUB_EFI_EDID_OVERRIDE_GUID \
+ {0x48ecb431,0xfb72,0x45c0, {0xa9,0x22,0xf4,0x58,0xfe,0x4,0xb,0xd5}}
+
+struct grub_efi_edid_override;
+
+typedef grub_efi_status_t
+(*grub_efi_edid_override_get_edid) (struct grub_efi_edid_override *this,
+ grub_efi_handle_t *childhandle,
+ grub_efi_uint32_t *attributes,
+ grub_efi_uintn_t *edidsize,
+ grub_efi_uint8_t *edid);
+struct grub_efi_edid_override {
+ grub_efi_edid_override_get_edid get_edid;
+};
+
+typedef struct grub_efi_edid_override grub_efi_edid_override_t;
+
+
+struct grub_efi_active_edid
+{
+ grub_uint32_t size_of_edid;
+ grub_uint8_t *edid;
+};
+
+#endif
diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h
new file mode 100644
index 0000000..83d958f
--- /dev/null
+++ b/include/grub/efi/efi.h
@@ -0,0 +1,127 @@
+/* efi.h - declare variables and functions for EFI support */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_EFI_HEADER
+#define GRUB_EFI_EFI_HEADER 1
+
+#include <grub/types.h>
+#include <grub/dl.h>
+#include <grub/efi/api.h>
+
+/* Functions. */
+void *EXPORT_FUNC(grub_efi_locate_protocol) (grub_efi_guid_t *protocol,
+ void *registration);
+grub_efi_handle_t *
+EXPORT_FUNC(grub_efi_locate_handle) (grub_efi_locate_search_type_t search_type,
+ grub_efi_guid_t *protocol,
+ void *search_key,
+ grub_efi_uintn_t *num_handles);
+void *EXPORT_FUNC(grub_efi_open_protocol) (grub_efi_handle_t handle,
+ grub_efi_guid_t *protocol,
+ grub_efi_uint32_t attributes);
+int EXPORT_FUNC(grub_efi_set_text_mode) (int on);
+void EXPORT_FUNC(grub_efi_stall) (grub_efi_uintn_t microseconds);
+void *
+EXPORT_FUNC(grub_efi_allocate_pages_real) (grub_efi_physical_address_t address,
+ grub_efi_uintn_t pages,
+ grub_efi_allocate_type_t alloctype,
+ grub_efi_memory_type_t memtype);
+void *
+EXPORT_FUNC(grub_efi_allocate_fixed) (grub_efi_physical_address_t address,
+ grub_efi_uintn_t pages);
+void *
+EXPORT_FUNC(grub_efi_allocate_any_pages) (grub_efi_uintn_t pages);
+void EXPORT_FUNC(grub_efi_free_pages) (grub_efi_physical_address_t address,
+ grub_efi_uintn_t pages);
+grub_efi_uintn_t EXPORT_FUNC(grub_efi_find_mmap_size) (void);
+int
+EXPORT_FUNC(grub_efi_get_memory_map) (grub_efi_uintn_t *memory_map_size,
+ grub_efi_memory_descriptor_t *memory_map,
+ grub_efi_uintn_t *map_key,
+ grub_efi_uintn_t *descriptor_size,
+ grub_efi_uint32_t *descriptor_version);
+void grub_efi_memory_fini (void);
+grub_efi_loaded_image_t *EXPORT_FUNC(grub_efi_get_loaded_image) (grub_efi_handle_t image_handle);
+void EXPORT_FUNC(grub_efi_print_device_path) (grub_efi_device_path_t *dp);
+char *EXPORT_FUNC(grub_efi_get_filename) (grub_efi_device_path_t *dp);
+grub_efi_device_path_t *
+EXPORT_FUNC(grub_efi_get_device_path) (grub_efi_handle_t handle);
+grub_efi_device_path_t *
+EXPORT_FUNC(grub_efi_find_last_device_path) (const grub_efi_device_path_t *dp);
+grub_efi_device_path_t *
+EXPORT_FUNC(grub_efi_duplicate_device_path) (const grub_efi_device_path_t *dp);
+grub_err_t EXPORT_FUNC (grub_efi_finish_boot_services) (grub_efi_uintn_t *outbuf_size, void *outbuf,
+ grub_efi_uintn_t *map_key,
+ grub_efi_uintn_t *efi_desc_size,
+ grub_efi_uint32_t *efi_desc_version);
+grub_err_t EXPORT_FUNC (grub_efi_set_virtual_address_map) (grub_efi_uintn_t memory_map_size,
+ grub_efi_uintn_t descriptor_size,
+ grub_efi_uint32_t descriptor_version,
+ grub_efi_memory_descriptor_t *virtual_map);
+grub_efi_status_t EXPORT_FUNC (grub_efi_get_variable_with_attributes) (const char *variable,
+ const grub_efi_guid_t *guid,
+ grub_size_t *datasize_out,
+ void **data_out,
+ grub_efi_uint32_t *attributes);
+grub_efi_status_t EXPORT_FUNC (grub_efi_get_variable) (const char *variable,
+ const grub_efi_guid_t *guid,
+ grub_size_t *datasize_out,
+ void **data_out);
+grub_err_t
+EXPORT_FUNC (grub_efi_set_variable) (const char *var,
+ const grub_efi_guid_t *guid,
+ void *data,
+ grub_size_t datasize);
+int
+EXPORT_FUNC (grub_efi_compare_device_paths) (const grub_efi_device_path_t *dp1,
+ const grub_efi_device_path_t *dp2);
+
+extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd,
+ char **device,
+ char **path);
+
+#if defined(__arm__) || defined(__aarch64__) || defined(__riscv)
+void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void);
+grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *);
+#include <grub/cpu/linux.h>
+grub_err_t grub_arch_efi_linux_check_image(struct linux_arch_kernel_header *lh);
+grub_err_t grub_arch_efi_linux_boot_image(grub_addr_t addr, grub_size_t size,
+ char *args);
+#endif
+
+grub_addr_t grub_efi_modules_addr (void);
+
+void grub_efi_mm_init (void);
+void grub_efi_mm_fini (void);
+void grub_efi_init (void);
+void grub_efi_fini (void);
+void grub_efi_set_prefix (void);
+
+/* Variables. */
+extern grub_efi_system_table_t *EXPORT_VAR(grub_efi_system_table);
+extern grub_efi_handle_t EXPORT_VAR(grub_efi_image_handle);
+
+extern int EXPORT_VAR(grub_efi_is_finished);
+
+struct grub_net_card;
+
+grub_efi_handle_t
+grub_efinet_get_device_handle (struct grub_net_card *card);
+
+#endif /* ! GRUB_EFI_EFI_HEADER */
diff --git a/include/grub/efi/fdtload.h b/include/grub/efi/fdtload.h
new file mode 100644
index 0000000..713c942
--- /dev/null
+++ b/include/grub/efi/fdtload.h
@@ -0,0 +1,32 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2013-2015 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_FDTLOAD_CPU_HEADER
+#define GRUB_FDTLOAD_CPU_HEADER 1
+
+#include <grub/types.h>
+#include <grub/err.h>
+
+void *
+grub_fdt_load (grub_size_t additional_size);
+void
+grub_fdt_unload (void);
+grub_err_t
+grub_fdt_install (void);
+
+#endif
diff --git a/include/grub/efi/graphics_output.h b/include/grub/efi/graphics_output.h
new file mode 100644
index 0000000..e438812
--- /dev/null
+++ b/include/grub/efi/graphics_output.h
@@ -0,0 +1,115 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_GOP_HEADER
+#define GRUB_EFI_GOP_HEADER 1
+
+/* Based on UEFI specification. */
+
+#define GRUB_EFI_GOP_GUID \
+ { 0x9042a9de, 0x23dc, 0x4a38, { 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a }}
+
+typedef enum
+ {
+ GRUB_EFI_GOT_RGBA8,
+ GRUB_EFI_GOT_BGRA8,
+ GRUB_EFI_GOT_BITMASK,
+ GRUB_EFI_GOT_BLT_ONLY,
+ }
+ grub_efi_gop_pixel_format_t;
+
+typedef enum
+ {
+ GRUB_EFI_BLT_VIDEO_FILL,
+ GRUB_EFI_BLT_VIDEO_TO_BLT_BUFFER,
+ GRUB_EFI_BLT_BUFFER_TO_VIDEO,
+ GRUB_EFI_BLT_VIDEO_TO_VIDEO,
+ GRUB_EFI_BLT_OPERATION_MAX
+ }
+ grub_efi_gop_blt_operation_t;
+
+struct grub_efi_gop_blt_pixel
+{
+ grub_uint8_t blue;
+ grub_uint8_t green;
+ grub_uint8_t red;
+ grub_uint8_t reserved;
+};
+
+struct grub_efi_gop_pixel_bitmask
+{
+ grub_uint32_t r;
+ grub_uint32_t g;
+ grub_uint32_t b;
+ grub_uint32_t a;
+};
+
+struct grub_efi_gop_mode_info
+{
+ grub_efi_uint32_t version;
+ grub_efi_uint32_t width;
+ grub_efi_uint32_t height;
+ grub_efi_gop_pixel_format_t pixel_format;
+ struct grub_efi_gop_pixel_bitmask pixel_bitmask;
+ grub_efi_uint32_t pixels_per_scanline;
+};
+
+struct grub_efi_gop_mode
+{
+ grub_efi_uint32_t max_mode;
+ grub_efi_uint32_t mode;
+ struct grub_efi_gop_mode_info *info;
+ grub_efi_uintn_t info_size;
+ grub_efi_physical_address_t fb_base;
+ grub_efi_uintn_t fb_size;
+};
+
+/* Forward declaration. */
+struct grub_efi_gop;
+
+typedef grub_efi_status_t
+(*grub_efi_gop_query_mode_t) (struct grub_efi_gop *this,
+ grub_efi_uint32_t mode_number,
+ grub_efi_uintn_t *size_of_info,
+ struct grub_efi_gop_mode_info **info);
+
+typedef grub_efi_status_t
+(*grub_efi_gop_set_mode_t) (struct grub_efi_gop *this,
+ grub_efi_uint32_t mode_number);
+
+typedef grub_efi_status_t
+(*grub_efi_gop_blt_t) (struct grub_efi_gop *this,
+ void *buffer,
+ grub_efi_uintn_t operation,
+ grub_efi_uintn_t sx,
+ grub_efi_uintn_t sy,
+ grub_efi_uintn_t dx,
+ grub_efi_uintn_t dy,
+ grub_efi_uintn_t width,
+ grub_efi_uintn_t height,
+ grub_efi_uintn_t delta);
+
+struct grub_efi_gop
+{
+ grub_efi_gop_query_mode_t query_mode;
+ grub_efi_gop_set_mode_t set_mode;
+ grub_efi_gop_blt_t blt;
+ struct grub_efi_gop_mode *mode;
+};
+
+#endif
diff --git a/include/grub/efi/memory.h b/include/grub/efi/memory.h
new file mode 100644
index 0000000..08fe622
--- /dev/null
+++ b/include/grub/efi/memory.h
@@ -0,0 +1,38 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_MEMORY_MACHINE_HEADER
+#define GRUB_MEMORY_MACHINE_HEADER 1
+
+#include <grub/err.h>
+#include <grub/types.h>
+
+/* The term "page" in UEFI refers only to a 4 KiB-aligned 4 KiB size region of
+ memory. It is not concerned with underlying translation management concepts,
+ but only used as the granule for memory allocations. */
+#define GRUB_EFI_PAGE_SHIFT 12
+#define GRUB_EFI_PAGE_SIZE (1 << GRUB_EFI_PAGE_SHIFT)
+#define GRUB_EFI_BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT)
+
+#define GRUB_MMAP_REGISTER_BY_FIRMWARE 1
+
+grub_err_t grub_machine_mmap_register (grub_uint64_t start, grub_uint64_t size,
+ int type, int handle);
+grub_err_t grub_machine_mmap_unregister (int handle);
+
+#endif /* ! GRUB_MEMORY_MACHINE_HEADER */
diff --git a/include/grub/efi/pci.h b/include/grub/efi/pci.h
new file mode 100644
index 0000000..b172455
--- /dev/null
+++ b/include/grub/efi/pci.h
@@ -0,0 +1,319 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_PCI_HEADER
+#define GRUB_EFI_PCI_HEADER 1
+
+#include <grub/symbol.h>
+
+#define GRUB_EFI_PCI_IO_GUID \
+ { 0x4cf5b200, 0x68b8, 0x4ca5, { 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x02, 0x9a }}
+
+#define GRUB_EFI_PCI_ROOT_IO_GUID \
+ { 0x2F707EBB, 0x4A1A, 0x11d4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}
+
+typedef enum
+ {
+ GRUB_EFI_PCI_IO_WIDTH_UINT8,
+ GRUB_EFI_PCI_IO_WIDTH_UINT16,
+ GRUB_EFI_PCI_IO_WIDTH_UINT32,
+ GRUB_EFI_PCI_IO_WIDTH_UINT64,
+ GRUB_EFI_PCI_IO_WIDTH_FIFO_UINT8,
+ GRUB_EFI_PCI_IO_WIDTH_FIFO_UINT16,
+ GRUB_EFI_PCI_IO_WIDTH_FIFO_UINT32,
+ GRUB_EFI_PCI_IO_WIDTH_FIFO_UINT64,
+ GRUB_EFI_PCI_IO_WIDTH_FILL_UINT8,
+ GRUB_EFI_PCI_IO_WIDTH_FILL_UINT16,
+ GRUB_EFI_PCI_IO_WIDTH_FILL_UINT32,
+ GRUB_EFI_PCI_IO_WIDTH_FILL_UINT64,
+ GRUB_EFI_PCI_IO_WIDTH_MAXIMUM,
+ }
+ grub_efi_pci_io_width_t;
+
+struct grub_efi_pci_io;
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_mem_t) (struct grub_efi_pci_io *this,
+ grub_efi_pci_io_width_t width,
+ grub_efi_uint8_t bar_index,
+ grub_efi_uint64_t offset,
+ grub_efi_uintn_t count,
+ void *buffer);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_config_t) (struct grub_efi_pci_io *this,
+ grub_efi_pci_io_width_t width,
+ grub_efi_uint32_t offset,
+ grub_efi_uintn_t count,
+ void *buffer);
+typedef struct
+{
+ grub_efi_pci_io_mem_t read;
+ grub_efi_pci_io_mem_t write;
+} grub_efi_pci_io_access_t;
+
+typedef struct
+{
+ grub_efi_pci_io_config_t read;
+ grub_efi_pci_io_config_t write;
+} grub_efi_pci_io_config_access_t;
+
+typedef enum
+ {
+ GRUB_EFI_PCI_IO_OPERATION_BUS_MASTER_READ,
+ GRUB_EFI_PCI_IO_OPERATION_BUS_MASTER_WRITE,
+ GRUB_EFI_PCI_IO_OPERATION_BUS_MASTER_COMMON_BUFFER,
+ GRUB_EFI_PCI_IO_OPERATION_BUS_MASTER_MAXIMUM
+ }
+ grub_efi_pci_io_operation_t;
+
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_ISA_IO 0x0002
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO 0x0004
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY 0x0008
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_IO 0x0010
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO 0x0020
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO 0x0040
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_IO 0x0100
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_MEMORY 0x0200
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_BUS_MASTER 0x0400
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED 0x0800
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE 0x1000
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE 0x2000
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM 0x4000
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000
+#define GRUB_EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000
+
+typedef enum
+ {
+ GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_GET,
+ GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_SET,
+ GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_ENABLE,
+ GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_DISABLE,
+ GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_SUPPORTED,
+ GRUB_EFI_PCI_IO_ATTRIBUTE_OPERATION_MAXIMUM
+ }
+ grub_efi_pci_io_attribute_operation_t;
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_poll_io_mem_t) (struct grub_efi_pci_io *this,
+ grub_efi_pci_io_width_t width,
+ grub_efi_uint8_t bar_ndex,
+ grub_efi_uint64_t offset,
+ grub_efi_uint64_t mask,
+ grub_efi_uint64_t value,
+ grub_efi_uint64_t delay,
+ grub_efi_uint64_t *result);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_copy_mem_t) (struct grub_efi_pci_io *this,
+ grub_efi_pci_io_width_t width,
+ grub_efi_uint8_t dest_bar_index,
+ grub_efi_uint64_t dest_offset,
+ grub_efi_uint8_t src_bar_index,
+ grub_efi_uint64_t src_offset,
+ grub_efi_uintn_t count);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_map_t) (struct grub_efi_pci_io *this,
+ grub_efi_pci_io_operation_t operation,
+ void *host_address,
+ grub_efi_uintn_t *number_of_bytes,
+ grub_efi_uint64_t *device_address,
+ void **mapping);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_unmap_t) (struct grub_efi_pci_io *this,
+ void *mapping);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_allocate_buffer_t) (struct grub_efi_pci_io *this,
+ grub_efi_allocate_type_t type,
+ grub_efi_memory_type_t memory_type,
+ grub_efi_uintn_t pages,
+ void **host_address,
+ grub_efi_uint64_t attributes);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_free_buffer_t) (struct grub_efi_pci_io *this,
+ grub_efi_allocate_type_t type,
+ grub_efi_memory_type_t memory_type,
+ grub_efi_uintn_t pages,
+ void **host_address,
+ grub_efi_uint64_t attributes);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_flush_t) (struct grub_efi_pci_io *this);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_get_location_t) (struct grub_efi_pci_io *this,
+ grub_efi_uintn_t *segment_number,
+ grub_efi_uintn_t *bus_number,
+ grub_efi_uintn_t *device_number,
+ grub_efi_uintn_t *function_number);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_attributes_t) (struct grub_efi_pci_io *this,
+ grub_efi_pci_io_attribute_operation_t operation,
+ grub_efi_uint64_t attributes,
+ grub_efi_uint64_t *result);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_get_bar_attributes_t) (struct grub_efi_pci_io *this,
+ grub_efi_uint8_t bar_index,
+ grub_efi_uint64_t *supports,
+ void **resources);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_io_set_bar_attributes_t) (struct grub_efi_pci_io *this,
+ grub_efi_uint64_t attributes,
+ grub_efi_uint8_t bar_index,
+ grub_efi_uint64_t *offset,
+ grub_efi_uint64_t *length);
+struct grub_efi_pci_io {
+ grub_efi_pci_io_poll_io_mem_t poll_mem;
+ grub_efi_pci_io_poll_io_mem_t poll_io;
+ grub_efi_pci_io_access_t mem;
+ grub_efi_pci_io_access_t io;
+ grub_efi_pci_io_config_access_t pci;
+ grub_efi_pci_io_copy_mem_t copy_mem;
+ grub_efi_pci_io_map_t map;
+ grub_efi_pci_io_unmap_t unmap;
+ grub_efi_pci_io_allocate_buffer_t allocate_buffer;
+ grub_efi_pci_io_free_buffer_t free_buffer;
+ grub_efi_pci_io_flush_t flush;
+ grub_efi_pci_io_get_location_t get_location;
+ grub_efi_pci_io_attributes_t attributes;
+ grub_efi_pci_io_get_bar_attributes_t get_bar_attributes;
+ grub_efi_pci_io_set_bar_attributes_t set_bar_attributes;
+ grub_efi_uint64_t rom_size;
+ void *rom_image;
+};
+typedef struct grub_efi_pci_io grub_efi_pci_io_t;
+
+struct grub_efi_pci_root_io;
+
+typedef struct
+{
+ grub_efi_status_t(*read) (struct grub_efi_pci_root_io *this,
+ grub_efi_pci_io_width_t width,
+ grub_efi_uint64_t address,
+ grub_efi_uintn_t count,
+ void *buffer);
+ grub_efi_status_t(*write) (struct grub_efi_pci_root_io *this,
+ grub_efi_pci_io_width_t width,
+ grub_efi_uint64_t address,
+ grub_efi_uintn_t count,
+ void *buffer);
+} grub_efi_pci_root_io_access_t;
+
+typedef enum
+ {
+ GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_READ,
+ GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_WRITE,
+ GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_COMMON_BUFFER,
+ GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_READ_64,
+ GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_WRITE_64,
+ GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_COMMON_BUFFER_64,
+ GRUB_EFI_PCI_ROOT_IO_OPERATION_BUS_MASTER_MAXIMUM
+ }
+ grub_efi_pci_root_io_operation_t;
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_poll_io_mem_t) (struct grub_efi_pci_root_io *this,
+ grub_efi_pci_io_width_t width,
+ grub_efi_uint64_t address,
+ grub_efi_uint64_t mask,
+ grub_efi_uint64_t value,
+ grub_efi_uint64_t delay,
+ grub_efi_uint64_t *result);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_copy_mem_t) (struct grub_efi_pci_root_io *this,
+ grub_efi_pci_io_width_t width,
+ grub_efi_uint64_t dest_offset,
+ grub_efi_uint64_t src_offset,
+ grub_efi_uintn_t count);
+
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_map_t) (struct grub_efi_pci_root_io *this,
+ grub_efi_pci_root_io_operation_t operation,
+ void *host_address,
+ grub_efi_uintn_t *number_of_bytes,
+ grub_efi_uint64_t *device_address,
+ void **mapping);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_unmap_t) (struct grub_efi_pci_root_io *this,
+ void *mapping);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_allocate_buffer_t) (struct grub_efi_pci_root_io *this,
+ grub_efi_allocate_type_t type,
+ grub_efi_memory_type_t memory_type,
+ grub_efi_uintn_t pages,
+ void **host_address,
+ grub_efi_uint64_t attributes);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_free_buffer_t) (struct grub_efi_pci_root_io *this,
+ grub_efi_uintn_t pages,
+ void **host_address);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_flush_t) (struct grub_efi_pci_root_io *this);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_get_attributes_t) (struct grub_efi_pci_root_io *this,
+ grub_efi_uint64_t *supports,
+ void **resources);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_set_attributes_t) (struct grub_efi_pci_root_io *this,
+ grub_efi_uint64_t attributes,
+ grub_efi_uint64_t *offset,
+ grub_efi_uint64_t *length);
+
+typedef grub_efi_status_t
+(*grub_efi_pci_root_io_configuration_t) (struct grub_efi_pci_root_io *this,
+ void **resources);
+
+struct grub_efi_pci_root_io {
+ grub_efi_handle_t parent;
+ grub_efi_pci_root_io_poll_io_mem_t poll_mem;
+ grub_efi_pci_root_io_poll_io_mem_t poll_io;
+ grub_efi_pci_root_io_access_t mem;
+ grub_efi_pci_root_io_access_t io;
+ grub_efi_pci_root_io_access_t pci;
+ grub_efi_pci_root_io_copy_mem_t copy_mem;
+ grub_efi_pci_root_io_map_t map;
+ grub_efi_pci_root_io_unmap_t unmap;
+ grub_efi_pci_root_io_allocate_buffer_t allocate_buffer;
+ grub_efi_pci_root_io_free_buffer_t free_buffer;
+ grub_efi_pci_root_io_flush_t flush;
+ grub_efi_pci_root_io_get_attributes_t get_attributes;
+ grub_efi_pci_root_io_set_attributes_t set_attributes;
+ grub_efi_pci_root_io_configuration_t configuration;
+};
+
+typedef struct grub_efi_pci_root_io grub_efi_pci_root_io_t;
+
+#endif /* !GRUB_EFI_PCI_HEADER */
diff --git a/include/grub/efi/pe32.h b/include/grub/efi/pe32.h
new file mode 100644
index 0000000..0ed8781
--- /dev/null
+++ b/include/grub/efi/pe32.h
@@ -0,0 +1,334 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_PE32_HEADER
+#define GRUB_EFI_PE32_HEADER 1
+
+#include <grub/types.h>
+#include <grub/efi/memory.h>
+
+/* The MSDOS compatibility stub. This was copied from the output of
+ objcopy, and it is not necessary to care about what this means. */
+#define GRUB_PE32_MSDOS_STUB \
+ { \
+ 0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, \
+ 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, \
+ 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, \
+ 0x0e, 0x1f, 0xba, 0x0e, 0x00, 0xb4, 0x09, 0xcd, \
+ 0x21, 0xb8, 0x01, 0x4c, 0xcd, 0x21, 0x54, 0x68, \
+ 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, \
+ 0x61, 0x6d, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, \
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, \
+ 0x20, 0x69, 0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20, \
+ 0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x0d, 0x0d, 0x0a, \
+ 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \
+ }
+
+#define GRUB_PE32_MSDOS_STUB_SIZE 0x80
+
+#define GRUB_PE32_MAGIC 0x5a4d
+
+/* According to the spec, the minimal alignment is 512 bytes...
+ But some examples (such as EFI drivers in the Intel
+ Sample Implementation) use 32 bytes (0x20) instead, and it seems
+ to be working.
+
+ However, there is firmware showing up in the field now with
+ page alignment constraints to guarantee that page protection
+ bits take effect. Because currently existing GRUB code can not
+ properly distinguish between in-memory and in-file layout, let's
+ bump all alignment to GRUB_EFI_PAGE_SIZE. */
+#define GRUB_PE32_SECTION_ALIGNMENT GRUB_EFI_PAGE_SIZE
+#define GRUB_PE32_FILE_ALIGNMENT GRUB_PE32_SECTION_ALIGNMENT
+
+struct grub_pe32_coff_header
+{
+ grub_uint16_t machine;
+ grub_uint16_t num_sections;
+ grub_uint32_t time;
+ grub_uint32_t symtab_offset;
+ grub_uint32_t num_symbols;
+ grub_uint16_t optional_header_size;
+ grub_uint16_t characteristics;
+};
+
+#define GRUB_PE32_MACHINE_I386 0x14c
+#define GRUB_PE32_MACHINE_IA64 0x200
+#define GRUB_PE32_MACHINE_X86_64 0x8664
+#define GRUB_PE32_MACHINE_ARMTHUMB_MIXED 0x01c2
+#define GRUB_PE32_MACHINE_ARM64 0xAA64
+#define GRUB_PE32_MACHINE_RISCV32 0x5032
+#define GRUB_PE32_MACHINE_RISCV64 0x5064
+
+#define GRUB_PE32_RELOCS_STRIPPED 0x0001
+#define GRUB_PE32_EXECUTABLE_IMAGE 0x0002
+#define GRUB_PE32_LINE_NUMS_STRIPPED 0x0004
+#define GRUB_PE32_LOCAL_SYMS_STRIPPED 0x0008
+#define GRUB_PE32_AGGRESSIVE_WS_TRIM 0x0010
+#define GRUB_PE32_LARGE_ADDRESS_AWARE 0x0020
+#define GRUB_PE32_16BIT_MACHINE 0x0040
+#define GRUB_PE32_BYTES_REVERSED_LO 0x0080
+#define GRUB_PE32_32BIT_MACHINE 0x0100
+#define GRUB_PE32_DEBUG_STRIPPED 0x0200
+#define GRUB_PE32_REMOVABLE_RUN_FROM_SWAP 0x0400
+#define GRUB_PE32_SYSTEM 0x1000
+#define GRUB_PE32_DLL 0x2000
+#define GRUB_PE32_UP_SYSTEM_ONLY 0x4000
+#define GRUB_PE32_BYTES_REVERSED_HI 0x8000
+
+struct grub_pe32_data_directory
+{
+ grub_uint32_t rva;
+ grub_uint32_t size;
+};
+
+struct grub_pe32_optional_header
+{
+ grub_uint16_t magic;
+ grub_uint8_t major_linker_version;
+ grub_uint8_t minor_linker_version;
+ grub_uint32_t code_size;
+ grub_uint32_t data_size;
+ grub_uint32_t bss_size;
+ grub_uint32_t entry_addr;
+ grub_uint32_t code_base;
+
+ grub_uint32_t data_base;
+ grub_uint32_t image_base;
+
+ grub_uint32_t section_alignment;
+ grub_uint32_t file_alignment;
+ grub_uint16_t major_os_version;
+ grub_uint16_t minor_os_version;
+ grub_uint16_t major_image_version;
+ grub_uint16_t minor_image_version;
+ grub_uint16_t major_subsystem_version;
+ grub_uint16_t minor_subsystem_version;
+ grub_uint32_t reserved;
+ grub_uint32_t image_size;
+ grub_uint32_t header_size;
+ grub_uint32_t checksum;
+ grub_uint16_t subsystem;
+ grub_uint16_t dll_characteristics;
+
+ grub_uint32_t stack_reserve_size;
+ grub_uint32_t stack_commit_size;
+ grub_uint32_t heap_reserve_size;
+ grub_uint32_t heap_commit_size;
+
+ grub_uint32_t loader_flags;
+ grub_uint32_t num_data_directories;
+
+ /* Data directories. */
+ struct grub_pe32_data_directory export_table;
+ struct grub_pe32_data_directory import_table;
+ struct grub_pe32_data_directory resource_table;
+ struct grub_pe32_data_directory exception_table;
+ struct grub_pe32_data_directory certificate_table;
+ struct grub_pe32_data_directory base_relocation_table;
+ struct grub_pe32_data_directory debug;
+ struct grub_pe32_data_directory architecture;
+ struct grub_pe32_data_directory global_ptr;
+ struct grub_pe32_data_directory tls_table;
+ struct grub_pe32_data_directory load_config_table;
+ struct grub_pe32_data_directory bound_import;
+ struct grub_pe32_data_directory iat;
+ struct grub_pe32_data_directory delay_import_descriptor;
+ struct grub_pe32_data_directory com_runtime_header;
+ struct grub_pe32_data_directory reserved_entry;
+};
+
+struct grub_pe64_optional_header
+{
+ grub_uint16_t magic;
+ grub_uint8_t major_linker_version;
+ grub_uint8_t minor_linker_version;
+ grub_uint32_t code_size;
+ grub_uint32_t data_size;
+ grub_uint32_t bss_size;
+ grub_uint32_t entry_addr;
+ grub_uint32_t code_base;
+
+ grub_uint64_t image_base;
+
+ grub_uint32_t section_alignment;
+ grub_uint32_t file_alignment;
+ grub_uint16_t major_os_version;
+ grub_uint16_t minor_os_version;
+ grub_uint16_t major_image_version;
+ grub_uint16_t minor_image_version;
+ grub_uint16_t major_subsystem_version;
+ grub_uint16_t minor_subsystem_version;
+ grub_uint32_t reserved;
+ grub_uint32_t image_size;
+ grub_uint32_t header_size;
+ grub_uint32_t checksum;
+ grub_uint16_t subsystem;
+ grub_uint16_t dll_characteristics;
+
+ grub_uint64_t stack_reserve_size;
+ grub_uint64_t stack_commit_size;
+ grub_uint64_t heap_reserve_size;
+ grub_uint64_t heap_commit_size;
+
+ grub_uint32_t loader_flags;
+ grub_uint32_t num_data_directories;
+
+ /* Data directories. */
+ struct grub_pe32_data_directory export_table;
+ struct grub_pe32_data_directory import_table;
+ struct grub_pe32_data_directory resource_table;
+ struct grub_pe32_data_directory exception_table;
+ struct grub_pe32_data_directory certificate_table;
+ struct grub_pe32_data_directory base_relocation_table;
+ struct grub_pe32_data_directory debug;
+ struct grub_pe32_data_directory architecture;
+ struct grub_pe32_data_directory global_ptr;
+ struct grub_pe32_data_directory tls_table;
+ struct grub_pe32_data_directory load_config_table;
+ struct grub_pe32_data_directory bound_import;
+ struct grub_pe32_data_directory iat;
+ struct grub_pe32_data_directory delay_import_descriptor;
+ struct grub_pe32_data_directory com_runtime_header;
+ struct grub_pe32_data_directory reserved_entry;
+};
+
+#define GRUB_PE32_PE32_MAGIC 0x10b
+#define GRUB_PE32_PE64_MAGIC 0x20b
+
+#define GRUB_PE32_SUBSYSTEM_EFI_APPLICATION 10
+
+#define GRUB_PE32_NUM_DATA_DIRECTORIES 16
+
+struct grub_pe32_section_table
+{
+ char name[8];
+ grub_uint32_t virtual_size;
+ grub_uint32_t virtual_address;
+ grub_uint32_t raw_data_size;
+ grub_uint32_t raw_data_offset;
+ grub_uint32_t relocations_offset;
+ grub_uint32_t line_numbers_offset;
+ grub_uint16_t num_relocations;
+ grub_uint16_t num_line_numbers;
+ grub_uint32_t characteristics;
+};
+
+#define GRUB_PE32_SCN_CNT_CODE 0x00000020
+#define GRUB_PE32_SCN_CNT_INITIALIZED_DATA 0x00000040
+#define GRUB_PE32_SCN_MEM_DISCARDABLE 0x02000000
+#define GRUB_PE32_SCN_MEM_EXECUTE 0x20000000
+#define GRUB_PE32_SCN_MEM_READ 0x40000000
+#define GRUB_PE32_SCN_MEM_WRITE 0x80000000
+
+#define GRUB_PE32_SCN_ALIGN_1BYTES 0x00100000
+#define GRUB_PE32_SCN_ALIGN_2BYTES 0x00200000
+#define GRUB_PE32_SCN_ALIGN_4BYTES 0x00300000
+#define GRUB_PE32_SCN_ALIGN_8BYTES 0x00400000
+#define GRUB_PE32_SCN_ALIGN_16BYTES 0x00500000
+#define GRUB_PE32_SCN_ALIGN_32BYTES 0x00600000
+#define GRUB_PE32_SCN_ALIGN_64BYTES 0x00700000
+
+#define GRUB_PE32_SCN_ALIGN_SHIFT 20
+#define GRUB_PE32_SCN_ALIGN_MASK 7
+
+#define GRUB_PE32_SIGNATURE_SIZE 4
+
+struct grub_pe32_header
+{
+ /* This should be filled in with GRUB_PE32_MSDOS_STUB. */
+ grub_uint8_t msdos_stub[GRUB_PE32_MSDOS_STUB_SIZE];
+
+ /* This is always PE\0\0. */
+ char signature[GRUB_PE32_SIGNATURE_SIZE];
+
+ /* The COFF file header. */
+ struct grub_pe32_coff_header coff_header;
+
+#if GRUB_TARGET_SIZEOF_VOID_P == 8
+ /* The Optional header. */
+ struct grub_pe64_optional_header optional_header;
+#else
+ /* The Optional header. */
+ struct grub_pe32_optional_header optional_header;
+#endif
+};
+
+struct grub_pe32_fixup_block
+{
+ grub_uint32_t page_rva;
+ grub_uint32_t block_size;
+ grub_uint16_t entries[0];
+};
+
+#define GRUB_PE32_FIXUP_ENTRY(type, offset) (((type) << 12) | (offset))
+
+#define GRUB_PE32_REL_BASED_ABSOLUTE 0
+#define GRUB_PE32_REL_BASED_HIGH 1
+#define GRUB_PE32_REL_BASED_LOW 2
+#define GRUB_PE32_REL_BASED_HIGHLOW 3
+#define GRUB_PE32_REL_BASED_HIGHADJ 4
+#define GRUB_PE32_REL_BASED_MIPS_JMPADDR 5
+#define GRUB_PE32_REL_BASED_ARM_MOV32A 5
+#define GRUB_PE32_REL_BASED_RISCV_HI20 5
+#define GRUB_PE32_REL_BASED_SECTION 6
+#define GRUB_PE32_REL_BASED_REL 7
+#define GRUB_PE32_REL_BASED_ARM_MOV32T 7
+#define GRUB_PE32_REL_BASED_RISCV_LOW12I 7
+#define GRUB_PE32_REL_BASED_RISCV_LOW12S 8
+#define GRUB_PE32_REL_BASED_IA64_IMM64 9
+#define GRUB_PE32_REL_BASED_DIR64 10
+#define GRUB_PE32_REL_BASED_HIGH3ADJ 11
+
+struct grub_pe32_symbol
+{
+ union
+ {
+ char short_name[8];
+ grub_uint32_t long_name[2];
+ };
+
+ grub_uint32_t value;
+ grub_uint16_t section;
+ grub_uint16_t type;
+ grub_uint8_t storage_class;
+ grub_uint8_t num_aux;
+} GRUB_PACKED;
+
+#define GRUB_PE32_SYM_CLASS_EXTERNAL 2
+#define GRUB_PE32_SYM_CLASS_STATIC 3
+#define GRUB_PE32_SYM_CLASS_FILE 0x67
+
+#define GRUB_PE32_DT_FUNCTION 0x20
+
+struct grub_pe32_reloc
+{
+ grub_uint32_t offset;
+ grub_uint32_t symtab_index;
+ grub_uint16_t type;
+} GRUB_PACKED;
+
+#define GRUB_PE32_REL_I386_DIR32 0x6
+#define GRUB_PE32_REL_I386_REL32 0x14
+
+#endif /* ! GRUB_EFI_PE32_HEADER */
diff --git a/include/grub/efi/sb.h b/include/grub/efi/sb.h
new file mode 100644
index 0000000..30c4335
--- /dev/null
+++ b/include/grub/efi/sb.h
@@ -0,0 +1,43 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2020 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_SB_H
+#define GRUB_EFI_SB_H 1
+
+#include <grub/types.h>
+#include <grub/dl.h>
+
+#define GRUB_EFI_SECUREBOOT_MODE_UNSET 0
+#define GRUB_EFI_SECUREBOOT_MODE_UNKNOWN 1
+#define GRUB_EFI_SECUREBOOT_MODE_DISABLED 2
+#define GRUB_EFI_SECUREBOOT_MODE_ENABLED 3
+
+#ifdef GRUB_MACHINE_EFI
+extern grub_uint8_t
+EXPORT_FUNC (grub_efi_get_secureboot) (void);
+
+extern void
+grub_shim_lock_verifier_setup (void);
+#else
+static inline grub_uint8_t
+grub_efi_get_secureboot (void)
+{
+ return GRUB_EFI_SECUREBOOT_MODE_UNSET;
+}
+#endif
+#endif /* GRUB_EFI_SB_H */
diff --git a/include/grub/efi/tpm.h b/include/grub/efi/tpm.h
new file mode 100644
index 0000000..ec39725
--- /dev/null
+++ b/include/grub/efi/tpm.h
@@ -0,0 +1,198 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2018 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_EFI_TPM_HEADER
+#define GRUB_EFI_TPM_HEADER 1
+
+#define EFI_TPM_GUID {0xf541796d, 0xa62e, 0x4954, {0xa7, 0x75, 0x95, 0x84, 0xf6, 0x1b, 0x9c, 0xdd }};
+#define EFI_TPM2_GUID {0x607f766c, 0x7455, 0x42be, {0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f }};
+
+#define TCG_ALG_SHA 0x00000004
+
+/* These structs are as defined in the TCG EFI Protocol Specification, family 2.0. */
+
+struct __TCG_VERSION
+{
+ grub_efi_uint8_t Major;
+ grub_efi_uint8_t Minor;
+ grub_efi_uint8_t RevMajor;
+ grub_efi_uint8_t RevMinor;
+};
+typedef struct __TCG_VERSION TCG_VERSION;
+
+struct __TCG_EFI_BOOT_SERVICE_CAPABILITY
+{
+ /* Size of this structure. */
+ grub_efi_uint8_t Size;
+ TCG_VERSION StructureVersion;
+ TCG_VERSION ProtocolSpecVersion;
+ /* Hash algorithms supported by this TPM. */
+ grub_efi_uint8_t HashAlgorithmBitmap;
+ /* 1 if TPM present. */
+ char TPMPresentFlag;
+ /* 1 if TPM deactivated. */
+ char TPMDeactivatedFlag;
+};
+typedef struct __TCG_EFI_BOOT_SERVICE_CAPABILITY TCG_EFI_BOOT_SERVICE_CAPABILITY;
+
+struct tdTCG_PCR_EVENT
+{
+ grub_efi_uint32_t PCRIndex;
+ grub_efi_uint32_t EventType;
+ grub_efi_uint8_t digest[20];
+ grub_efi_uint32_t EventSize;
+ grub_efi_uint8_t Event[1];
+};
+typedef struct tdTCG_PCR_EVENT TCG_PCR_EVENT;
+
+struct grub_efi_tpm_protocol
+{
+ grub_efi_status_t (*status_check) (struct grub_efi_tpm_protocol *this,
+ TCG_EFI_BOOT_SERVICE_CAPABILITY *
+ ProtocolCapability,
+ grub_efi_uint32_t *TCGFeatureFlags,
+ grub_efi_physical_address_t *
+ EventLogLocation,
+ grub_efi_physical_address_t *
+ EventLogLastEntry);
+ grub_efi_status_t (*hash_all) (struct grub_efi_tpm_protocol *this,
+ grub_efi_uint8_t *HashData,
+ grub_efi_uint64_t HashLen,
+ grub_efi_uint32_t AlgorithmId,
+ grub_efi_uint64_t *HashedDataLen,
+ grub_efi_uint8_t **HashedDataResult);
+ grub_efi_status_t (*log_event) (struct grub_efi_tpm_protocol *this,
+ TCG_PCR_EVENT *TCGLogData,
+ grub_efi_uint32_t *EventNumber,
+ grub_efi_uint32_t Flags);
+ grub_efi_status_t (*pass_through_to_tpm) (struct grub_efi_tpm_protocol *
+ this,
+ grub_efi_uint32_t
+ TpmInputParameterBlockSize,
+ grub_efi_uint8_t *
+ TpmInputParameterBlock,
+ grub_efi_uint32_t
+ TpmOutputParameterBlockSize,
+ grub_efi_uint8_t *
+ TpmOutputParameterBlock);
+ grub_efi_status_t (*log_extend_event) (struct grub_efi_tpm_protocol *this,
+ grub_efi_physical_address_t HashData,
+ grub_efi_uint64_t HashDataLen,
+ grub_efi_uint32_t AlgorithmId,
+ TCG_PCR_EVENT *TCGLogData,
+ grub_efi_uint32_t *EventNumber,
+ grub_efi_physical_address_t *
+ EventLogLastEntry);
+};
+
+typedef struct grub_efi_tpm_protocol grub_efi_tpm_protocol_t;
+
+typedef grub_efi_uint32_t EFI_TCG2_EVENT_LOG_BITMAP;
+typedef grub_efi_uint32_t EFI_TCG2_EVENT_LOG_FORMAT;
+typedef grub_efi_uint32_t EFI_TCG2_EVENT_ALGORITHM_BITMAP;
+
+struct tdEFI_TCG2_VERSION
+{
+ grub_efi_uint8_t Major;
+ grub_efi_uint8_t Minor;
+} GRUB_PACKED;
+typedef struct tdEFI_TCG2_VERSION EFI_TCG2_VERSION;
+
+struct tdEFI_TCG2_BOOT_SERVICE_CAPABILITY
+{
+ grub_efi_uint8_t Size;
+ EFI_TCG2_VERSION StructureVersion;
+ EFI_TCG2_VERSION ProtocolVersion;
+ EFI_TCG2_EVENT_ALGORITHM_BITMAP HashAlgorithmBitmap;
+ EFI_TCG2_EVENT_LOG_BITMAP SupportedEventLogs;
+ grub_efi_boolean_t TPMPresentFlag;
+ grub_efi_uint16_t MaxCommandSize;
+ grub_efi_uint16_t MaxResponseSize;
+ grub_efi_uint32_t ManufacturerID;
+ grub_efi_uint32_t NumberOfPcrBanks;
+ EFI_TCG2_EVENT_ALGORITHM_BITMAP ActivePcrBanks;
+};
+typedef struct tdEFI_TCG2_BOOT_SERVICE_CAPABILITY EFI_TCG2_BOOT_SERVICE_CAPABILITY;
+
+typedef grub_efi_uint32_t TCG_PCRINDEX;
+typedef grub_efi_uint32_t TCG_EVENTTYPE;
+
+struct tdEFI_TCG2_EVENT_HEADER
+{
+ grub_efi_uint32_t HeaderSize;
+ grub_efi_uint16_t HeaderVersion;
+ TCG_PCRINDEX PCRIndex;
+ TCG_EVENTTYPE EventType;
+} GRUB_PACKED;
+typedef struct tdEFI_TCG2_EVENT_HEADER EFI_TCG2_EVENT_HEADER;
+
+struct tdEFI_TCG2_EVENT
+{
+ grub_efi_uint32_t Size;
+ EFI_TCG2_EVENT_HEADER Header;
+ grub_efi_uint8_t Event[1];
+} GRUB_PACKED;
+typedef struct tdEFI_TCG2_EVENT EFI_TCG2_EVENT;
+
+struct grub_efi_tpm2_protocol
+{
+ grub_efi_status_t (*get_capability) (struct grub_efi_tpm2_protocol *this,
+ EFI_TCG2_BOOT_SERVICE_CAPABILITY *
+ ProtocolCapability);
+ grub_efi_status_t (*get_event_log) (struct grub_efi_tpm2_protocol *this,
+ EFI_TCG2_EVENT_LOG_FORMAT
+ EventLogFormat,
+ grub_efi_physical_address_t *
+ EventLogLocation,
+ grub_efi_physical_address_t *
+ EventLogLastEntry,
+ grub_efi_boolean_t * EventLogTruncated);
+ grub_efi_status_t (*hash_log_extend_event) (struct grub_efi_tpm2_protocol *
+ this, grub_efi_uint64_t Flags,
+ grub_efi_physical_address_t
+ DataToHash,
+ grub_efi_uint64_t DataToHashLen,
+ EFI_TCG2_EVENT *EfiTcgEvent);
+ grub_efi_status_t (*submit_command) (struct grub_efi_tpm2_protocol *this,
+ grub_efi_uint32_t
+ InputParameterBlockSize,
+ grub_efi_uint8_t *InputParameterBlock,
+ grub_efi_uint32_t
+ OutputParameterBlockSize,
+ grub_efi_uint8_t *
+ OutputParameterBlock);
+ grub_efi_status_t (*get_active_pcr_banks) (struct grub_efi_tpm2_protocol *
+ this,
+ grub_efi_uint32_t *
+ ActivePcrBanks);
+ grub_efi_status_t (*set_active_pcr_banks) (struct grub_efi_tpm2_protocol *
+ this,
+ grub_efi_uint32_t
+ ActivePcrBanks);
+ grub_efi_status_t (*get_result_of_set_active_pcr_banks) (struct
+ grub_efi_tpm2_protocol
+ *this,
+ grub_efi_uint32_t *
+ OperationPresent,
+ grub_efi_uint32_t *
+ Response);
+};
+
+typedef struct grub_efi_tpm2_protocol grub_efi_tpm2_protocol_t;
+
+#endif
diff --git a/include/grub/efi/uga_draw.h b/include/grub/efi/uga_draw.h
new file mode 100644
index 0000000..a31f267
--- /dev/null
+++ b/include/grub/efi/uga_draw.h
@@ -0,0 +1,76 @@
+/* uga_draw.h - definitions of the uga draw protocol */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2008 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* The console control protocol is not a part of the EFI spec,
+ but defined in Intel's Sample Implementation. */
+
+#ifndef GRUB_EFI_UGA_DRAW_HEADER
+#define GRUB_EFI_UGA_DRAW_HEADER 1
+
+#define GRUB_EFI_UGA_DRAW_GUID \
+ { 0x982c298b, 0xf4fa, 0x41cb, { 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 }}
+
+enum grub_efi_uga_blt_operation
+{
+ GRUB_EFI_UGA_VIDEO_FILL,
+ GRUB_EFI_UGA_VIDEO_TO_BLT,
+ GRUB_EFI_UGA_BLT_TO_VIDEO,
+ GRUB_EFI_UGA_VIDEO_TO_VIDEO,
+ GRUB_EFI_UGA_BLT_MAX
+};
+
+struct grub_efi_uga_pixel
+{
+ grub_uint8_t Blue;
+ grub_uint8_t Green;
+ grub_uint8_t Red;
+ grub_uint8_t Reserved;
+};
+
+struct grub_efi_uga_draw_protocol
+{
+ grub_efi_status_t
+ (*get_mode) (struct grub_efi_uga_draw_protocol *this,
+ grub_uint32_t *width,
+ grub_uint32_t *height,
+ grub_uint32_t *depth,
+ grub_uint32_t *refresh_rate);
+
+ grub_efi_status_t
+ (*set_mode) (struct grub_efi_uga_draw_protocol *this,
+ grub_uint32_t width,
+ grub_uint32_t height,
+ grub_uint32_t depth,
+ grub_uint32_t refresh_rate);
+
+ grub_efi_status_t
+ (*blt) (struct grub_efi_uga_draw_protocol *this,
+ struct grub_efi_uga_pixel *blt_buffer,
+ enum grub_efi_uga_blt_operation blt_operation,
+ grub_efi_uintn_t src_x,
+ grub_efi_uintn_t src_y,
+ grub_efi_uintn_t dest_x,
+ grub_efi_uintn_t dest_y,
+ grub_efi_uintn_t width,
+ grub_efi_uintn_t height,
+ grub_efi_uintn_t delta);
+};
+typedef struct grub_efi_uga_draw_protocol grub_efi_uga_draw_protocol_t;
+
+#endif /* ! GRUB_EFI_UGA_DRAW_HEADER */