1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Extensible Firmware Interface 4 * Based on 'Extensible Firmware Interface Specification' version 0.9, 5 * April 30, 1999 6 * 7 * Copyright (C) 1999 VA Linux Systems 8 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> 9 * Copyright (C) 1999, 2002-2003 Hewlett-Packard Co. 10 * David Mosberger-Tang <davidm@hpl.hp.com> 11 * Stephane Eranian <eranian@hpl.hp.com> 12 * 13 * From include/linux/efi.h in kernel 4.1 with some additions/subtractions 14 */ 15 16#ifndef _EFI_API_H 17#define _EFI_API_H 18 19#include <efi.h> 20#include <charset.h> 21#include <pe.h> 22 23/* UEFI spec version 2.9 */ 24#define EFI_SPECIFICATION_VERSION (2 << 16 | 100) 25 26/* Types and defines for EFI CreateEvent */ 27enum efi_timer_delay { 28 EFI_TIMER_STOP = 0, 29 EFI_TIMER_PERIODIC = 1, 30 EFI_TIMER_RELATIVE = 2 31}; 32 33typedef void *efi_hii_handle_t; 34typedef u16 *efi_string_t; 35typedef u16 efi_string_id_t; 36typedef u32 efi_hii_font_style_t; 37typedef u16 efi_question_id_t; 38typedef u16 efi_image_id_t; 39typedef u16 efi_form_id_t; 40 41#define EVT_TIMER 0x80000000 42#define EVT_RUNTIME 0x40000000 43#define EVT_NOTIFY_WAIT 0x00000100 44#define EVT_NOTIFY_SIGNAL 0x00000200 45#define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201 46#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202 47 48#define TPL_APPLICATION 0x04 49#define TPL_CALLBACK 0x08 50#define TPL_NOTIFY 0x10 51#define TPL_HIGH_LEVEL 0x1F 52 53struct efi_event; 54 55/* OsIndicationsSupported flags */ 56#define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001 57#define EFI_OS_INDICATIONS_TIMESTAMP_REVOCATION 0x0000000000000002 58#define EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED 0x0000000000000004 59#define EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED 0x0000000000000008 60#define EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED 0x0000000000000010 61#define EFI_OS_INDICATIONS_START_OS_RECOVERY 0x0000000000000020 62#define EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY 0x0000000000000040 63#define EFI_OS_INDICATIONS_JSON_CONFIG_DATA_REFRESH 0x0000000000000080 64 65/* EFI Boot Services table */ 66#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42 67struct efi_boot_services { 68 struct efi_table_hdr hdr; 69 efi_status_t (EFIAPI *raise_tpl)(efi_uintn_t new_tpl); 70 void (EFIAPI *restore_tpl)(efi_uintn_t old_tpl); 71 72 efi_status_t (EFIAPI *allocate_pages)(int, int, efi_uintn_t, 73 efi_physical_addr_t *); 74 efi_status_t (EFIAPI *free_pages)(efi_physical_addr_t, efi_uintn_t); 75 efi_status_t (EFIAPI *get_memory_map)(efi_uintn_t *memory_map_size, 76 struct efi_mem_desc *desc, 77 efi_uintn_t *key, 78 efi_uintn_t *desc_size, 79 u32 *desc_version); 80 efi_status_t (EFIAPI *allocate_pool)(int, efi_uintn_t, void **); 81 efi_status_t (EFIAPI *free_pool)(void *); 82 83 efi_status_t (EFIAPI *create_event)(uint32_t type, 84 efi_uintn_t notify_tpl, 85 void (EFIAPI *notify_function) ( 86 struct efi_event *event, 87 void *context), 88 void *notify_context, struct efi_event **event); 89 efi_status_t (EFIAPI *set_timer)(struct efi_event *event, 90 enum efi_timer_delay type, 91 uint64_t trigger_time); 92 efi_status_t (EFIAPI *wait_for_event)(efi_uintn_t number_of_events, 93 struct efi_event **event, 94 efi_uintn_t *index); 95 efi_status_t (EFIAPI *signal_event)(struct efi_event *event); 96 efi_status_t (EFIAPI *close_event)(struct efi_event *event); 97 efi_status_t (EFIAPI *check_event)(struct efi_event *event); 98#define EFI_NATIVE_INTERFACE 0x00000000 99 efi_status_t (EFIAPI *install_protocol_interface)( 100 efi_handle_t *handle, const efi_guid_t *protocol, 101 int protocol_interface_type, void *protocol_interface); 102 efi_status_t (EFIAPI *reinstall_protocol_interface)( 103 efi_handle_t handle, const efi_guid_t *protocol, 104 void *old_interface, void *new_interface); 105 efi_status_t (EFIAPI *uninstall_protocol_interface)( 106 efi_handle_t handle, const efi_guid_t *protocol, 107 void *protocol_interface); 108 efi_status_t (EFIAPI *handle_protocol)( 109 efi_handle_t handle, const efi_guid_t *protocol, 110 void **protocol_interface); 111 void *reserved; 112 efi_status_t (EFIAPI *register_protocol_notify)( 113 const efi_guid_t *protocol, struct efi_event *event, 114 void **registration); 115 efi_status_t (EFIAPI *locate_handle)( 116 enum efi_locate_search_type search_type, 117 const efi_guid_t *protocol, void *search_key, 118 efi_uintn_t *buffer_size, efi_handle_t *buffer); 119 efi_status_t (EFIAPI *locate_device_path)(const efi_guid_t *protocol, 120 struct efi_device_path **device_path, 121 efi_handle_t *device); 122 efi_status_t (EFIAPI *install_configuration_table)( 123 const efi_guid_t *guid, void *table); 124 125 efi_status_t (EFIAPI *load_image)(bool boot_policiy, 126 efi_handle_t parent_image, 127 struct efi_device_path *file_path, void *source_buffer, 128 efi_uintn_t source_size, efi_handle_t *image); 129 efi_status_t (EFIAPI *start_image)(efi_handle_t handle, 130 efi_uintn_t *exitdata_size, 131 u16 **exitdata); 132 efi_status_t (EFIAPI *exit)(efi_handle_t handle, 133 efi_status_t exit_status, 134 efi_uintn_t exitdata_size, u16 *exitdata); 135 efi_status_t (EFIAPI *unload_image)(efi_handle_t image_handle); 136 efi_status_t (EFIAPI *exit_boot_services)(efi_handle_t image_handle, 137 efi_uintn_t map_key); 138 139 efi_status_t (EFIAPI *get_next_monotonic_count)(u64 *count); 140 efi_status_t (EFIAPI *stall)(unsigned long usecs); 141 efi_status_t (EFIAPI *set_watchdog_timer)(unsigned long timeout, 142 uint64_t watchdog_code, unsigned long data_size, 143 uint16_t *watchdog_data); 144 efi_status_t(EFIAPI *connect_controller)(efi_handle_t controller_handle, 145 efi_handle_t *driver_image_handle, 146 struct efi_device_path *remaining_device_path, 147 bool recursive); 148 efi_status_t (EFIAPI *disconnect_controller)( 149 efi_handle_t controller_handle, 150 efi_handle_t driver_image_handle, 151 efi_handle_t child_handle); 152#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001 153#define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002 154#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004 155#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008 156#define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010 157#define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020 158 efi_status_t (EFIAPI *open_protocol)(efi_handle_t handle, 159 const efi_guid_t *protocol, void **interface, 160 efi_handle_t agent_handle, 161 efi_handle_t controller_handle, u32 attributes); 162 efi_status_t (EFIAPI *close_protocol)( 163 efi_handle_t handle, const efi_guid_t *protocol, 164 efi_handle_t agent_handle, 165 efi_handle_t controller_handle); 166 efi_status_t(EFIAPI *open_protocol_information)(efi_handle_t handle, 167 const efi_guid_t *protocol, 168 struct efi_open_protocol_info_entry **entry_buffer, 169 efi_uintn_t *entry_count); 170 efi_status_t (EFIAPI *protocols_per_handle)(efi_handle_t handle, 171 efi_guid_t ***protocol_buffer, 172 efi_uintn_t *protocols_buffer_count); 173 efi_status_t (EFIAPI *locate_handle_buffer) ( 174 enum efi_locate_search_type search_type, 175 const efi_guid_t *protocol, void *search_key, 176 efi_uintn_t *no_handles, efi_handle_t **buffer); 177 efi_status_t (EFIAPI *locate_protocol)(const efi_guid_t *protocol, 178 void *registration, void **protocol_interface); 179 efi_status_t (EFIAPI *install_multiple_protocol_interfaces)( 180 efi_handle_t *handle, ...); 181 efi_status_t (EFIAPI *uninstall_multiple_protocol_interfaces)( 182 efi_handle_t handle, ...); 183 efi_status_t (EFIAPI *calculate_crc32)(const void *data, 184 efi_uintn_t data_size, 185 u32 *crc32); 186 void (EFIAPI *copy_mem)(void *destination, const void *source, 187 size_t length); 188 void (EFIAPI *set_mem)(void *buffer, size_t size, uint8_t value); 189 efi_status_t (EFIAPI *create_event_ex)( 190 uint32_t type, efi_uintn_t notify_tpl, 191 void (EFIAPI *notify_function) ( 192 struct efi_event *event, 193 void *context), 194 void *notify_context, 195 const efi_guid_t *event_group, 196 struct efi_event **event); 197}; 198 199/* Types and defines for EFI ResetSystem */ 200enum efi_reset_type { 201 EFI_RESET_COLD = 0, 202 EFI_RESET_WARM = 1, 203 EFI_RESET_SHUTDOWN = 2, 204 EFI_RESET_PLATFORM_SPECIFIC = 3, 205}; 206 207/* EFI Runtime Services table */ 208#define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552ULL 209 210#define CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000 211#define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 0x00020000 212#define CAPSULE_FLAGS_INITIATE_RESET 0x00040000 213 214#define CAPSULE_SUPPORT_AUTHENTICATION 0x0000000000000001 215#define CAPSULE_SUPPORT_DEPENDENCY 0x0000000000000002 216 217#define EFI_CAPSULE_REPORT_GUID \ 218 EFI_GUID(0x39b68c46, 0xf7fb, 0x441b, 0xb6, 0xec, \ 219 0x16, 0xb0, 0xf6, 0x98, 0x21, 0xf3) 220 221#define EFI_MEMORY_RANGE_CAPSULE_GUID \ 222 EFI_GUID(0xde9f0ec, 0x88b6, 0x428f, 0x97, 0x7a, \ 223 0x25, 0x8f, 0x1d, 0xe, 0x5e, 0x72) 224 225#define EFI_FIRMWARE_MANAGEMENT_CAPSULE_ID_GUID \ 226 EFI_GUID(0x6dcbd5ed, 0xe82d, 0x4c44, 0xbd, 0xa1, \ 227 0x71, 0x94, 0x19, 0x9a, 0xd9, 0x2a) 228 229#define EFI_CONFORMANCE_PROFILES_TABLE_GUID \ 230 EFI_GUID(0x36122546, 0xf7ef, 0x4c8f, 0xbd, 0x9b, \ 231 0xeb, 0x85, 0x25, 0xb5, 0x0c, 0x0b) 232 233#define EFI_CONFORMANCE_PROFILES_TABLE_VERSION 1 234 235#define EFI_CONFORMANCE_PROFILE_EBBR_2_1_GUID \ 236 EFI_GUID(0xcce33c35, 0x74ac, 0x4087, 0xbc, 0xe7, \ 237 0x8b, 0x29, 0xb0, 0x2e, 0xeb, 0x27) 238 239struct efi_conformance_profiles_table { 240 u16 version; 241 u16 number_of_profiles; 242 efi_guid_t conformance_profiles[]; 243} __packed; 244 245struct efi_capsule_header { 246 efi_guid_t capsule_guid; 247 u32 header_size; 248 u32 flags; 249 u32 capsule_image_size; 250} __packed; 251 252struct efi_capsule_result_variable_header { 253 u32 variable_total_size; 254 u32 reserved; 255 efi_guid_t capsule_guid; 256 struct efi_time capsule_processed; 257 efi_status_t capsule_status; 258} __packed; 259 260struct efi_memory_range { 261 efi_physical_addr_t address; 262 u64 length; 263}; 264 265struct efi_memory_range_capsule { 266 struct efi_capsule_header *header; 267 /* EFI_MEMORY_TYPE: 0x80000000-0xFFFFFFFF */ 268 enum efi_memory_type os_requested_memory_type; 269 u64 number_of_memory_ranges; 270 struct efi_memory_range memory_ranges[]; 271} __packed; 272 273struct efi_firmware_management_capsule_header { 274 u32 version; 275 u16 embedded_driver_count; 276 u16 payload_item_count; 277 u64 item_offset_list[]; 278} __packed; 279 280struct efi_firmware_management_capsule_image_header { 281 u32 version; 282 efi_guid_t update_image_type_id; 283 u8 update_image_index; 284 u8 reserved[3]; 285 u32 update_image_size; 286 u32 update_vendor_code_size; 287 u64 update_hardware_instance; 288 u64 image_capsule_support; 289} __packed; 290 291struct efi_capsule_result_variable_fmp { 292 u16 version; 293 u8 payload_index; 294 u8 update_image_index; 295 efi_guid_t update_image_type_id; 296 // u16 capsule_file_name[]; 297 // u16 capsule_target[]; 298} __packed; 299 300#define EFI_RT_SUPPORTED_GET_TIME 0x0001 301#define EFI_RT_SUPPORTED_SET_TIME 0x0002 302#define EFI_RT_SUPPORTED_GET_WAKEUP_TIME 0x0004 303#define EFI_RT_SUPPORTED_SET_WAKEUP_TIME 0x0008 304#define EFI_RT_SUPPORTED_GET_VARIABLE 0x0010 305#define EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME 0x0020 306#define EFI_RT_SUPPORTED_SET_VARIABLE 0x0040 307#define EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP 0x0080 308#define EFI_RT_SUPPORTED_CONVERT_POINTER 0x0100 309#define EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT 0x0200 310#define EFI_RT_SUPPORTED_RESET_SYSTEM 0x0400 311#define EFI_RT_SUPPORTED_UPDATE_CAPSULE 0x0800 312#define EFI_RT_SUPPORTED_QUERY_CAPSULE_CAPABILITIES 0x1000 313#define EFI_RT_SUPPORTED_QUERY_VARIABLE_INFO 0x2000 314 315#define EFI_RT_PROPERTIES_TABLE_GUID \ 316 EFI_GUID(0xeb66918a, 0x7eef, 0x402a, 0x84, 0x2e, \ 317 0x93, 0x1d, 0x21, 0xc3, 0x8a, 0xe9) 318 319#define EFI_RT_PROPERTIES_TABLE_VERSION 0x1 320 321struct efi_rt_properties_table { 322 u16 version; 323 u16 length; 324 u32 runtime_services_supported; 325}; 326 327#define EFI_OPTIONAL_PTR 0x00000001 328 329struct efi_runtime_services { 330 struct efi_table_hdr hdr; 331 efi_status_t (EFIAPI *get_time)(struct efi_time *time, 332 struct efi_time_cap *capabilities); 333 efi_status_t (EFIAPI *set_time)(struct efi_time *time); 334 efi_status_t (EFIAPI *get_wakeup_time)(char *enabled, char *pending, 335 struct efi_time *time); 336 efi_status_t (EFIAPI *set_wakeup_time)(char enabled, 337 struct efi_time *time); 338 efi_status_t (EFIAPI *set_virtual_address_map)( 339 efi_uintn_t memory_map_size, 340 efi_uintn_t descriptor_size, 341 uint32_t descriptor_version, 342 struct efi_mem_desc *virtmap); 343 efi_status_t (EFIAPI *convert_pointer)( 344 efi_uintn_t debug_disposition, void **address); 345 efi_status_t (EFIAPI *get_variable)(u16 *variable_name, 346 const efi_guid_t *vendor, 347 u32 *attributes, 348 efi_uintn_t *data_size, void *data); 349 efi_status_t (EFIAPI *get_next_variable_name)( 350 efi_uintn_t *variable_name_size, 351 u16 *variable_name, efi_guid_t *vendor); 352 efi_status_t (EFIAPI *set_variable)(u16 *variable_name, 353 const efi_guid_t *vendor, 354 u32 attributes, 355 efi_uintn_t data_size, 356 const void *data); 357 efi_status_t (EFIAPI *get_next_high_mono_count)( 358 uint32_t *high_count); 359 void (EFIAPI *reset_system)(enum efi_reset_type reset_type, 360 efi_status_t reset_status, 361 unsigned long data_size, void *reset_data); 362 efi_status_t (EFIAPI *update_capsule)( 363 struct efi_capsule_header **capsule_header_array, 364 efi_uintn_t capsule_count, 365 u64 scatter_gather_list); 366 efi_status_t (EFIAPI *query_capsule_caps)( 367 struct efi_capsule_header **capsule_header_array, 368 efi_uintn_t capsule_count, 369 u64 *maximum_capsule_size, 370 u32 *reset_type); 371 efi_status_t (EFIAPI *query_variable_info)( 372 u32 attributes, 373 u64 *maximum_variable_storage_size, 374 u64 *remaining_variable_storage_size, 375 u64 *maximum_variable_size); 376}; 377 378/* EFI event group GUID definitions */ 379 380#define EFI_EVENT_GROUP_EXIT_BOOT_SERVICES \ 381 EFI_GUID(0x27abf055, 0xb1b8, 0x4c26, 0x80, 0x48, \ 382 0x74, 0x8f, 0x37, 0xba, 0xa2, 0xdf) 383 384#define EFI_EVENT_GROUP_BEFORE_EXIT_BOOT_SERVICES \ 385 EFI_GUID(0x8be0e274, 0x3970, 0x4b44, 0x80, 0xc5, \ 386 0x1a, 0xb9, 0x50, 0x2f, 0x3b, 0xfc) 387 388#define EFI_EVENT_GROUP_VIRTUAL_ADDRESS_CHANGE \ 389 EFI_GUID(0x13fa7698, 0xc831, 0x49c7, 0x87, 0xea, \ 390 0x8f, 0x43, 0xfc, 0xc2, 0x51, 0x96) 391 392#define EFI_EVENT_GROUP_MEMORY_MAP_CHANGE \ 393 EFI_GUID(0x78bee926, 0x692f, 0x48fd, 0x9e, 0xdb, \ 394 0x01, 0x42, 0x2e, 0xf0, 0xd7, 0xab) 395 396#define EFI_EVENT_GROUP_READY_TO_BOOT \ 397 EFI_GUID(0x7ce88fb3, 0x4bd7, 0x4679, 0x87, 0xa8, \ 398 0xa8, 0xd8, 0xde, 0xe5, 0x0d, 0x2b) 399 400#define EFI_EVENT_GROUP_AFTER_READY_TO_BOOT \ 401 EFI_GUID(0x3a2a00ad, 0x98b9, 0x4cdf, 0xa4, 0x78, \ 402 0x70, 0x27, 0x77, 0xf1, 0xc1, 0xb) 403 404#define EFI_EVENT_GROUP_RESET_SYSTEM \ 405 EFI_GUID(0x62da6a56, 0x13fb, 0x485a, 0xa8, 0xda, \ 406 0xa3, 0xdd, 0x79, 0x12, 0xcb, 0x6b) 407#define EFI_EVENT_GROUP_RETURN_TO_EFIBOOTMGR \ 408 EFI_GUID(0xb4a40fe6, 0x9149, 0x4f29, 0x94, 0x47, \ 409 0x49, 0x38, 0x7a, 0x7f, 0xab, 0x87) 410 411/* EFI Configuration Table and GUID definitions */ 412#define NULL_GUID \ 413 EFI_GUID(0x00000000, 0x0000, 0x0000, 0x00, 0x00, \ 414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) 415 416#define EFI_GLOBAL_VARIABLE_GUID \ 417 EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, \ 418 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c) 419 420#define EFI_IMAGE_SECURITY_DATABASE_GUID \ 421 EFI_GUID(0xd719b2cb, 0x3d3a, 0x4596, 0xa3, 0xbc, \ 422 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f) 423 424#define EFI_FDT_GUID \ 425 EFI_GUID(0xb1b621d5, 0xf19c, 0x41a5, \ 426 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0) 427 428#define EFI_ACPI_TABLE_GUID \ 429 EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, \ 430 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81) 431 432#define SMBIOS_TABLE_GUID \ 433 EFI_GUID(0xeb9d2d31, 0x2d88, 0x11d3, \ 434 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 435 436#define SMBIOS3_TABLE_GUID \ 437 EFI_GUID(0xf2fd1544, 0x9794, 0x4a2c, \ 438 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94) 439 440#define EFI_LOAD_FILE_PROTOCOL_GUID \ 441 EFI_GUID(0x56ec3091, 0x954c, 0x11d2, \ 442 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 443 444#define EFI_LOAD_FILE2_PROTOCOL_GUID \ 445 EFI_GUID(0x4006c0c1, 0xfcb3, 0x403e, \ 446 0x99, 0x6d, 0x4a, 0x6c, 0x87, 0x24, 0xe0, 0x6d) 447 448#define EFI_TCG2_FINAL_EVENTS_TABLE_GUID \ 449 EFI_GUID(0x1e2ed096, 0x30e2, 0x4254, 0xbd, \ 450 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25) 451 452#define EFI_RNG_PROTOCOL_GUID \ 453 EFI_GUID(0x3152bca5, 0xeade, 0x433d, 0x86, 0x2e, \ 454 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44) 455 456#define EFI_DT_FIXUP_PROTOCOL_GUID \ 457 EFI_GUID(0xe617d64c, 0xfe08, 0x46da, 0xf4, 0xdc, \ 458 0xbb, 0xd5, 0x87, 0x0c, 0x73, 0x00) 459 460#define EFI_TCG2_PROTOCOL_GUID \ 461 EFI_GUID(0x607f766c, 0x7455, 0x42be, 0x93, \ 462 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f) 463 464#define RISCV_EFI_BOOT_PROTOCOL_GUID \ 465 EFI_GUID(0xccd15fec, 0x6f73, 0x4eec, 0x83, \ 466 0x95, 0x3e, 0x69, 0xe4, 0xb9, 0x40, 0xbf) 467 468/** 469 * struct efi_configuration_table - EFI Configuration Table 470 * 471 * This table contains a set of GUID/pointer pairs. 472 * The EFI Configuration Table may contain at most one instance of each table type. 473 * 474 * @guid: GUID that uniquely identifies the system configuration table 475 * @table: A pointer to the table associated with guid 476 */ 477struct efi_configuration_table { 478 efi_guid_t guid; 479 void *table; 480} __packed; 481 482#define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL) 483 484/** 485 * struct efi_system_table - EFI System Table 486 * 487 * EFI System Table contains pointers to the runtime and boot services tables. 488 * 489 * @hdr: The table header for the EFI System Table 490 * @fw_vendor: A pointer to a null terminated string that identifies the vendor 491 * that produces the system firmware 492 * @fw_revision: The revision of the system firmware 493 * @con_in_handle: The handle for the active console input device 494 * @con_in: A pointer to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL interface 495 * that is associated with con_in_handle 496 * @con_out_handle: The handle for the active console output device 497 * @con_out: A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface 498 * that is associated with con_out_handle 499 * @stderr_handle: The handle for the active standard error console device 500 * @std_err: A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface 501 * that is associated with stderr_handle 502 * @runtime: A pointer to the EFI Runtime Services Table 503 * @boottime: A pointer to the EFI Boot Services Table 504 * @nr_tables: The number of system configuration tables 505 * @tables: A pointer to the system configuration tables 506 */ 507struct efi_system_table { 508 struct efi_table_hdr hdr; 509 u16 *fw_vendor; /* physical addr of wchar_t vendor string */ 510 u32 fw_revision; 511 efi_handle_t con_in_handle; 512 struct efi_simple_text_input_protocol *con_in; 513 efi_handle_t con_out_handle; 514 struct efi_simple_text_output_protocol *con_out; 515 efi_handle_t stderr_handle; 516 struct efi_simple_text_output_protocol *std_err; 517 struct efi_runtime_services *runtime; 518 struct efi_boot_services *boottime; 519 efi_uintn_t nr_tables; 520 struct efi_configuration_table *tables; 521}; 522 523/** 524 * efi_main() - entry point of EFI applications 525 * 526 * @image_handle: handle with the Loaded Image Protocol 527 * @systab: pointer to the system table 528 * Return: status code 529 */ 530efi_status_t EFIAPI efi_main(efi_handle_t image_handle, 531 struct efi_system_table *systab); 532 533#define EFI_LOADED_IMAGE_PROTOCOL_GUID \ 534 EFI_GUID(0x5b1b31a1, 0x9562, 0x11d2, \ 535 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 536 537#define EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL_GUID \ 538 EFI_GUID(0xbc62157e, 0x3e33, 0x4fec, \ 539 0x99, 0x20, 0x2d, 0x3b, 0x36, 0xd7, 0x50, 0xdf) 540 541#define EFI_LOADED_IMAGE_PROTOCOL_REVISION 0x1000 542 543struct efi_loaded_image { 544 u32 revision; 545 void *parent_handle; 546 struct efi_system_table *system_table; 547 efi_handle_t device_handle; 548 struct efi_device_path *file_path; 549 void *reserved; 550 u32 load_options_size; 551 void *load_options; 552 void *image_base; 553 aligned_u64 image_size; 554 unsigned int image_code_type; 555 unsigned int image_data_type; 556 efi_status_t (EFIAPI *unload)(efi_handle_t image_handle); 557}; 558 559#define EFI_DEVICE_PATH_PROTOCOL_GUID \ 560 EFI_GUID(0x09576e91, 0x6d3f, 0x11d2, \ 561 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 562 563#define DEVICE_PATH_TYPE_END 0x7f 564# define DEVICE_PATH_SUB_TYPE_INSTANCE_END 0x01 565# define DEVICE_PATH_SUB_TYPE_END 0xff 566 567struct efi_mac_addr { 568 u8 addr[32]; 569} __packed; 570 571#define DEVICE_PATH_TYPE_HARDWARE_DEVICE 0x01 572# define DEVICE_PATH_SUB_TYPE_MEMORY 0x03 573# define DEVICE_PATH_SUB_TYPE_VENDOR 0x04 574# define DEVICE_PATH_SUB_TYPE_CONTROLLER 0x05 575 576struct efi_device_path_memory { 577 struct efi_device_path dp; 578 u32 memory_type; 579 u64 start_address; 580 u64 end_address; 581} __packed; 582 583struct efi_device_path_vendor { 584 struct efi_device_path dp; 585 efi_guid_t guid; 586 u8 vendor_data[]; 587} __packed; 588 589struct efi_device_path_udevice { 590 struct efi_device_path dp; 591 efi_guid_t guid; 592 int uclass_id; 593 int dev_number; 594} __packed; 595 596struct efi_device_path_controller { 597 struct efi_device_path dp; 598 u32 controller_number; 599} __packed; 600 601#define DEVICE_PATH_TYPE_ACPI_DEVICE 0x02 602# define DEVICE_PATH_SUB_TYPE_ACPI_DEVICE 0x01 603 604#define EFI_PNP_ID(ID) (u32)(((ID) << 16) | 0x41D0) 605#define EISA_PNP_ID(ID) EFI_PNP_ID(ID) 606#define EISA_PNP_NUM(ID) ((ID) >> 16) 607 608struct efi_device_path_acpi_path { 609 struct efi_device_path dp; 610 u32 hid; 611 u32 uid; 612} __packed; 613 614#define DEVICE_PATH_TYPE_MESSAGING_DEVICE 0x03 615# define DEVICE_PATH_SUB_TYPE_MSG_ATAPI 0x01 616# define DEVICE_PATH_SUB_TYPE_MSG_SCSI 0x02 617# define DEVICE_PATH_SUB_TYPE_MSG_USB 0x05 618# define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR 0x0b 619# define DEVICE_PATH_SUB_TYPE_MSG_UART 0x0e 620# define DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS 0x0f 621# define DEVICE_PATH_SUB_TYPE_MSG_USB_WWI 0x10 622# define DEVICE_PATH_SUB_TYPE_MSG_SATA 0x12 623# define DEVICE_PATH_SUB_TYPE_MSG_NVME 0x17 624# define DEVICE_PATH_SUB_TYPE_MSG_URI 0x18 625# define DEVICE_PATH_SUB_TYPE_MSG_SD 0x1a 626# define DEVICE_PATH_SUB_TYPE_MSG_MMC 0x1d 627 628struct efi_device_path_atapi { 629 struct efi_device_path dp; 630 u8 primary_secondary; 631 u8 slave_master; 632 u16 logical_unit_number; 633} __packed; 634 635struct efi_device_path_scsi { 636 struct efi_device_path dp; 637 u16 target_id; 638 u16 logical_unit_number; 639} __packed; 640 641struct efi_device_path_uart { 642 struct efi_device_path dp; 643 u32 reserved; 644 u64 baud_rate; 645 u8 data_bits; 646 u8 parity; 647 u8 stop_bits; 648} __packed; 649 650struct efi_device_path_usb { 651 struct efi_device_path dp; 652 u8 parent_port_number; 653 u8 usb_interface; 654} __packed; 655 656struct efi_device_path_sata { 657 struct efi_device_path dp; 658 u16 hba_port; 659 u16 port_multiplier_port; 660 u16 logical_unit_number; 661} __packed; 662 663struct efi_device_path_mac_addr { 664 struct efi_device_path dp; 665 struct efi_mac_addr mac; 666 u8 if_type; 667} __packed; 668 669struct efi_device_path_usb_class { 670 struct efi_device_path dp; 671 u16 vendor_id; 672 u16 product_id; 673 u8 device_class; 674 u8 device_subclass; 675 u8 device_protocol; 676} __packed; 677 678struct efi_device_path_sd_mmc_path { 679 struct efi_device_path dp; 680 u8 slot_number; 681} __packed; 682 683struct efi_device_path_nvme { 684 struct efi_device_path dp; 685 u32 ns_id; 686 u8 eui64[8]; 687} __packed; 688 689struct efi_device_path_uri { 690 struct efi_device_path dp; 691 u8 uri[]; 692} __packed; 693 694#define DEVICE_PATH_TYPE_MEDIA_DEVICE 0x04 695# define DEVICE_PATH_SUB_TYPE_HARD_DRIVE_PATH 0x01 696# define DEVICE_PATH_SUB_TYPE_CDROM_PATH 0x02 697# define DEVICE_PATH_SUB_TYPE_VENDOR_PATH 0x03 698# define DEVICE_PATH_SUB_TYPE_FILE_PATH 0x04 699 700struct efi_device_path_hard_drive_path { 701 struct efi_device_path dp; 702 u32 partition_number; 703 u64 partition_start; 704 u64 partition_end; 705 u8 partition_signature[16]; 706 u8 partmap_type; 707 u8 signature_type; 708} __packed; 709 710struct efi_device_path_cdrom_path { 711 struct efi_device_path dp; 712 u32 boot_entry; 713 u64 partition_start; 714 u64 partition_size; 715} __packed; 716 717struct efi_device_path_file_path { 718 struct efi_device_path dp; 719 u16 str[]; 720} __packed; 721 722#define EFI_BLOCK_IO_PROTOCOL_GUID \ 723 EFI_GUID(0x964e5b21, 0x6459, 0x11d2, \ 724 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 725 726struct efi_block_io_media { 727 u32 media_id; 728 char removable_media; 729 char media_present; 730 char logical_partition; 731 char read_only; 732 char write_caching; 733 u8 pad[3]; 734 u32 block_size; 735 u32 io_align; 736 u8 pad2[4]; 737 u64 last_block; 738 /* Added in revision 2 of the protocol */ 739 u64 lowest_aligned_lba; 740 u32 logical_blocks_per_physical_block; 741 /* Added in revision 3 of the protocol */ 742 u32 optimal_transfer_length_granualarity; 743}; 744 745#define EFI_BLOCK_IO_PROTOCOL_REVISION2 0x00020001 746#define EFI_BLOCK_IO_PROTOCOL_REVISION3 0x0002001f 747 748struct efi_block_io { 749 u64 revision; 750 struct efi_block_io_media *media; 751 efi_status_t (EFIAPI *reset)(struct efi_block_io *this, 752 char extended_verification); 753 efi_status_t (EFIAPI *read_blocks)(struct efi_block_io *this, 754 u32 media_id, u64 lba, efi_uintn_t buffer_size, 755 void *buffer); 756 efi_status_t (EFIAPI *write_blocks)(struct efi_block_io *this, 757 u32 media_id, u64 lba, efi_uintn_t buffer_size, 758 void *buffer); 759 efi_status_t (EFIAPI *flush_blocks)(struct efi_block_io *this); 760}; 761 762struct simple_text_output_mode { 763 s32 max_mode; 764 s32 mode; 765 s32 attribute; 766 s32 cursor_column; 767 s32 cursor_row; 768 bool cursor_visible; 769}; 770 771#define EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL_GUID \ 772 EFI_GUID(0x387477c2, 0x69c7, 0x11d2, \ 773 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 774 775#define EFI_BLACK 0x00 776#define EFI_BLUE 0x01 777#define EFI_GREEN 0x02 778#define EFI_CYAN 0x03 779#define EFI_RED 0x04 780#define EFI_MAGENTA 0x05 781#define EFI_BROWN 0x06 782#define EFI_LIGHTGRAY 0x07 783#define EFI_BRIGHT 0x08 784#define EFI_DARKGRAY 0x08 785#define EFI_LIGHTBLUE 0x09 786#define EFI_LIGHTGREEN 0x0a 787#define EFI_LIGHTCYAN 0x0b 788#define EFI_LIGHTRED 0x0c 789#define EFI_LIGHTMAGENTA 0x0d 790#define EFI_YELLOW 0x0e 791#define EFI_WHITE 0x0f 792#define EFI_BACKGROUND_BLACK 0x00 793#define EFI_BACKGROUND_BLUE 0x10 794#define EFI_BACKGROUND_GREEN 0x20 795#define EFI_BACKGROUND_CYAN 0x30 796#define EFI_BACKGROUND_RED 0x40 797#define EFI_BACKGROUND_MAGENTA 0x50 798#define EFI_BACKGROUND_BROWN 0x60 799#define EFI_BACKGROUND_LIGHTGRAY 0x70 800 801/* extract foreground color from EFI attribute */ 802#define EFI_ATTR_FG(attr) ((attr) & 0x07) 803/* treat high bit of FG as bright/bold (similar to edk2) */ 804#define EFI_ATTR_BOLD(attr) (((attr) >> 3) & 0x01) 805/* extract background color from EFI attribute */ 806#define EFI_ATTR_BG(attr) (((attr) >> 4) & 0x7) 807 808struct efi_simple_text_output_protocol { 809 efi_status_t (EFIAPI *reset)( 810 struct efi_simple_text_output_protocol *this, 811 char extended_verification); 812 efi_status_t (EFIAPI *output_string)( 813 struct efi_simple_text_output_protocol *this, 814 const u16 *str); 815 efi_status_t (EFIAPI *test_string)( 816 struct efi_simple_text_output_protocol *this, 817 const u16 *str); 818 efi_status_t(EFIAPI *query_mode)( 819 struct efi_simple_text_output_protocol *this, 820 unsigned long mode_number, unsigned long *columns, 821 unsigned long *rows); 822 efi_status_t(EFIAPI *set_mode)( 823 struct efi_simple_text_output_protocol *this, 824 unsigned long mode_number); 825 efi_status_t(EFIAPI *set_attribute)( 826 struct efi_simple_text_output_protocol *this, 827 unsigned long attribute); 828 efi_status_t(EFIAPI *clear_screen) ( 829 struct efi_simple_text_output_protocol *this); 830 efi_status_t(EFIAPI *set_cursor_position) ( 831 struct efi_simple_text_output_protocol *this, 832 unsigned long column, unsigned long row); 833 efi_status_t(EFIAPI *enable_cursor)( 834 struct efi_simple_text_output_protocol *this, 835 bool enable); 836 struct simple_text_output_mode *mode; 837}; 838 839#define EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID \ 840 EFI_GUID(0xdd9e7534, 0x7762, 0x4698, \ 841 0x8c, 0x14, 0xf5, 0x85, 0x17, 0xa6, 0x25, 0xaa) 842 843struct efi_input_key { 844 u16 scan_code; 845 u16 unicode_char; 846}; 847 848#define EFI_SHIFT_STATE_INVALID 0x00000000 849#define EFI_RIGHT_SHIFT_PRESSED 0x00000001 850#define EFI_LEFT_SHIFT_PRESSED 0x00000002 851#define EFI_RIGHT_CONTROL_PRESSED 0x00000004 852#define EFI_LEFT_CONTROL_PRESSED 0x00000008 853#define EFI_RIGHT_ALT_PRESSED 0x00000010 854#define EFI_LEFT_ALT_PRESSED 0x00000020 855#define EFI_RIGHT_LOGO_PRESSED 0x00000040 856#define EFI_LEFT_LOGO_PRESSED 0x00000080 857#define EFI_MENU_KEY_PRESSED 0x00000100 858#define EFI_SYS_REQ_PRESSED 0x00000200 859#define EFI_SHIFT_STATE_VALID 0x80000000 860 861#define EFI_TOGGLE_STATE_INVALID 0x00 862#define EFI_SCROLL_LOCK_ACTIVE 0x01 863#define EFI_NUM_LOCK_ACTIVE 0x02 864#define EFI_CAPS_LOCK_ACTIVE 0x04 865#define EFI_KEY_STATE_EXPOSED 0x40 866#define EFI_TOGGLE_STATE_VALID 0x80 867 868struct efi_key_state { 869 u32 key_shift_state; 870 u8 key_toggle_state; 871}; 872 873struct efi_key_data { 874 struct efi_input_key key; 875 struct efi_key_state key_state; 876}; 877 878struct efi_simple_text_input_ex_protocol { 879 efi_status_t (EFIAPI *reset) ( 880 struct efi_simple_text_input_ex_protocol *this, 881 bool extended_verification); 882 efi_status_t (EFIAPI *read_key_stroke_ex) ( 883 struct efi_simple_text_input_ex_protocol *this, 884 struct efi_key_data *key_data); 885 struct efi_event *wait_for_key_ex; 886 efi_status_t (EFIAPI *set_state) ( 887 struct efi_simple_text_input_ex_protocol *this, 888 u8 *key_toggle_state); 889 efi_status_t (EFIAPI *register_key_notify) ( 890 struct efi_simple_text_input_ex_protocol *this, 891 struct efi_key_data *key_data, 892 efi_status_t (EFIAPI *key_notify_function)( 893 struct efi_key_data *key_data), 894 void **notify_handle); 895 efi_status_t (EFIAPI *unregister_key_notify) ( 896 struct efi_simple_text_input_ex_protocol *this, 897 void *notification_handle); 898}; 899 900#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \ 901 EFI_GUID(0x387477c1, 0x69c7, 0x11d2, \ 902 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 903 904struct efi_simple_text_input_protocol { 905 efi_status_t(EFIAPI *reset)(struct efi_simple_text_input_protocol *this, 906 bool extended_verification); 907 efi_status_t(EFIAPI *read_key_stroke)( 908 struct efi_simple_text_input_protocol *this, 909 struct efi_input_key *key); 910 struct efi_event *wait_for_key; 911}; 912 913#define EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID \ 914 EFI_GUID(0x8b843e20, 0x8132, 0x4852, \ 915 0x90, 0xcc, 0x55, 0x1a, 0x4e, 0x4a, 0x7f, 0x1c) 916 917struct efi_device_path_to_text_protocol { 918 uint16_t *(EFIAPI *convert_device_node_to_text)( 919 struct efi_device_path *device_node, 920 bool display_only, 921 bool allow_shortcuts); 922 uint16_t *(EFIAPI *convert_device_path_to_text)( 923 struct efi_device_path *device_path, 924 bool display_only, 925 bool allow_shortcuts); 926}; 927 928#define EFI_DEVICE_PATH_UTILITIES_PROTOCOL_GUID \ 929 EFI_GUID(0x0379be4e, 0xd706, 0x437d, \ 930 0xb0, 0x37, 0xed, 0xb8, 0x2f, 0xb7, 0x72, 0xa4) 931 932struct efi_device_path_utilities_protocol { 933 efi_uintn_t (EFIAPI *get_device_path_size)( 934 const struct efi_device_path *device_path); 935 struct efi_device_path *(EFIAPI *duplicate_device_path)( 936 const struct efi_device_path *device_path); 937 struct efi_device_path *(EFIAPI *append_device_path)( 938 const struct efi_device_path *src1, 939 const struct efi_device_path *src2); 940 struct efi_device_path *(EFIAPI *append_device_node)( 941 const struct efi_device_path *device_path, 942 const struct efi_device_path *device_node); 943 struct efi_device_path *(EFIAPI *append_device_path_instance)( 944 const struct efi_device_path *device_path, 945 const struct efi_device_path *device_path_instance); 946 struct efi_device_path *(EFIAPI *get_next_device_path_instance)( 947 struct efi_device_path **device_path_instance, 948 efi_uintn_t *device_path_instance_size); 949 bool (EFIAPI *is_device_path_multi_instance)( 950 const struct efi_device_path *device_path); 951 struct efi_device_path *(EFIAPI *create_device_node)( 952 uint8_t node_type, 953 uint8_t node_sub_type, 954 uint16_t node_length); 955}; 956 957/* 958 * Human Interface Infrastructure (HII) 959 */ 960struct efi_hii_package_list_header { 961 efi_guid_t package_list_guid; 962 u32 package_length; 963} __packed; 964 965/** 966 * struct efi_hii_package_header - EFI HII package header 967 * 968 * @fields: 'fields' replaces the bit-fields defined in the EFI 969 * specification to to avoid possible compiler incompatibilities:: 970 * 971 * u32 length:24; 972 * u32 type:8; 973 */ 974struct efi_hii_package_header { 975 u32 fields; 976} __packed; 977 978#define __EFI_HII_PACKAGE_LEN_SHIFT 0 979#define __EFI_HII_PACKAGE_TYPE_SHIFT 24 980#define __EFI_HII_PACKAGE_LEN_MASK 0xffffff 981#define __EFI_HII_PACKAGE_TYPE_MASK 0xff 982 983#define EFI_HII_PACKAGE_TYPE_ALL 0x00 984#define EFI_HII_PACKAGE_TYPE_GUID 0x01 985#define EFI_HII_PACKAGE_FORMS 0x02 986#define EFI_HII_PACKAGE_STRINGS 0x04 987#define EFI_HII_PACKAGE_FONTS 0x05 988#define EFI_HII_PACKAGE_IMAGES 0x06 989#define EFI_HII_PACKAGE_SIMPLE_FONTS 0x07 990#define EFI_HII_PACKAGE_DEVICE_PATH 0x08 991#define EFI_HII_PACKAGE_KEYBOARD_LAYOUT 0x09 992#define EFI_HII_PACKAGE_ANIMATIONS 0x0A 993#define EFI_HII_PACKAGE_END 0xDF 994#define EFI_HII_PACKAGE_TYPE_SYSTEM_BEGIN 0xE0 995#define EFI_HII_PACKAGE_TYPE_SYSTEM_END 0xFF 996 997/* 998 * HII GUID package 999 */ 1000struct efi_hii_guid_package { 1001 struct efi_hii_package_header header; 1002 efi_guid_t guid; 1003 char data[]; 1004} __packed; 1005 1006/* 1007 * HII string package 1008 */ 1009struct efi_hii_strings_package { 1010 struct efi_hii_package_header header; 1011 u32 header_size; 1012 u32 string_info_offset; 1013 u16 language_window[16]; 1014 efi_string_id_t language_name; 1015 u8 language[]; 1016} __packed; 1017 1018struct efi_hii_string_block { 1019 u8 block_type; 1020 /* u8 block_body[]; */ 1021} __packed; 1022 1023#define EFI_HII_SIBT_END 0x00 1024#define EFI_HII_SIBT_STRING_SCSU 0x10 1025#define EFI_HII_SIBT_STRING_SCSU_FONT 0x11 1026#define EFI_HII_SIBT_STRINGS_SCSU 0x12 1027#define EFI_HII_SIBT_STRINGS_SCSU_FONT 0x13 1028#define EFI_HII_SIBT_STRING_UCS2 0x14 1029#define EFI_HII_SIBT_STRING_UCS2_FONT 0x15 1030#define EFI_HII_SIBT_STRINGS_UCS2 0x16 1031#define EFI_HII_SIBT_STRINGS_UCS2_FONT 0x17 1032#define EFI_HII_SIBT_DUPLICATE 0x20 1033#define EFI_HII_SIBT_SKIP2 0x21 1034#define EFI_HII_SIBT_SKIP1 0x22 1035#define EFI_HII_SIBT_EXT1 0x30 1036#define EFI_HII_SIBT_EXT2 0x31 1037#define EFI_HII_SIBT_EXT4 0x32 1038#define EFI_HII_SIBT_FONT 0x40 1039 1040struct efi_hii_sibt_string_ucs2_block { 1041 struct efi_hii_string_block header; 1042 u16 string_text[]; 1043} __packed; 1044 1045static inline struct efi_hii_string_block * 1046efi_hii_sibt_string_ucs2_block_next(struct efi_hii_sibt_string_ucs2_block *blk) 1047{ 1048 return ((void *)blk) + sizeof(*blk) + 1049 (u16_strlen(blk->string_text) + 1) * 2; 1050} 1051 1052/* 1053 * HII forms package 1054 * TODO: full scope of definitions 1055 */ 1056struct efi_hii_time { 1057 u8 hour; 1058 u8 minute; 1059 u8 second; 1060}; 1061 1062struct efi_hii_date { 1063 u16 year; 1064 u8 month; 1065 u8 day; 1066}; 1067 1068struct efi_hii_ref { 1069 efi_question_id_t question_id; 1070 efi_form_id_t form_id; 1071 efi_guid_t form_set_guid; 1072 efi_string_id_t device_path; 1073}; 1074 1075union efi_ifr_type_value { 1076 u8 u8; // EFI_IFR_TYPE_NUM_SIZE_8 1077 u16 u16; // EFI_IFR_TYPE_NUM_SIZE_16 1078 u32 u32; // EFI_IFR_TYPE_NUM_SIZE_32 1079 u64 u64; // EFI_IFR_TYPE_NUM_SIZE_64 1080 bool b; // EFI_IFR_TYPE_BOOLEAN 1081 struct efi_hii_time time; // EFI_IFR_TYPE_TIME 1082 struct efi_hii_date date; // EFI_IFR_TYPE_DATE 1083 efi_string_id_t string; // EFI_IFR_TYPE_STRING, EFI_IFR_TYPE_ACTION 1084 struct efi_hii_ref ref; // EFI_IFR_TYPE_REF 1085 // u8 buffer[]; // EFI_IFR_TYPE_BUFFER 1086}; 1087 1088#define EFI_IFR_TYPE_NUM_SIZE_8 0x00 1089#define EFI_IFR_TYPE_NUM_SIZE_16 0x01 1090#define EFI_IFR_TYPE_NUM_SIZE_32 0x02 1091#define EFI_IFR_TYPE_NUM_SIZE_64 0x03 1092#define EFI_IFR_TYPE_BOOLEAN 0x04 1093#define EFI_IFR_TYPE_TIME 0x05 1094#define EFI_IFR_TYPE_DATE 0x06 1095#define EFI_IFR_TYPE_STRING 0x07 1096#define EFI_IFR_TYPE_OTHER 0x08 1097#define EFI_IFR_TYPE_UNDEFINED 0x09 1098#define EFI_IFR_TYPE_ACTION 0x0A 1099#define EFI_IFR_TYPE_BUFFER 0x0B 1100#define EFI_IFR_TYPE_REF 0x0C 1101#define EFI_IFR_OPTION_DEFAULT 0x10 1102#define EFI_IFR_OPTION_DEFAULT_MFG 0x20 1103 1104#define EFI_IFR_ONE_OF_OPTION_OP 0x09 1105 1106struct efi_ifr_op_header { 1107 u8 opCode; 1108 u8 length:7; 1109 u8 scope:1; 1110}; 1111 1112struct efi_ifr_one_of_option { 1113 struct efi_ifr_op_header header; 1114 efi_string_id_t option; 1115 u8 flags; 1116 u8 type; 1117 union efi_ifr_type_value value; 1118}; 1119 1120typedef efi_uintn_t efi_browser_action_t; 1121 1122#define EFI_BROWSER_ACTION_REQUEST_NONE 0 1123#define EFI_BROWSER_ACTION_REQUEST_RESET 1 1124#define EFI_BROWSER_ACTION_REQUEST_SUBMIT 2 1125#define EFI_BROWSER_ACTION_REQUEST_EXIT 3 1126#define EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT 4 1127#define EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT 5 1128#define EFI_BROWSER_ACTION_REQUEST_FORM_APPLY 6 1129#define EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD 7 1130#define EFI_BROWSER_ACTION_REQUEST_RECONNECT 8 1131 1132typedef efi_uintn_t efi_browser_action_request_t; 1133 1134#define EFI_BROWSER_ACTION_CHANGING 0 1135#define EFI_BROWSER_ACTION_CHANGED 1 1136#define EFI_BROWSER_ACTION_RETRIEVE 2 1137#define EFI_BROWSER_ACTION_FORM_OPEN 3 1138#define EFI_BROWSER_ACTION_FORM_CLOSE 4 1139#define EFI_BROWSER_ACTION_SUBMITTED 5 1140#define EFI_BROWSER_ACTION_DEFAULT_STANDARD 0x1000 1141#define EFI_BROWSER_ACTION_DEFAULT_MANUFACTURING 0x1001 1142#define EFI_BROWSER_ACTION_DEFAULT_SAFE 0x1002 1143#define EFI_BROWSER_ACTION_DEFAULT_PLATFORM 0x2000 1144#define EFI_BROWSER_ACTION_DEFAULT_HARDWARE 0x3000 1145#define EFI_BROWSER_ACTION_DEFAULT_FIRMWARE 0x4000 1146 1147/* 1148 * HII keyboard package 1149 */ 1150typedef enum { 1151 EFI_KEY_LCTRL, EFI_KEY_A0, EFI_KEY_LALT, EFI_KEY_SPACE_BAR, 1152 EFI_KEY_A2, EFI_KEY_A3, EFI_KEY_A4, EFI_KEY_RCTRL, EFI_KEY_LEFT_ARROW, 1153 EFI_KEY_DOWN_ARROW, EFI_KEY_RIGHT_ARROW, EFI_KEY_ZERO, 1154 EFI_KEY_PERIOD, EFI_KEY_ENTER, EFI_KEY_LSHIFT, EFI_KEY_B0, 1155 EFI_KEY_B1, EFI_KEY_B2, EFI_KEY_B3, EFI_KEY_B4, EFI_KEY_B5, EFI_KEY_B6, 1156 EFI_KEY_B7, EFI_KEY_B8, EFI_KEY_B9, EFI_KEY_B10, EFI_KEY_RSHIFT, 1157 EFI_KEY_UP_ARROW, EFI_KEY_ONE, EFI_KEY_TWO, EFI_KEY_THREE, 1158 EFI_KEY_CAPS_LOCK, EFI_KEY_C1, EFI_KEY_C2, EFI_KEY_C3, EFI_KEY_C4, 1159 EFI_KEY_C5, EFI_KEY_C6, EFI_KEY_C7, EFI_KEY_C8, EFI_KEY_C9, 1160 EFI_KEY_C10, EFI_KEY_C11, EFI_KEY_C12, EFI_KEY_FOUR, EFI_KEY_FIVE, 1161 EFI_KEY_SIX, EFI_KEY_PLUS, EFI_KEY_TAB, EFI_KEY_D1, EFI_KEY_D2, 1162 EFI_KEY_D3, EFI_KEY_D4, EFI_KEY_D5, EFI_KEY_D6, EFI_KEY_D7, EFI_KEY_D8, 1163 EFI_KEY_D9, EFI_KEY_D10, EFI_KEY_D11, EFI_KEY_D12, EFI_KEY_D13, 1164 EFI_KEY_DEL, EFI_KEY_END, EFI_KEY_PG_DN, EFI_KEY_SEVEN, EFI_KEY_EIGHT, 1165 EFI_KEY_NINE, EFI_KEY_E0, EFI_KEY_E1, EFI_KEY_E2, EFI_KEY_E3, 1166 EFI_KEY_E4, EFI_KEY_E5, EFI_KEY_E6, EFI_KEY_E7, EFI_KEY_E8, EFI_KEY_E9, 1167 EFI_KEY_E10, EFI_KEY_E11, EFI_KEY_E12, EFI_KEY_BACK_SPACE, 1168 EFI_KEY_INS, EFI_KEY_HOME, EFI_KEY_PG_UP, EFI_KEY_NLCK, EFI_KEY_SLASH, 1169 EFI_KEY_ASTERISK, EFI_KEY_MINUS, EFI_KEY_ESC, EFI_KEY_F1, EFI_KEY_F2, 1170 EFI_KEY_F3, EFI_KEY_F4, EFI_KEY_F5, EFI_KEY_F6, EFI_KEY_F7, EFI_KEY_F8, 1171 EFI_KEY_F9, EFI_KEY_F10, EFI_KEY_F11, EFI_KEY_F12, EFI_KEY_PRINT, 1172 EFI_KEY_SLCK, EFI_KEY_PAUSE, 1173} efi_key; 1174 1175struct efi_key_descriptor { 1176 u32 key; 1177 u16 unicode; 1178 u16 shifted_unicode; 1179 u16 alt_gr_unicode; 1180 u16 shifted_alt_gr_unicode; 1181 u16 modifier; 1182 u16 affected_attribute; 1183} __packed; 1184 1185struct efi_hii_keyboard_layout { 1186 u16 layout_length; 1187 /* 1188 * The EFI spec defines this as efi_guid_t. 1189 * clang and gcc both report alignment problems here. 1190 * clang with -Wunaligned-access 1191 * warning: field guid within 'struct efi_hii_keyboard_layout' is less 1192 * aligned than 'efi_guid_t' and is usually due to 1193 * 'struct efi_hii_keyboard_layout' being packed, which can lead to 1194 * unaligned accesses 1195 * 1196 * GCC with -Wpacked-not-aligned -Waddress-of-packed-member 1197 * 'efi_guid_t' offset 2 in 'struct efi_hii_keyboard_layout' 1198 * isn't aligned to 4 1199 * 1200 * Removing the alignment from efi_guid_t is not an option, since 1201 * it is also used in non-packed structs and that would break 1202 * calculations with offsetof 1203 * 1204 * This is the only place we get a report for. That happens because 1205 * all other declarations of efi_guid_t within a packed struct happens 1206 * to be 4-byte aligned. i.e a u32, a u64 a 2 * u16 or any combination 1207 * that ends up landing efi_guid_t on a 4byte boundary precedes. 1208 * 1209 * Replace this with a 1-byte aligned counterpart of b[16]. This is a 1210 * packed struct so the memory placement of efi_guid_t should not change 1211 * 1212 */ 1213 u8 guid[16]; 1214 u32 layout_descriptor_string_offset; 1215 u8 descriptor_count; 1216 /* struct efi_key_descriptor descriptors[]; follows here */ 1217} __packed; 1218 1219struct efi_hii_keyboard_package { 1220 struct efi_hii_package_header header; 1221 u16 layout_count; 1222 struct efi_hii_keyboard_layout layout[]; 1223} __packed; 1224 1225/* 1226 * HII protocols 1227 */ 1228#define EFI_HII_STRING_PROTOCOL_GUID \ 1229 EFI_GUID(0x0fd96974, 0x23aa, 0x4cdc, \ 1230 0xb9, 0xcb, 0x98, 0xd1, 0x77, 0x50, 0x32, 0x2a) 1231 1232struct efi_font_info { 1233 efi_hii_font_style_t font_style; 1234 u16 font_size; 1235 u16 font_name[1]; 1236}; 1237 1238struct efi_hii_string_protocol { 1239 efi_status_t(EFIAPI *new_string)( 1240 const struct efi_hii_string_protocol *this, 1241 efi_hii_handle_t package_list, 1242 efi_string_id_t *string_id, 1243 const u8 *language, 1244 const u16 *language_name, 1245 const efi_string_t string, 1246 const struct efi_font_info *string_font_info); 1247 efi_status_t(EFIAPI *get_string)( 1248 const struct efi_hii_string_protocol *this, 1249 const u8 *language, 1250 efi_hii_handle_t package_list, 1251 efi_string_id_t string_id, 1252 efi_string_t string, 1253 efi_uintn_t *string_size, 1254 struct efi_font_info **string_font_info); 1255 efi_status_t(EFIAPI *set_string)( 1256 const struct efi_hii_string_protocol *this, 1257 efi_hii_handle_t package_list, 1258 efi_string_id_t string_id, 1259 const u8 *language, 1260 const efi_string_t string, 1261 const struct efi_font_info *string_font_info); 1262 efi_status_t(EFIAPI *get_languages)( 1263 const struct efi_hii_string_protocol *this, 1264 efi_hii_handle_t package_list, 1265 u8 *languages, 1266 efi_uintn_t *languages_size); 1267 efi_status_t(EFIAPI *get_secondary_languages)( 1268 const struct efi_hii_string_protocol *this, 1269 efi_hii_handle_t package_list, 1270 const u8 *primary_language, 1271 u8 *secondary_languages, 1272 efi_uintn_t *secondary_languages_size); 1273}; 1274 1275#define EFI_HII_DATABASE_PROTOCOL_GUID \ 1276 EFI_GUID(0xef9fc172, 0xa1b2, 0x4693, \ 1277 0xb3, 0x27, 0x6d, 0x32, 0xfc, 0x41, 0x60, 0x42) 1278 1279struct efi_hii_database_protocol { 1280 efi_status_t(EFIAPI *new_package_list)( 1281 const struct efi_hii_database_protocol *this, 1282 const struct efi_hii_package_list_header *package_list, 1283 const efi_handle_t driver_handle, 1284 efi_hii_handle_t *handle); 1285 efi_status_t(EFIAPI *remove_package_list)( 1286 const struct efi_hii_database_protocol *this, 1287 efi_hii_handle_t handle); 1288 efi_status_t(EFIAPI *update_package_list)( 1289 const struct efi_hii_database_protocol *this, 1290 efi_hii_handle_t handle, 1291 const struct efi_hii_package_list_header *package_list); 1292 efi_status_t(EFIAPI *list_package_lists)( 1293 const struct efi_hii_database_protocol *this, 1294 u8 package_type, 1295 const efi_guid_t *package_guid, 1296 efi_uintn_t *handle_buffer_length, 1297 efi_hii_handle_t *handle); 1298 efi_status_t(EFIAPI *export_package_lists)( 1299 const struct efi_hii_database_protocol *this, 1300 efi_hii_handle_t handle, 1301 efi_uintn_t *buffer_size, 1302 struct efi_hii_package_list_header *buffer); 1303 efi_status_t(EFIAPI *register_package_notify)( 1304 const struct efi_hii_database_protocol *this, 1305 u8 package_type, 1306 const efi_guid_t *package_guid, 1307 const void *package_notify_fn, 1308 efi_uintn_t notify_type, 1309 efi_handle_t *notify_handle); 1310 efi_status_t(EFIAPI *unregister_package_notify)( 1311 const struct efi_hii_database_protocol *this, 1312 efi_handle_t notification_handle 1313 ); 1314 efi_status_t(EFIAPI *find_keyboard_layouts)( 1315 const struct efi_hii_database_protocol *this, 1316 u16 *key_guid_buffer_length, 1317 efi_guid_t *key_guid_buffer); 1318 efi_status_t(EFIAPI *get_keyboard_layout)( 1319 const struct efi_hii_database_protocol *this, 1320 efi_guid_t *key_guid, 1321 u16 *keyboard_layout_length, 1322 struct efi_hii_keyboard_layout *keyboard_layout); 1323 efi_status_t(EFIAPI *set_keyboard_layout)( 1324 const struct efi_hii_database_protocol *this, 1325 efi_guid_t *key_guid); 1326 efi_status_t(EFIAPI *get_package_list_handle)( 1327 const struct efi_hii_database_protocol *this, 1328 efi_hii_handle_t package_list_handle, 1329 efi_handle_t *driver_handle); 1330}; 1331 1332#define EFI_HII_CONFIG_ROUTING_PROTOCOL_GUID \ 1333 EFI_GUID(0x587e72d7, 0xcc50, 0x4f79, \ 1334 0x82, 0x09, 0xca, 0x29, 0x1f, 0xc1, 0xa1, 0x0f) 1335 1336struct efi_hii_config_routing_protocol { 1337 efi_status_t(EFIAPI *extract_config)( 1338 const struct efi_hii_config_routing_protocol *this, 1339 const efi_string_t request, 1340 efi_string_t *progress, 1341 efi_string_t *results); 1342 efi_status_t(EFIAPI *export_config)( 1343 const struct efi_hii_config_routing_protocol *this, 1344 efi_string_t *results); 1345 efi_status_t(EFIAPI *route_config)( 1346 const struct efi_hii_config_routing_protocol *this, 1347 const efi_string_t configuration, 1348 efi_string_t *progress); 1349 efi_status_t(EFIAPI *block_to_config)( 1350 const struct efi_hii_config_routing_protocol *this, 1351 const efi_string_t config_request, 1352 const uint8_t *block, 1353 const efi_uintn_t block_size, 1354 efi_string_t *config, 1355 efi_string_t *progress); 1356 efi_status_t(EFIAPI *config_to_block)( 1357 const struct efi_hii_config_routing_protocol *this, 1358 const efi_string_t config_resp, 1359 const uint8_t *block, 1360 const efi_uintn_t *block_size, 1361 efi_string_t *progress); 1362 efi_status_t(EFIAPI *get_alt_config)( 1363 const struct efi_hii_config_routing_protocol *this, 1364 const efi_string_t config_resp, 1365 const efi_guid_t *guid, 1366 const efi_string_t name, 1367 const struct efi_device_path *device_path, 1368 const efi_string_t alt_cfg_id, 1369 efi_string_t *alt_cfg_resp); 1370}; 1371 1372#define EFI_HII_CONFIG_ACCESS_PROTOCOL_GUID \ 1373 EFI_GUID(0x330d4706, 0xf2a0, 0x4e4f, \ 1374 0xa3, 0x69, 0xb6, 0x6f, 0xa8, 0xd5, 0x43, 0x85) 1375 1376struct efi_hii_config_access_protocol { 1377 efi_status_t(EFIAPI *extract_config_access)( 1378 const struct efi_hii_config_access_protocol *this, 1379 const efi_string_t request, 1380 efi_string_t *progress, 1381 efi_string_t *results); 1382 efi_status_t(EFIAPI *route_config_access)( 1383 const struct efi_hii_config_access_protocol *this, 1384 const efi_string_t configuration, 1385 efi_string_t *progress); 1386 efi_status_t(EFIAPI *form_callback)( 1387 const struct efi_hii_config_access_protocol *this, 1388 efi_browser_action_t action, 1389 efi_question_id_t question_id, 1390 u8 type, 1391 union efi_ifr_type_value *value, 1392 efi_browser_action_request_t *action_request); 1393}; 1394 1395#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \ 1396 EFI_GUID(0x9042a9de, 0x23dc, 0x4a38, \ 1397 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a) 1398 1399#define EFI_GOT_RGBA8 0 1400#define EFI_GOT_BGRA8 1 1401#define EFI_GOT_BITMASK 2 1402 1403struct efi_gop_mode_info { 1404 u32 version; 1405 u32 width; 1406 u32 height; 1407 u32 pixel_format; 1408 u32 pixel_bitmask[4]; 1409 u32 pixels_per_scanline; 1410}; 1411 1412struct efi_gop_mode { 1413 u32 max_mode; 1414 u32 mode; 1415 struct efi_gop_mode_info *info; 1416 unsigned long info_size; 1417 efi_physical_addr_t fb_base; 1418 unsigned long fb_size; 1419}; 1420 1421struct efi_gop_pixel { 1422 u8 blue; 1423 u8 green; 1424 u8 red; 1425 u8 reserved; 1426}; 1427 1428#define EFI_BLT_VIDEO_FILL 0 1429#define EFI_BLT_VIDEO_TO_BLT_BUFFER 1 1430#define EFI_BLT_BUFFER_TO_VIDEO 2 1431#define EFI_BLT_VIDEO_TO_VIDEO 3 1432 1433struct efi_gop { 1434 efi_status_t (EFIAPI *query_mode)(struct efi_gop *this, u32 mode_number, 1435 efi_uintn_t *size_of_info, 1436 struct efi_gop_mode_info **info); 1437 efi_status_t (EFIAPI *set_mode)(struct efi_gop *this, u32 mode_number); 1438 efi_status_t (EFIAPI *blt)(struct efi_gop *this, 1439 struct efi_gop_pixel *buffer, 1440 u32 operation, efi_uintn_t sx, 1441 efi_uintn_t sy, efi_uintn_t dx, 1442 efi_uintn_t dy, efi_uintn_t width, 1443 efi_uintn_t height, efi_uintn_t delta); 1444 struct efi_gop_mode *mode; 1445}; 1446 1447#define EFI_SIMPLE_NETWORK_PROTOCOL_GUID \ 1448 EFI_GUID(0xa19832b9, 0xac25, 0x11d3, \ 1449 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 1450 1451struct efi_mac_address { 1452 char mac_addr[32]; 1453}; 1454 1455struct efi_ip_address { 1456 u8 ip_addr[16]; 1457} __attribute__((aligned(4))); 1458 1459enum efi_simple_network_state { 1460 EFI_NETWORK_STOPPED, 1461 EFI_NETWORK_STARTED, 1462 EFI_NETWORK_INITIALIZED, 1463}; 1464 1465struct efi_simple_network_mode { 1466 enum efi_simple_network_state state; 1467 u32 hwaddr_size; 1468 u32 media_header_size; 1469 u32 max_packet_size; 1470 u32 nvram_size; 1471 u32 nvram_access_size; 1472 u32 receive_filter_mask; 1473 u32 receive_filter_setting; 1474 u32 max_mcast_filter_count; 1475 u32 mcast_filter_count; 1476 struct efi_mac_address mcast_filter[16]; 1477 struct efi_mac_address current_address; 1478 struct efi_mac_address broadcast_address; 1479 struct efi_mac_address permanent_address; 1480 u8 if_type; 1481 u8 mac_changeable; 1482 u8 multitx_supported; 1483 u8 media_present_supported; 1484 u8 media_present; 1485}; 1486 1487/* receive_filters bit mask */ 1488#define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST 0x01 1489#define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST 0x02 1490#define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST 0x04 1491#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS 0x08 1492#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10 1493 1494/* interrupt status bit mask */ 1495#define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT 0x01 1496#define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT 0x02 1497#define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT 0x04 1498#define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT 0x08 1499 1500/* revision of the simple network protocol */ 1501#define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION 0x00010000 1502 1503struct efi_simple_network { 1504 u64 revision; 1505 efi_status_t (EFIAPI *start)(struct efi_simple_network *this); 1506 efi_status_t (EFIAPI *stop)(struct efi_simple_network *this); 1507 efi_status_t (EFIAPI *initialize)(struct efi_simple_network *this, 1508 ulong extra_rx, ulong extra_tx); 1509 efi_status_t (EFIAPI *reset)(struct efi_simple_network *this, 1510 int extended_verification); 1511 efi_status_t (EFIAPI *shutdown)(struct efi_simple_network *this); 1512 efi_status_t (EFIAPI *receive_filters)(struct efi_simple_network *this, 1513 u32 enable, u32 disable, int reset_mcast_filter, 1514 ulong mcast_filter_count, 1515 struct efi_mac_address *mcast_filter); 1516 efi_status_t (EFIAPI *station_address)(struct efi_simple_network *this, 1517 int reset, struct efi_mac_address *new_mac); 1518 efi_status_t (EFIAPI *statistics)(struct efi_simple_network *this, 1519 int reset, ulong *stat_size, void *stat_table); 1520 efi_status_t (EFIAPI *mcastiptomac)(struct efi_simple_network *this, 1521 int ipv6, struct efi_ip_address *ip, 1522 struct efi_mac_address *mac); 1523 efi_status_t (EFIAPI *nvdata)(struct efi_simple_network *this, 1524 int read_write, ulong offset, ulong buffer_size, 1525 char *buffer); 1526 efi_status_t (EFIAPI *get_status)(struct efi_simple_network *this, 1527 u32 *int_status, void **txbuf); 1528 efi_status_t (EFIAPI *transmit)(struct efi_simple_network *this, 1529 size_t header_size, size_t buffer_size, void *buffer, 1530 struct efi_mac_address *src_addr, 1531 struct efi_mac_address *dest_addr, u16 *protocol); 1532 efi_status_t (EFIAPI *receive)(struct efi_simple_network *this, 1533 size_t *header_size, size_t *buffer_size, void *buffer, 1534 struct efi_mac_address *src_addr, 1535 struct efi_mac_address *dest_addr, u16 *protocol); 1536 struct efi_event *wait_for_packet; 1537 struct efi_simple_network_mode *mode; 1538 /* private fields */ 1539 u32 int_status; 1540}; 1541 1542#define EFI_PXE_BASE_CODE_PROTOCOL_GUID \ 1543 EFI_GUID(0x03c4e603, 0xac28, 0x11d3, \ 1544 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 1545 1546#define EFI_PXE_BASE_CODE_PROTOCOL_REVISION 0x00010000 1547#define EFI_PXE_BASE_CODE_MAX_IPCNT 8 1548 1549struct efi_pxe_packet { 1550 u8 packet[1472]; 1551}; 1552 1553struct efi_pxe_mode { 1554 u8 started; 1555 u8 ipv6_available; 1556 u8 ipv6_supported; 1557 u8 using_ipv6; 1558 u8 bis_supported; 1559 u8 bis_detected; 1560 u8 auto_arp; 1561 u8 send_guid; 1562 u8 dhcp_discover_valid; 1563 u8 dhcp_ack_received; 1564 u8 proxy_offer_received; 1565 u8 pxe_discover_valid; 1566 u8 pxe_reply_received; 1567 u8 pxe_bis_reply_received; 1568 u8 icmp_error_received; 1569 u8 tftp_error_received; 1570 u8 make_callbacks; 1571 u8 ttl; 1572 u8 tos; 1573 u8 pad; 1574 struct efi_ip_address station_ip; 1575 struct efi_ip_address subnet_mask; 1576 struct efi_pxe_packet dhcp_discover; 1577 struct efi_pxe_packet dhcp_ack; 1578 struct efi_pxe_packet proxy_offer; 1579 struct efi_pxe_packet pxe_discover; 1580 struct efi_pxe_packet pxe_reply; 1581}; 1582 1583struct efi_pxe_base_code_srvlist { 1584 u16 type; 1585 u8 accept_any_response; 1586 u8 reserved; 1587 struct efi_ip_address ip_addr; 1588}; 1589 1590struct efi_pxe_base_code_discover_info { 1591 u8 use_m_cast; 1592 u8 use_b_cast; 1593 u8 use_u_cast; 1594 u8 must_use_list; 1595 struct efi_ip_address server_m_cast_ip; 1596 u16 ip_cnt; 1597 struct efi_pxe_base_code_srvlist srv_list[]; 1598}; 1599 1600struct efi_pxe_base_code_mtftp_info { 1601 struct efi_ip_address m_cast_ip; 1602 u16 cport; 1603 u16 sport; 1604 u16 listen_timeout; 1605 u16 transit_timeout; 1606}; 1607 1608struct efi_pxe_base_code_filter { 1609 u8 filters; 1610 u8 ip_cnt; 1611 u16 reserved; 1612 struct efi_ip_address ip_list[EFI_PXE_BASE_CODE_MAX_IPCNT]; 1613}; 1614 1615struct efi_pxe_base_code_dhcpv4_packet { 1616 u8 bootp_op_code; 1617 u8 bootp_hw_type; 1618 u8 bootp_addr_len; 1619 u8 bootp_gate_hops; 1620 u32 bootp_ident; 1621 u16 bootp_seconds; 1622 u16 bootp_flags; 1623 u8 bootp_ci_addr[4]; 1624 u8 bootp_yi_addr[4]; 1625 u8 bootp_si_addr[4]; 1626 u8 bootp_gi_addr[4]; 1627 u8 bootp_hw_addr[16]; 1628 u8 bootp_srv_name[64]; 1629 u8 bootp_boot_file[128]; 1630 u32 dhcp_magick; 1631 u8 dhcp_options[56]; 1632}; 1633 1634struct efi_pxe_base_code_dhcpv6_packet { 1635 u8 message_type; 1636 u8 transaction_id[3]; 1637 u8 dhcp_options[1024]; 1638}; 1639 1640typedef union { 1641 u8 raw[1472]; 1642 struct efi_pxe_base_code_dhcpv4_packet dhcpv4; 1643 struct efi_pxe_base_code_dhcpv6_packet dhcpv6; 1644} EFI_PXE_BASE_CODE_PACKET; 1645 1646struct efi_pxe_base_code_protocol { 1647 u64 revision; 1648 efi_status_t (EFIAPI *start)(struct efi_pxe_base_code_protocol *this, 1649 u8 use_ipv6); 1650 efi_status_t (EFIAPI *stop)(struct efi_pxe_base_code_protocol *this); 1651 efi_status_t (EFIAPI *dhcp)(struct efi_pxe_base_code_protocol *this, 1652 u8 sort_offers); 1653 efi_status_t (EFIAPI *discover)( 1654 struct efi_pxe_base_code_protocol *this, 1655 u16 type, u16 *layer, u8 bis, 1656 struct efi_pxe_base_code_discover_info *info); 1657 efi_status_t (EFIAPI *mtftp)( 1658 struct efi_pxe_base_code_protocol *this, 1659 u32 operation, void *buffer_ptr, 1660 u8 overwrite, efi_uintn_t *buffer_size, 1661 struct efi_ip_address server_ip, char *filename, 1662 struct efi_pxe_base_code_mtftp_info *info, 1663 u8 dont_use_buffer); 1664 efi_status_t (EFIAPI *udp_write)( 1665 struct efi_pxe_base_code_protocol *this, 1666 u16 op_flags, struct efi_ip_address *dest_ip, 1667 u16 *dest_port, 1668 struct efi_ip_address *gateway_ip, 1669 struct efi_ip_address *src_ip, u16 *src_port, 1670 efi_uintn_t *header_size, void *header_ptr, 1671 efi_uintn_t *buffer_size, void *buffer_ptr); 1672 efi_status_t (EFIAPI *udp_read)( 1673 struct efi_pxe_base_code_protocol *this, 1674 u16 op_flags, struct efi_ip_address *dest_ip, 1675 u16 *dest_port, struct efi_ip_address *src_ip, 1676 u16 *src_port, efi_uintn_t *header_size, 1677 void *header_ptr, efi_uintn_t *buffer_size, 1678 void *buffer_ptr); 1679 efi_status_t (EFIAPI *set_ip_filter)( 1680 struct efi_pxe_base_code_protocol *this, 1681 struct efi_pxe_base_code_filter *new_filter); 1682 efi_status_t (EFIAPI *arp)(struct efi_pxe_base_code_protocol *this, 1683 struct efi_ip_address *ip_addr, 1684 struct efi_mac_address *mac_addr); 1685 efi_status_t (EFIAPI *set_parameters)( 1686 struct efi_pxe_base_code_protocol *this, 1687 u8 *new_auto_arp, u8 *new_send_guid, 1688 u8 *new_ttl, u8 *new_tos, 1689 u8 *new_make_callback); 1690 efi_status_t (EFIAPI *set_station_ip)( 1691 struct efi_pxe_base_code_protocol *this, 1692 struct efi_ip_address *new_station_ip, 1693 struct efi_ip_address *new_subnet_mask); 1694 efi_status_t (EFIAPI *set_packets)( 1695 struct efi_pxe_base_code_protocol *this, 1696 u8 *new_dhcp_discover_valid, 1697 u8 *new_dhcp_ack_received, 1698 u8 *new_proxy_offer_received, 1699 u8 *new_pxe_discover_valid, 1700 u8 *new_pxe_reply_received, 1701 u8 *new_pxe_bis_reply_received, 1702 EFI_PXE_BASE_CODE_PACKET *new_dchp_discover, 1703 EFI_PXE_BASE_CODE_PACKET *new_dhcp_acc, 1704 EFI_PXE_BASE_CODE_PACKET *new_proxy_offer, 1705 EFI_PXE_BASE_CODE_PACKET *new_pxe_discover, 1706 EFI_PXE_BASE_CODE_PACKET *new_pxe_reply, 1707 EFI_PXE_BASE_CODE_PACKET *new_pxe_bis_reply); 1708 struct efi_pxe_mode *mode; 1709}; 1710 1711#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \ 1712 EFI_GUID(0x964e5b22, 0x6459, 0x11d2, \ 1713 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 1714#define EFI_FILE_PROTOCOL_REVISION 0x00010000 1715#define EFI_FILE_PROTOCOL_REVISION2 0x00020000 1716#define EFI_FILE_PROTOCOL_LATEST_REVISION EFI_FILE_PROTOCOL_REVISION2 1717 1718struct efi_file_io_token { 1719 struct efi_event *event; 1720 efi_status_t status; 1721 efi_uintn_t buffer_size; 1722 void *buffer;}; 1723 1724struct efi_file_handle { 1725 u64 rev; 1726 efi_status_t (EFIAPI *open)(struct efi_file_handle *this, 1727 struct efi_file_handle **new_handle, 1728 u16 *file_name, u64 open_mode, u64 attributes); 1729 efi_status_t (EFIAPI *close)(struct efi_file_handle *this); 1730 efi_status_t (EFIAPI *delete)(struct efi_file_handle *this); 1731 efi_status_t (EFIAPI *read)(struct efi_file_handle *this, 1732 efi_uintn_t *buffer_size, void *buffer); 1733 efi_status_t (EFIAPI *write)(struct efi_file_handle *this, 1734 efi_uintn_t *buffer_size, void *buffer); 1735 efi_status_t (EFIAPI *getpos)(struct efi_file_handle *this, 1736 u64 *pos); 1737 efi_status_t (EFIAPI *setpos)(struct efi_file_handle *this, 1738 u64 pos); 1739 efi_status_t (EFIAPI *getinfo)(struct efi_file_handle *this, 1740 const efi_guid_t *info_type, efi_uintn_t *buffer_size, 1741 void *buffer); 1742 efi_status_t (EFIAPI *setinfo)(struct efi_file_handle *this, 1743 const efi_guid_t *info_type, efi_uintn_t buffer_size, 1744 void *buffer); 1745 efi_status_t (EFIAPI *flush)(struct efi_file_handle *this); 1746 efi_status_t (EFIAPI *open_ex)(struct efi_file_handle *this, 1747 struct efi_file_handle **new_handle, 1748 u16 *file_name, u64 open_mode, u64 attributes, 1749 struct efi_file_io_token *token); 1750 efi_status_t (EFIAPI *read_ex)(struct efi_file_handle *this, 1751 struct efi_file_io_token *token); 1752 efi_status_t (EFIAPI *write_ex)(struct efi_file_handle *this, 1753 struct efi_file_io_token *token); 1754 efi_status_t (EFIAPI *flush_ex)(struct efi_file_handle *this, 1755 struct efi_file_io_token *token); 1756}; 1757 1758#define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION 0x00010000 1759 1760struct efi_simple_file_system_protocol { 1761 u64 rev; 1762 efi_status_t (EFIAPI *open_volume)(struct efi_simple_file_system_protocol *this, 1763 struct efi_file_handle **root); 1764}; 1765 1766#define EFI_FILE_INFO_GUID \ 1767 EFI_GUID(0x9576e92, 0x6d3f, 0x11d2, \ 1768 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 1769 1770#define EFI_FILE_SYSTEM_INFO_GUID \ 1771 EFI_GUID(0x09576e93, 0x6d3f, 0x11d2, \ 1772 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 1773 1774#define EFI_FILE_SYSTEM_VOLUME_LABEL_ID \ 1775 EFI_GUID(0xdb47d7d3, 0xfe81, 0x11d3, \ 1776 0x9a, 0x35, 0x00, 0x90, 0x27, 0x3f, 0xC1, 0x4d) 1777 1778#define EFI_FILE_MODE_READ 0x0000000000000001 1779#define EFI_FILE_MODE_WRITE 0x0000000000000002 1780#define EFI_FILE_MODE_CREATE 0x8000000000000000 1781 1782#define EFI_FILE_READ_ONLY 0x0000000000000001 1783#define EFI_FILE_HIDDEN 0x0000000000000002 1784#define EFI_FILE_SYSTEM 0x0000000000000004 1785#define EFI_FILE_RESERVED 0x0000000000000008 1786#define EFI_FILE_DIRECTORY 0x0000000000000010 1787#define EFI_FILE_ARCHIVE 0x0000000000000020 1788#define EFI_FILE_VALID_ATTR 0x0000000000000037 1789 1790struct efi_file_info { 1791 u64 size; 1792 u64 file_size; 1793 u64 physical_size; 1794 struct efi_time create_time; 1795 struct efi_time last_access_time; 1796 struct efi_time modification_time; 1797 u64 attribute; 1798 u16 file_name[0]; 1799}; 1800 1801struct efi_file_system_info { 1802 u64 size; 1803 u8 read_only; 1804 u64 volume_size; 1805 u64 free_space; 1806 u32 block_size; 1807 u16 volume_label[0]; 1808}; 1809 1810#define EFI_DRIVER_BINDING_PROTOCOL_GUID \ 1811 EFI_GUID(0x18a031ab, 0xb443, 0x4d1a,\ 1812 0xa5, 0xc0, 0x0c, 0x09, 0x26, 0x1e, 0x9f, 0x71) 1813struct efi_driver_binding_protocol { 1814 efi_status_t (EFIAPI * supported)( 1815 struct efi_driver_binding_protocol *this, 1816 efi_handle_t controller_handle, 1817 struct efi_device_path *remaining_device_path); 1818 efi_status_t (EFIAPI * start)( 1819 struct efi_driver_binding_protocol *this, 1820 efi_handle_t controller_handle, 1821 struct efi_device_path *remaining_device_path); 1822 efi_status_t (EFIAPI * stop)( 1823 struct efi_driver_binding_protocol *this, 1824 efi_handle_t controller_handle, 1825 efi_uintn_t number_of_children, 1826 efi_handle_t *child_handle_buffer); 1827 u32 version; 1828 efi_handle_t image_handle; 1829 efi_handle_t driver_binding_handle; 1830}; 1831 1832/* Current version of the Unicode collation protocol */ 1833#define EFI_UNICODE_COLLATION_PROTOCOL2_GUID \ 1834 EFI_GUID(0xa4c751fc, 0x23ae, 0x4c3e, \ 1835 0x92, 0xe9, 0x49, 0x64, 0xcf, 0x63, 0xf3, 0x49) 1836struct efi_unicode_collation_protocol { 1837 efi_intn_t (EFIAPI *stri_coll)( 1838 struct efi_unicode_collation_protocol *this, u16 *s1, u16 *s2); 1839 bool (EFIAPI *metai_match)(struct efi_unicode_collation_protocol *this, 1840 const u16 *string, const u16 *patter); 1841 void (EFIAPI *str_lwr)(struct efi_unicode_collation_protocol 1842 *this, u16 *string); 1843 void (EFIAPI *str_upr)(struct efi_unicode_collation_protocol *this, 1844 u16 *string); 1845 void (EFIAPI *fat_to_str)(struct efi_unicode_collation_protocol *this, 1846 efi_uintn_t fat_size, char *fat, u16 *string); 1847 bool (EFIAPI *str_to_fat)(struct efi_unicode_collation_protocol *this, 1848 const u16 *string, efi_uintn_t fat_size, 1849 char *fat); 1850 char *supported_languages; 1851}; 1852 1853struct efi_load_file_protocol { 1854 efi_status_t (EFIAPI *load_file)(struct efi_load_file_protocol *this, 1855 struct efi_device_path *file_path, 1856 bool boot_policy, 1857 efi_uintn_t *buffer_size, 1858 void *buffer); 1859}; 1860 1861struct efi_system_resource_entry { 1862 efi_guid_t fw_class; 1863 u32 fw_type; 1864 u32 fw_version; 1865 u32 lowest_supported_fw_version; 1866 u32 capsule_flags; 1867 u32 last_attempt_version; 1868 u32 last_attempt_status; 1869} __packed; 1870 1871struct efi_system_resource_table { 1872 u32 fw_resource_count; 1873 u32 fw_resource_count_max; 1874 u64 fw_resource_version; 1875 struct efi_system_resource_entry entries[]; 1876} __packed; 1877 1878/* Boot manager load options */ 1879#define LOAD_OPTION_ACTIVE 0x00000001 1880#define LOAD_OPTION_FORCE_RECONNECT 0x00000002 1881#define LOAD_OPTION_HIDDEN 0x00000008 1882/* All values 0x00000200-0x00001F00 are reserved */ 1883#define LOAD_OPTION_CATEGORY 0x00001F00 1884#define LOAD_OPTION_CATEGORY_BOOT 0x00000000 1885#define LOAD_OPTION_CATEGORY_APP 0x00000100 1886 1887/* 1888 * System Resource Table 1889 */ 1890/* Firmware Type Definitions */ 1891#define ESRT_FW_TYPE_UNKNOWN 0x00000000 1892#define ESRT_FW_TYPE_SYSTEMFIRMWARE 0x00000001 1893#define ESRT_FW_TYPE_DEVICEFIRMWARE 0x00000002 1894#define ESRT_FW_TYPE_UEFIDRIVER 0x00000003 1895 1896#define EFI_SYSTEM_RESOURCE_TABLE_GUID\ 1897 EFI_GUID(0xb122a263, 0x3661, 0x4f68,\ 1898 0x99, 0x29, 0x78, 0xf8, 0xb0, 0xd6, 0x21, 0x80) 1899 1900/* Last Attempt Status Values */ 1901#define LAST_ATTEMPT_STATUS_SUCCESS 0x00000000 1902#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL 0x00000001 1903#define LAST_ATTEMPT_STATUS_ERROR_INSUFFICIENT_RESOURCES 0x00000002 1904#define LAST_ATTEMPT_STATUS_ERROR_INCORRECT_VERSION 0x00000003 1905#define LAST_ATTEMPT_STATUS_ERROR_INVALID_FORMAT 0x00000004 1906#define LAST_ATTEMPT_STATUS_ERROR_AUTH_ERROR 0x00000005 1907#define LAST_ATTEMPT_STATUS_ERROR_PWR_EVT_AC 0x00000006 1908#define LAST_ATTEMPT_STATUS_ERROR_PWR_EVT_BATT 0x00000007 1909#define LAST_ATTEMPT_STATUS_ERROR_UNSATISFIED_DEPENDENCIES 0x00000008 1910 1911/* 1912 * The LastAttemptStatus values of 0x1000 - 0x4000 are reserved for vendor 1913 * usage. 1914 */ 1915#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN 0x00001000 1916#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MAX 0x00004000 1917 1918/* Certificate types in signature database */ 1919#define EFI_CERT_SHA1_GUID \ 1920 EFI_GUID(0x826ca512, 0xcf10, 0x4ac9, 0xb1, 0x87, \ 1921 0xbe, 0x01, 0x49, 0x66, 0x31, 0xbd) 1922#define EFI_CERT_SHA224_GUID \ 1923 EFI_GUID(0xb6e5233, 0xa65c, 0x44c9, 0x94, 0x07, \ 1924 0xd9, 0xab, 0x83, 0xbf, 0xc8, 0xbd) 1925#define EFI_CERT_SHA256_GUID \ 1926 EFI_GUID(0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, \ 1927 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28) 1928#define EFI_CERT_SHA384_GUID \ 1929 EFI_GUID(0xff3e5307, 0x9fd0, 0x48c9, 0x85, 0xf1, \ 1930 0x8a, 0xd5, 0x6c, 0x70, 0x1e, 0x01) 1931#define EFI_CERT_SHA512_GUID \ 1932 EFI_GUID(0x93e0fae, 0xa6c4, 0x4f50, 0x9f, 0x1b, \ 1933 0xd4, 0x1e, 0x2b, 0x89, 0xc1, 0x9a) 1934#define EFI_CERT_RSA2048_GUID \ 1935 EFI_GUID(0x3c5766e8, 0x269c, 0x4e34, 0xaa, 0x14, \ 1936 0xed, 0x77, 0x6e, 0x85, 0xb3, 0xb6) 1937#define EFI_CERT_X509_GUID \ 1938 EFI_GUID(0xa5c059a1, 0x94e4, 0x4aa7, 0x87, 0xb5, \ 1939 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72) 1940#define EFI_CERT_X509_SHA256_GUID \ 1941 EFI_GUID(0x3bd2a492, 0x96c0, 0x4079, 0xb4, 0x20, \ 1942 0xfc, 0xf9, 0x8e, 0xf1, 0x03, 0xed) 1943#define EFI_CERT_X509_SHA384_GUID \ 1944 EFI_GUID(0x7076876e, 0x80c2, 0x4ee6, \ 1945 0xaa, 0xd2, 0x28, 0xb3, 0x49, 0xa6, 0x86, 0x5b) 1946#define EFI_CERT_X509_SHA512_GUID \ 1947 EFI_GUID(0x446dbf63, 0x2502, 0x4cda, \ 1948 0xbc, 0xfa, 0x24, 0x65, 0xd2, 0xb0, 0xfe, 0x9d) 1949#define EFI_CERT_TYPE_PKCS7_GUID \ 1950 EFI_GUID(0x4aafd29d, 0x68df, 0x49ee, 0x8a, 0xa9, \ 1951 0x34, 0x7d, 0x37, 0x56, 0x65, 0xa7) 1952 1953#define EFI_LZMA_COMPRESSED \ 1954 EFI_GUID(0xee4e5898, 0x3914, 0x4259, 0x9d, 0x6e, \ 1955 0xdc, 0x7b, 0xd7, 0x94, 0x03, 0xcf) 1956#define EFI_DXE_SERVICES \ 1957 EFI_GUID(0x05ad34ba, 0x6f02, 0x4214, 0x95, 0x2e, \ 1958 0x4d, 0xa0, 0x39, 0x8e, 0x2b, 0xb9) 1959#define EFI_HOB_LIST \ 1960 EFI_GUID(0x7739f24c, 0x93d7, 0x11d4, 0x9a, 0x3a, \ 1961 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 1962#define EFI_MEMORY_TYPE \ 1963 EFI_GUID(0x4c19049f, 0x4137, 0x4dd3, 0x9c, 0x10, \ 1964 0x8b, 0x97, 0xa8, 0x3f, 0xfd, 0xfa) 1965#define EFI_MEM_STATUS_CODE_REC \ 1966 EFI_GUID(0x060cc026, 0x4c0d, 0x4dda, 0x8f, 0x41, \ 1967 0x59, 0x5f, 0xef, 0x00, 0xa5, 0x02) 1968#define EFI_GUID_EFI_ACPI1 \ 1969 EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, \ 1970 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d) 1971 1972/** 1973 * struct win_certificate_uefi_guid - A certificate that encapsulates 1974 * a GUID-specific signature 1975 * 1976 * @hdr: Windows certificate header 1977 * @cert_type: Certificate type 1978 * @cert_data: Certificate data 1979 */ 1980struct win_certificate_uefi_guid { 1981 WIN_CERTIFICATE hdr; 1982 efi_guid_t cert_type; 1983 u8 cert_data[]; 1984} __attribute__((__packed__)); 1985 1986/** 1987 * struct efi_variable_authentication_2 - A time-based authentication method 1988 * descriptor 1989 * 1990 * This structure describes an authentication information for 1991 * a variable with EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 1992 * and should be included as part of a variable's value. 1993 * Only EFI_CERT_TYPE_PKCS7_GUID is accepted. 1994 * 1995 * @time_stamp: Descriptor's time stamp 1996 * @auth_info: Authentication info 1997 */ 1998struct efi_variable_authentication_2 { 1999 struct efi_time time_stamp; 2000 struct win_certificate_uefi_guid auth_info; 2001} __attribute__((__packed__)); 2002 2003/** 2004 * struct efi_firmware_image_authentication - Capsule authentication method 2005 * descriptor 2006 * 2007 * This structure describes an authentication information for 2008 * a capsule with IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED set 2009 * and should be included as part of the capsule. 2010 * Only EFI_CERT_TYPE_PKCS7_GUID is accepted. 2011 * 2012 * @monotonic_count: Count to prevent replay 2013 * @auth_info: Authentication info 2014 */ 2015struct efi_firmware_image_authentication { 2016 uint64_t monotonic_count; 2017 struct win_certificate_uefi_guid auth_info; 2018} __attribute__((__packed__)); 2019 2020 2021/** 2022 * struct efi_signature_data - A format of signature 2023 * 2024 * This structure describes a single signature in signature database. 2025 * 2026 * @signature_owner: Signature owner 2027 * @signature_data: Signature data 2028 */ 2029struct efi_signature_data { 2030 efi_guid_t signature_owner; 2031 u8 signature_data[]; 2032} __attribute__((__packed__)); 2033 2034/** 2035 * struct efi_signature_list - A format of signature database 2036 * 2037 * This structure describes a list of signatures with the same type. 2038 * An authenticated variable's value is a concatenation of one or more 2039 * efi_signature_list's. 2040 * 2041 * @signature_type: Signature type 2042 * @signature_list_size: Size of signature list 2043 * @signature_header_size: Size of signature header 2044 * @signature_size: Size of signature 2045 */ 2046struct efi_signature_list { 2047 efi_guid_t signature_type; 2048 u32 signature_list_size; 2049 u32 signature_header_size; 2050 u32 signature_size; 2051/* u8 signature_header[signature_header_size]; */ 2052/* struct efi_signature_data signatures[...][signature_size]; */ 2053} __attribute__((__packed__)); 2054 2055/* 2056 * Firmware management protocol 2057 */ 2058#define EFI_FIRMWARE_MANAGEMENT_PROTOCOL_GUID \ 2059 EFI_GUID(0x86c77a67, 0x0b97, 0x4633, 0xa1, 0x87, \ 2060 0x49, 0x10, 0x4d, 0x06, 0x85, 0xc7) 2061 2062#define IMAGE_ATTRIBUTE_IMAGE_UPDATABLE 0x0000000000000001 2063#define IMAGE_ATTRIBUTE_RESET_REQUIRED 0x0000000000000002 2064#define IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED 0x0000000000000004 2065#define IMAGE_ATTRIBUTE_IN_USE 0x0000000000000008 2066#define IMAGE_ATTRIBUTE_UEFI_IMAGE 0x0000000000000010 2067#define IMAGE_ATTRIBUTE_DEPENDENCY 0x0000000000000020 2068 2069#define IMAGE_COMPATIBILITY_CHECK_SUPPORTED 0x0000000000000001 2070 2071#define IMAGE_UPDATABLE_VALID 0x0000000000000001 2072#define IMAGE_UPDATABLE_INVALID 0x0000000000000002 2073#define IMAGE_UPDATABLE_INVALID_TYPE 0x0000000000000004 2074#define IMAGE_UPDATABLE_INVALID_OLLD 0x0000000000000008 2075#define IMAGE_UPDATABLE_VALID_WITH_VENDOR_CODE 0x0000000000000010 2076 2077#define PACKAGE_ATTRIBUTE_VERSION_UPDATABLE 0x0000000000000001 2078#define PACKAGE_ATTRIBUTE_RESET_REQUIRED 0x0000000000000002 2079#define PACKAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED 0x0000000000000004 2080 2081#define EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION 4 2082 2083typedef struct efi_firmware_image_dependencies { 2084 u8 dependencies[0]; 2085} efi_firmware_image_dep_t; 2086 2087struct efi_firmware_image_descriptor { 2088 u8 image_index; 2089 efi_guid_t image_type_id; 2090 u64 image_id; 2091 u16 *image_id_name; 2092 u32 version; 2093 u16 *version_name; 2094 efi_uintn_t size; 2095 u64 attributes_supported; 2096 u64 attributes_setting; 2097 u64 compatibilities; 2098 u32 lowest_supported_image_version; 2099 u32 last_attempt_version; 2100 u32 last_attempt_status; 2101 u64 hardware_instance; 2102 efi_firmware_image_dep_t *dependencies; 2103}; 2104 2105struct efi_firmware_management_protocol { 2106 efi_status_t (EFIAPI *get_image_info)( 2107 struct efi_firmware_management_protocol *this, 2108 efi_uintn_t *image_info_size, 2109 struct efi_firmware_image_descriptor *image_info, 2110 u32 *descriptor_version, 2111 u8 *descriptor_count, 2112 efi_uintn_t *descriptor_size, 2113 u32 *package_version, 2114 u16 **package_version_name); 2115 efi_status_t (EFIAPI *get_image)( 2116 struct efi_firmware_management_protocol *this, 2117 u8 image_index, 2118 void *image, 2119 efi_uintn_t *image_size); 2120 efi_status_t (EFIAPI *set_image)( 2121 struct efi_firmware_management_protocol *this, 2122 u8 image_index, 2123 const void *image, 2124 efi_uintn_t image_size, 2125 const void *vendor_code, 2126 efi_status_t (*progress)(efi_uintn_t completion), 2127 u16 **abort_reason); 2128 efi_status_t (EFIAPI *check_image)( 2129 struct efi_firmware_management_protocol *this, 2130 u8 image_index, 2131 const void *image, 2132 efi_uintn_t *image_size, 2133 u32 *image_updatable); 2134 efi_status_t (EFIAPI *get_package_info)( 2135 struct efi_firmware_management_protocol *this, 2136 u32 *package_version, 2137 u16 **package_version_name, 2138 u32 *package_version_name_maxlen, 2139 u64 *attributes_supported, 2140 u64 *attributes_setting); 2141 efi_status_t (EFIAPI *set_package_info)( 2142 struct efi_firmware_management_protocol *this, 2143 const void *image, 2144 efi_uintn_t *image_size, 2145 const void *vendor_code, 2146 u32 package_version, 2147 const u16 *package_version_name); 2148}; 2149 2150#define EFI_DISK_IO_PROTOCOL_GUID \ 2151 EFI_GUID(0xce345171, 0xba0b, 0x11d2, 0x8e, 0x4f, \ 2152 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b) 2153 2154struct efi_disk { 2155 u64 revision; 2156 efi_status_t (EFIAPI *read_disk)(struct efi_disk *this, u32 media_id, 2157 u64 offset, efi_uintn_t buffer_size, 2158 void *buffer); 2159 2160 efi_status_t (EFIAPI *write_disk)(struct efi_disk *this, u32 media_id, 2161 u64 offset, efi_uintn_t buffer_size, 2162 void *buffer); 2163}; 2164 2165#endif 2166