master
h 227 lines 6.49 KB
Raw
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 */