| 1 | /* |
| 2 | * SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | * |
| 4 | * uefi-vars device - structs and defines from edk2 |
| 5 | * |
| 6 | * Note: The edk2 UINTN type has been mapped to uint64_t, |
| 7 | * so the structs are compatible with 64bit edk2 builds. |
| 8 | */ |
| 9 | #ifndef QEMU_UEFI_VAR_SERVICE_EDK2_H |
| 10 | #define QEMU_UEFI_VAR_SERVICE_EDK2_H |
| 11 | |
| 12 | #include "qemu/uuid.h" |
| 13 | |
| 14 | #define MAX_BIT 0x8000000000000000ULL |
| 15 | #define ENCODE_ERROR(StatusCode) (MAX_BIT | (StatusCode)) |
| 16 | #define EFI_SUCCESS 0 |
| 17 | #define EFI_INVALID_PARAMETER ENCODE_ERROR(2) |
| 18 | #define EFI_UNSUPPORTED ENCODE_ERROR(3) |
| 19 | #define EFI_BAD_BUFFER_SIZE ENCODE_ERROR(4) |
| 20 | #define EFI_BUFFER_TOO_SMALL ENCODE_ERROR(5) |
| 21 | #define EFI_WRITE_PROTECTED ENCODE_ERROR(8) |
| 22 | #define EFI_OUT_OF_RESOURCES ENCODE_ERROR(9) |
| 23 | #define EFI_NOT_FOUND ENCODE_ERROR(14) |
| 24 | #define EFI_ACCESS_DENIED ENCODE_ERROR(15) |
| 25 | #define EFI_ALREADY_STARTED ENCODE_ERROR(20) |
| 26 | #define EFI_SECURITY_VIOLATION ENCODE_ERROR(26) |
| 27 | |
| 28 | #define EFI_VARIABLE_NON_VOLATILE 0x01 |
| 29 | #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x02 |
| 30 | #define EFI_VARIABLE_RUNTIME_ACCESS 0x04 |
| 31 | #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x08 |
| 32 | #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x10 /* deprecated */ |
| 33 | #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x20 |
| 34 | #define EFI_VARIABLE_APPEND_WRITE 0x40 |
| 35 | |
| 36 | /* SecureBootEnable */ |
| 37 | #define SECURE_BOOT_ENABLE 1 |
| 38 | #define SECURE_BOOT_DISABLE 0 |
| 39 | |
| 40 | /* SecureBoot */ |
| 41 | #define SECURE_BOOT_MODE_ENABLE 1 |
| 42 | #define SECURE_BOOT_MODE_DISABLE 0 |
| 43 | |
| 44 | /* CustomMode */ |
| 45 | #define CUSTOM_SECURE_BOOT_MODE 1 |
| 46 | #define STANDARD_SECURE_BOOT_MODE 0 |
| 47 | |
| 48 | /* SetupMode */ |
| 49 | #define SETUP_MODE 1 |
| 50 | #define USER_MODE 0 |
| 51 | |
| 52 | typedef uint64_t efi_status; |
| 53 | typedef struct mm_header mm_header; |
| 54 | |
| 55 | /* EFI_MM_COMMUNICATE_HEADER */ |
| 56 | struct mm_header { |
| 57 | QemuUUID guid; |
| 58 | uint64_t length; |
| 59 | }; |
| 60 | |
| 61 | /* --- EfiSmmVariableProtocol ---------------------------------------- */ |
| 62 | |
| 63 | #define SMM_VARIABLE_FUNCTION_GET_VARIABLE 1 |
| 64 | #define SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME 2 |
| 65 | #define SMM_VARIABLE_FUNCTION_SET_VARIABLE 3 |
| 66 | #define SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO 4 |
| 67 | #define SMM_VARIABLE_FUNCTION_READY_TO_BOOT 5 |
| 68 | #define SMM_VARIABLE_FUNCTION_EXIT_BOOT_SERVICE 6 |
| 69 | #define SMM_VARIABLE_FUNCTION_LOCK_VARIABLE 8 |
| 70 | #define SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE 11 |
| 71 | |
| 72 | typedef struct mm_variable mm_variable; |
| 73 | typedef struct mm_variable_access mm_variable_access; |
| 74 | typedef struct mm_next_variable mm_next_variable; |
| 75 | typedef struct mm_next_variable mm_lock_variable; |
| 76 | typedef struct mm_variable_info mm_variable_info; |
| 77 | typedef struct mm_get_payload_size mm_get_payload_size; |
| 78 | |
| 79 | /* SMM_VARIABLE_COMMUNICATE_HEADER */ |
| 80 | struct mm_variable { |
| 81 | uint64_t function; |
| 82 | uint64_t status; |
| 83 | }; |
| 84 | |
| 85 | /* SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE */ |
| 86 | struct QEMU_PACKED mm_variable_access { |
| 87 | QemuUUID guid; |
| 88 | uint64_t data_size; |
| 89 | uint64_t name_size; |
| 90 | uint32_t attributes; |
| 91 | /* Name */ |
| 92 | /* Data */ |
| 93 | }; |
| 94 | |
| 95 | /* SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME */ |
| 96 | struct mm_next_variable { |
| 97 | QemuUUID guid; |
| 98 | uint64_t name_size; |
| 99 | /* Name */ |
| 100 | }; |
| 101 | |
| 102 | /* SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO */ |
| 103 | struct QEMU_PACKED mm_variable_info { |
| 104 | uint64_t max_storage_size; |
| 105 | uint64_t free_storage_size; |
| 106 | uint64_t max_variable_size; |
| 107 | uint32_t attributes; |
| 108 | }; |
| 109 | |
| 110 | /* SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE */ |
| 111 | struct mm_get_payload_size { |
| 112 | uint64_t payload_size; |
| 113 | }; |
| 114 | |
| 115 | /* --- VarCheckPolicyLibMmiHandler ----------------------------------- */ |
| 116 | |
| 117 | #define VAR_CHECK_POLICY_COMMAND_DISABLE 0x01 |
| 118 | #define VAR_CHECK_POLICY_COMMAND_IS_ENABLED 0x02 |
| 119 | #define VAR_CHECK_POLICY_COMMAND_REGISTER 0x03 |
| 120 | #define VAR_CHECK_POLICY_COMMAND_DUMP 0x04 |
| 121 | #define VAR_CHECK_POLICY_COMMAND_LOCK 0x05 |
| 122 | |
| 123 | typedef struct mm_check_policy mm_check_policy; |
| 124 | typedef struct mm_check_policy_is_enabled mm_check_policy_is_enabled; |
| 125 | typedef struct mm_check_policy_dump_params mm_check_policy_dump_params; |
| 126 | |
| 127 | /* VAR_CHECK_POLICY_COMM_HEADER */ |
| 128 | struct QEMU_PACKED mm_check_policy { |
| 129 | uint32_t signature; |
| 130 | uint32_t revision; |
| 131 | uint32_t command; |
| 132 | uint64_t result; |
| 133 | }; |
| 134 | |
| 135 | /* VAR_CHECK_POLICY_COMM_IS_ENABLED_PARAMS */ |
| 136 | struct QEMU_PACKED mm_check_policy_is_enabled { |
| 137 | uint8_t state; |
| 138 | }; |
| 139 | |
| 140 | /* VAR_CHECK_POLICY_COMM_DUMP_PARAMS */ |
| 141 | struct QEMU_PACKED mm_check_policy_dump_params { |
| 142 | uint32_t page_requested; |
| 143 | uint32_t total_size; |
| 144 | uint32_t page_size; |
| 145 | uint8_t has_more; |
| 146 | }; |
| 147 | |
| 148 | /* --- Edk2VariablePolicyProtocol ------------------------------------ */ |
| 149 | |
| 150 | #define VARIABLE_POLICY_ENTRY_REVISION 0x00010000 |
| 151 | |
| 152 | #define VARIABLE_POLICY_TYPE_NO_LOCK 0 |
| 153 | #define VARIABLE_POLICY_TYPE_LOCK_NOW 1 |
| 154 | #define VARIABLE_POLICY_TYPE_LOCK_ON_CREATE 2 |
| 155 | #define VARIABLE_POLICY_TYPE_LOCK_ON_VAR_STATE 3 |
| 156 | |
| 157 | typedef struct variable_policy_entry variable_policy_entry; |
| 158 | typedef struct variable_lock_on_var_state variable_lock_on_var_state; |
| 159 | |
| 160 | /* VARIABLE_POLICY_ENTRY */ |
| 161 | struct variable_policy_entry { |
| 162 | uint32_t version; |
| 163 | uint16_t size; |
| 164 | uint16_t offset_to_name; |
| 165 | QemuUUID namespace; |
| 166 | uint32_t min_size; |
| 167 | uint32_t max_size; |
| 168 | uint32_t attributes_must_have; |
| 169 | uint32_t attributes_cant_have; |
| 170 | uint8_t lock_policy_type; |
| 171 | uint8_t padding[3]; |
| 172 | /* LockPolicy */ |
| 173 | /* Name */ |
| 174 | }; |
| 175 | |
| 176 | /* VARIABLE_LOCK_ON_VAR_STATE_POLICY */ |
| 177 | struct variable_lock_on_var_state { |
| 178 | QemuUUID namespace; |
| 179 | uint8_t value; |
| 180 | uint8_t padding; |
| 181 | /* Name */ |
| 182 | }; |
| 183 | |
| 184 | /* --- variable authentication --------------------------------------- */ |
| 185 | |
| 186 | #define WIN_CERT_TYPE_EFI_GUID 0x0EF1 |
| 187 | |
| 188 | typedef struct efi_time efi_time; |
| 189 | typedef struct efi_siglist efi_siglist; |
| 190 | typedef struct variable_auth_2 variable_auth_2; |
| 191 | |
| 192 | /* EFI_TIME */ |
| 193 | struct efi_time { |
| 194 | uint16_t year; |
| 195 | uint8_t month; |
| 196 | uint8_t day; |
| 197 | uint8_t hour; |
| 198 | uint8_t minute; |
| 199 | uint8_t second; |
| 200 | uint8_t pad1; |
| 201 | uint32_t nanosecond; |
| 202 | int16_t timezone; |
| 203 | uint8_t daylight; |
| 204 | uint8_t pad2; |
| 205 | }; |
| 206 | |
| 207 | /* EFI_SIGNATURE_LIST */ |
| 208 | struct efi_siglist { |
| 209 | QemuUUID guid_type; |
| 210 | uint32_t siglist_size; |
| 211 | uint32_t header_size; |
| 212 | uint32_t sig_size; |
| 213 | }; |
| 214 | |
| 215 | /* EFI_VARIABLE_AUTHENTICATION_2 */ |
| 216 | struct variable_auth_2 { |
| 217 | struct efi_time timestamp; |
| 218 | |
| 219 | /* WIN_CERTIFICATE_UEFI_GUID */ |
| 220 | uint32_t hdr_length; |
| 221 | uint16_t hdr_revision; |
| 222 | uint16_t hdr_cert_type; |
| 223 | QemuUUID guid_cert_type; |
| 224 | uint8_t cert_data[]; |
| 225 | }; |
| 226 | |
| 227 | #endif /* QEMU_UEFI_VAR_SERVICE_EDK2_H */ |