| /* |
| * SPDX-License-Identifier: GPL-2.0-or-later |
| * |
| * uefi-vars device - structs and defines from edk2 |
| * |
| * Note: The edk2 UINTN type has been mapped to uint64_t, |
| * so the structs are compatible with 64bit edk2 builds. |
| */ |
| #ifndef QEMU_UEFI_VAR_SERVICE_EDK2_H |
| #define QEMU_UEFI_VAR_SERVICE_EDK2_H |
| |
| #include "qemu/uuid.h" |
| |
| #define MAX_BIT 0x8000000000000000ULL |
| #define ENCODE_ERROR(StatusCode) (MAX_BIT | (StatusCode)) |
| #define EFI_SUCCESS 0 |
| #define EFI_INVALID_PARAMETER ENCODE_ERROR(2) |
| #define EFI_UNSUPPORTED ENCODE_ERROR(3) |
| #define EFI_BAD_BUFFER_SIZE ENCODE_ERROR(4) |
| #define EFI_BUFFER_TOO_SMALL ENCODE_ERROR(5) |
| #define EFI_WRITE_PROTECTED ENCODE_ERROR(8) |
| #define EFI_OUT_OF_RESOURCES ENCODE_ERROR(9) |
| #define EFI_NOT_FOUND ENCODE_ERROR(14) |
| #define EFI_ACCESS_DENIED ENCODE_ERROR(15) |
| #define EFI_ALREADY_STARTED ENCODE_ERROR(20) |
| #define EFI_SECURITY_VIOLATION ENCODE_ERROR(26) |
| |
| #define EFI_VARIABLE_NON_VOLATILE 0x01 |
| #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x02 |
| #define EFI_VARIABLE_RUNTIME_ACCESS 0x04 |
| #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x08 |
| #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x10 /* deprecated */ |
| #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x20 |
| #define EFI_VARIABLE_APPEND_WRITE 0x40 |
| |
| /* SecureBootEnable */ |
| #define SECURE_BOOT_ENABLE 1 |
| #define SECURE_BOOT_DISABLE 0 |
| |
| /* SecureBoot */ |
| #define SECURE_BOOT_MODE_ENABLE 1 |
| #define SECURE_BOOT_MODE_DISABLE 0 |
| |
| /* CustomMode */ |
| #define CUSTOM_SECURE_BOOT_MODE 1 |
| #define STANDARD_SECURE_BOOT_MODE 0 |
| |
| /* SetupMode */ |
| #define SETUP_MODE 1 |
| #define USER_MODE 0 |
| |
| typedef uint64_t efi_status; |
| typedef struct mm_header mm_header; |
| |
| /* EFI_MM_COMMUNICATE_HEADER */ |
| struct mm_header { |
| QemuUUID guid; |
| uint64_t length; |
| }; |
| |
| /* --- EfiSmmVariableProtocol ---------------------------------------- */ |
| |
| #define SMM_VARIABLE_FUNCTION_GET_VARIABLE 1 |
| #define SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME 2 |
| #define SMM_VARIABLE_FUNCTION_SET_VARIABLE 3 |
| #define SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO 4 |
| #define SMM_VARIABLE_FUNCTION_READY_TO_BOOT 5 |
| #define SMM_VARIABLE_FUNCTION_EXIT_BOOT_SERVICE 6 |
| #define SMM_VARIABLE_FUNCTION_LOCK_VARIABLE 8 |
| #define SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE 11 |
| |
| typedef struct mm_variable mm_variable; |
| typedef struct mm_variable_access mm_variable_access; |
| typedef struct mm_next_variable mm_next_variable; |
| typedef struct mm_next_variable mm_lock_variable; |
| typedef struct mm_variable_info mm_variable_info; |
| typedef struct mm_get_payload_size mm_get_payload_size; |
| |
| /* SMM_VARIABLE_COMMUNICATE_HEADER */ |
| struct mm_variable { |
| uint64_t function; |
| uint64_t status; |
| }; |
| |
| /* SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE */ |
| struct QEMU_PACKED mm_variable_access { |
| QemuUUID guid; |
| uint64_t data_size; |
| uint64_t name_size; |
| uint32_t attributes; |
| /* Name */ |
| /* Data */ |
| }; |
| |
| /* SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME */ |
| struct mm_next_variable { |
| QemuUUID guid; |
| uint64_t name_size; |
| /* Name */ |
| }; |
| |
| /* SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO */ |
| struct QEMU_PACKED mm_variable_info { |
| uint64_t max_storage_size; |
| uint64_t free_storage_size; |
| uint64_t max_variable_size; |
| uint32_t attributes; |
| }; |
| |
| /* SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE */ |
| struct mm_get_payload_size { |
| uint64_t payload_size; |
| }; |
| |
| /* --- VarCheckPolicyLibMmiHandler ----------------------------------- */ |
| |
| #define VAR_CHECK_POLICY_COMMAND_DISABLE 0x01 |
| #define VAR_CHECK_POLICY_COMMAND_IS_ENABLED 0x02 |
| #define VAR_CHECK_POLICY_COMMAND_REGISTER 0x03 |
| #define VAR_CHECK_POLICY_COMMAND_DUMP 0x04 |
| #define VAR_CHECK_POLICY_COMMAND_LOCK 0x05 |
| |
| typedef struct mm_check_policy mm_check_policy; |
| typedef struct mm_check_policy_is_enabled mm_check_policy_is_enabled; |
| typedef struct mm_check_policy_dump_params mm_check_policy_dump_params; |
| |
| /* VAR_CHECK_POLICY_COMM_HEADER */ |
| struct QEMU_PACKED mm_check_policy { |
| uint32_t signature; |
| uint32_t revision; |
| uint32_t command; |
| uint64_t result; |
| }; |
| |
| /* VAR_CHECK_POLICY_COMM_IS_ENABLED_PARAMS */ |
| struct QEMU_PACKED mm_check_policy_is_enabled { |
| uint8_t state; |
| }; |
| |
| /* VAR_CHECK_POLICY_COMM_DUMP_PARAMS */ |
| struct QEMU_PACKED mm_check_policy_dump_params { |
| uint32_t page_requested; |
| uint32_t total_size; |
| uint32_t page_size; |
| uint8_t has_more; |
| }; |
| |
| /* --- Edk2VariablePolicyProtocol ------------------------------------ */ |
| |
| #define VARIABLE_POLICY_ENTRY_REVISION 0x00010000 |
| |
| #define VARIABLE_POLICY_TYPE_NO_LOCK 0 |
| #define VARIABLE_POLICY_TYPE_LOCK_NOW 1 |
| #define VARIABLE_POLICY_TYPE_LOCK_ON_CREATE 2 |
| #define VARIABLE_POLICY_TYPE_LOCK_ON_VAR_STATE 3 |
| |
| typedef struct variable_policy_entry variable_policy_entry; |
| typedef struct variable_lock_on_var_state variable_lock_on_var_state; |
| |
| /* VARIABLE_POLICY_ENTRY */ |
| struct variable_policy_entry { |
| uint32_t version; |
| uint16_t size; |
| uint16_t offset_to_name; |
| QemuUUID namespace; |
| uint32_t min_size; |
| uint32_t max_size; |
| uint32_t attributes_must_have; |
| uint32_t attributes_cant_have; |
| uint8_t lock_policy_type; |
| uint8_t padding[3]; |
| /* LockPolicy */ |
| /* Name */ |
| }; |
| |
| /* VARIABLE_LOCK_ON_VAR_STATE_POLICY */ |
| struct variable_lock_on_var_state { |
| QemuUUID namespace; |
| uint8_t value; |
| uint8_t padding; |
| /* Name */ |
| }; |
| |
| /* --- variable authentication --------------------------------------- */ |
| |
| #define WIN_CERT_TYPE_EFI_GUID 0x0EF1 |
| |
| typedef struct efi_time efi_time; |
| typedef struct efi_siglist efi_siglist; |
| typedef struct variable_auth_2 variable_auth_2; |
| |
| /* EFI_TIME */ |
| struct efi_time { |
| uint16_t year; |
| uint8_t month; |
| uint8_t day; |
| uint8_t hour; |
| uint8_t minute; |
| uint8_t second; |
| uint8_t pad1; |
| uint32_t nanosecond; |
| int16_t timezone; |
| uint8_t daylight; |
| uint8_t pad2; |
| }; |
| |
| /* EFI_SIGNATURE_LIST */ |
| struct efi_siglist { |
| QemuUUID guid_type; |
| uint32_t siglist_size; |
| uint32_t header_size; |
| uint32_t sig_size; |
| }; |
| |
| /* EFI_VARIABLE_AUTHENTICATION_2 */ |
| struct variable_auth_2 { |
| struct efi_time timestamp; |
| |
| /* WIN_CERTIFICATE_UEFI_GUID */ |
| uint32_t hdr_length; |
| uint16_t hdr_revision; |
| uint16_t hdr_cert_type; |
| QemuUUID guid_cert_type; |
| uint8_t cert_data[]; |
| }; |
| |
| #endif /* QEMU_UEFI_VAR_SERVICE_EDK2_H */ |