OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
ControlMsrE2Hii.c
Go to the documentation of this file.
1
15#include "ControlMsrE2.h"
16
17typedef struct VAR_STORE_CONTEXT_ {
18 EFI_VARSTORE_ID Id;
19 EFI_IFR_VARSTORE *VarStoreHeader;
21
22EFI_HII_PACKAGE_LIST_HEADER *
24 IN EFI_HII_HANDLE Handle
25 )
26{
27 EFI_STATUS Status;
28 UINTN BufferSize;
29 EFI_HII_PACKAGE_LIST_HEADER *Buffer;
30
31 BufferSize = 0;
32
33 //
34 // Call first time with zero buffer length.
35 // Should fail with EFI_BUFFER_TOO_SMALL.
36 //
37 Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, NULL);
38 if ((Status == EFI_BUFFER_TOO_SMALL) && (BufferSize > 0)) {
39 //
40 // Allocate buffer to hold the HII Database.
41 //
42 Buffer = (EFI_HII_PACKAGE_LIST_HEADER *)AllocatePool (BufferSize);
43 if (Buffer != NULL) {
44 //
45 // Export HII Database into the buffer.
46 //
47 Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, Buffer);
48 if (!EFI_ERROR (Status)) {
49 return Buffer;
50 }
51
52 FreePool (Buffer);
53 }
54 }
55
56 return NULL;
57}
58
59EFI_IFR_OP_HEADER *
61 IN EFI_IFR_OP_HEADER *Header,
62 IN UINT8 OpCode,
63 IN OUT BOOLEAN *Stop OPTIONAL,
64 IN VOID *Context,
65 IN OP_CODE_HANDLER Handler
66 )
67{
68 while (Stop == NULL || !(*Stop)) {
69 if (Header->OpCode == EFI_IFR_END_OP) {
70 return Header;
71 }
72
73 if (Header->OpCode == OpCode) {
74 Handler (Header, Stop, Context);
75 if ((Stop != NULL) && *Stop) {
76 return Header;
77 }
78 }
79
80 if (Header->Scope) {
82 PADD (Header, Header->Length),
83 OpCode,
84 Stop,
85 Context,
86 Handler
87 );
88 }
89
90 Header = PADD (Header, Header->Length);
91 }
92
93 return Header;
94}
95
96VOID
98 IN EFI_IFR_OP_HEADER *IfrHeader,
99 IN OUT BOOLEAN *Stop OPTIONAL,
100 IN OUT VOID *Context
101 )
102{
104 EFI_IFR_VARSTORE *VarStore;
105
106 Ctx = Context;
107 VarStore = (EFI_IFR_VARSTORE *)IfrHeader;
108
109 if (VarStore->VarStoreId == Ctx->Id) {
110 Ctx->VarStoreHeader = VarStore;
111 if (Stop != NULL) {
112 *Stop = TRUE;
113 }
114 }
115}
116
117EFI_IFR_VARSTORE *
119 IN EFI_IFR_OP_HEADER *Header,
120 IN EFI_VARSTORE_ID Id
121 )
122{
123 BOOLEAN Stop;
124 VAR_STORE_CONTEXT Context;
125
126 Stop = FALSE;
127 Context.Id = Id;
128 Context.VarStoreHeader = NULL;
129
130 IterateOpCode (Header, EFI_IFR_VARSTORE_OP, &Stop, &Context, HandleVarStore);
131
132 return Context.VarStoreHeader;
133}
134
135VOID
137 IN EFI_IFR_OP_HEADER *IfrHeader,
138 IN OUT BOOLEAN *Stop OPTIONAL,
139 IN OUT VOID *Context
140 )
141{
142 ONE_OF_CONTEXT *Ctx;
143 UINT8 *Data;
144 UINT8 *VarPointer;
145 UINTN DataSize;
146 UINTN VarSize;
147 UINT16 OldContextCount;
148 UINT64 VarStoreValue;
149 EFI_STATUS Status;
150 EFI_IFR_VARSTORE *IfrVarStore;
151 EFI_IFR_ONE_OF *IfrOneOf;
152 EFI_STRING HiiString;
153 EFI_STRING VarStoreName;
154
155 Ctx = Context;
156 IfrOneOf = (EFI_IFR_ONE_OF *)IfrHeader;
157
158 HiiString = HiiGetString (Ctx->EfiHandle, IfrOneOf->Question.Header.Prompt, "en-US");
159 if (HiiString == NULL) {
160 Print (L"\nCould not allocate memory for HiiString\n");
161 return;
162 }
163
164 IfrVarStore = GetVarStore (Ctx->FirstIfrHeader, IfrOneOf->Question.VarStoreId);
165 if (IfrVarStore == NULL) {
166 Print (L"\nCould not retrieve IfrVarStore\n");
167 return;
168 }
169
170 if (OcStriStr (HiiString, Ctx->SearchText) != NULL) {
171 OldContextCount = Ctx->Count;
172
173 if (Ctx->IfrOneOf == NULL) {
174 Ctx->IfrOneOf = IfrOneOf;
175 Ctx->IfrVarStore = IfrVarStore;
176 Ctx->Count++;
177 } else {
179 if ( (Ctx->IfrOneOf->Question.VarStoreId != IfrOneOf->Question.VarStoreId)
180 || (Ctx->IfrOneOf->Question.VarStoreInfo.VarOffset != IfrOneOf->Question.VarStoreInfo.VarOffset))
181 {
182 Ctx->IfrOneOf = IfrOneOf;
183 Ctx->IfrVarStore = IfrVarStore;
184 Ctx->Count++;
185 }
186 }
187
188 if ((Ctx->Count == Ctx->StopAt) && (Stop != NULL)) {
189 Ctx->IfrOneOf = IfrOneOf;
190 Ctx->IfrVarStore = IfrVarStore;
191 Ctx->Count = 1;
192 *Stop = TRUE;
193 } else if ((OldContextCount != Ctx->Count) && (Ctx->StopAt == DONT_STOP_AT)) {
194 VarStoreName = AsciiStrCopyToUnicode ((CHAR8 *)IfrVarStore->Name, 0);
195
196 Print (
197 L"%X. %02X %04X %04X /%s/ VarStore Name: %s",
198 Ctx->Count,
199 IfrOneOf->Header.OpCode,
200 IfrOneOf->Question.VarStoreInfo.VarName,
201 IfrOneOf->Question.VarStoreId,
202 HiiString,
203 VarStoreName
204 );
205
206 DataSize = 0;
207 Status = gRT->GetVariable (
208 VarStoreName,
209 (VOID *)&IfrVarStore->Guid,
210 NULL,
211 &DataSize,
212 NULL
213 );
214
215 if (Status == EFI_BUFFER_TOO_SMALL) {
216 Data = AllocatePool (DataSize);
217 if (Data != NULL) {
218 Status = gRT->GetVariable (
219 VarStoreName,
220 (VOID *)&IfrVarStore->Guid,
221 NULL,
222 &DataSize,
223 Data
224 );
225
226 if (!EFI_ERROR (Status)) {
227 VarSize = sizeof (EFI_IFR_ONE_OF) - IfrOneOf->Header.Length;
228 VarSize = 8 - (VarSize / 3);
229
230 if (DataSize >= IfrOneOf->Question.VarStoreInfo.VarOffset + VarSize) {
231 VarPointer = Data + IfrOneOf->Question.VarStoreInfo.VarOffset;
232 switch (VarSize) {
233 case 1:
234 VarStoreValue = *VarPointer;
235 break;
236 case 2:
237 VarStoreValue = *(UINT16 *)(VarPointer);
238 break;
239 case 4:
240 VarStoreValue = *(UINT32 *)(VarPointer);
241 break;
242 default:
243 VarStoreValue = *(UINT64 *)(VarPointer);
244 break;
245 }
246
247 Print (L" Value: value %X", VarStoreValue);
248 }
249 }
250
251 FreePool (Data);
252 }
253 }
254
255 FreePool (VarStoreName);
256 Print (L"\n");
257 }
258 }
259
260 FreePool (HiiString);
261}
262
263VOID
265 IN OUT ONE_OF_CONTEXT *Context
266 )
267{
268 EFI_STATUS Status;
269 EFI_STRING HiiString;
270 UINTN DataSize;
271 UINT8 *Data;
272 UINT32 Attributes;
273 UINTN VarSize;
274 UINT8 *VarPointer;
275 UINT64 VarStoreValue;
276 UINT64 NewValue;
277
278 HiiString = HiiGetString (Context->EfiHandle, Context->IfrOneOf->Question.Header.Prompt, "en-US");
279 if (HiiString != NULL) {
280 Print (L"\nBIOS Option found: %s\n", HiiString);
281 FreePool (HiiString);
282 }
283
284 HiiString = AsciiStrCopyToUnicode ((CHAR8 *)Context->IfrVarStore->Name, 0);
285 if (HiiString == NULL) {
286 Print (L"\nCould not allocate memory for HiiString\n");
287 return;
288 }
289
290 VarSize = sizeof (EFI_IFR_ONE_OF) - Context->IfrOneOf->Header.Length;
291 VarSize = 8 - (VarSize / 3);
292
293 Print (
294 L"In VarStore \"%s\" GUID: %g Offset: %04X Size: %X ",
295 HiiString,
296 &Context->IfrVarStore->Guid,
297 Context->IfrOneOf->Question.VarStoreInfo.VarOffset,
298 VarSize
299 );
300
301 DataSize = 0;
302
303 Status = gRT->GetVariable (
304 HiiString,
305 (VOID *)&Context->IfrVarStore->Guid,
306 &Attributes,
307 &DataSize,
308 NULL
309 );
310
311 if (Status == EFI_BUFFER_TOO_SMALL) {
312 Data = AllocatePool (DataSize);
313 if (Data != NULL) {
314 Status = gRT->GetVariable (
315 HiiString,
316 (VOID *)&Context->IfrVarStore->Guid,
317 &Attributes,
318 &DataSize,
319 Data
320 );
321
322 if (!EFI_ERROR (Status)) {
323 ASSERT (DataSize >= Context->IfrOneOf->Question.VarStoreInfo.VarOffset + VarSize);
324 VarPointer = Data + Context->IfrOneOf->Question.VarStoreInfo.VarOffset;
325 switch (VarSize) {
326 case 1:
327 VarStoreValue = *VarPointer;
328 break;
329 case 2:
330 VarStoreValue = *(UINT16 *)(VarPointer);
331 break;
332 case 4:
333 VarStoreValue = *(UINT32 *)(VarPointer);
334 break;
335 default:
336 ASSERT (VarSize == 8);
337 VarStoreValue = *(UINT64 *)(VarPointer);
338 break;
339 }
340
341 Print (L"Value: value %X\n", VarStoreValue);
342
344 NewValue = VarStoreValue != 0 ? 0 : 1;
345 } else if (mArgumentFlags == ARG_LOCK) {
346 NewValue = 1;
347 } else if (mArgumentFlags == ARG_UNLOCK) {
348 NewValue = 0;
349 } else {
350 NewValue = VarStoreValue;
351 }
352
353 if (NewValue != VarStoreValue) {
355 Print (L"Do you want to toggle the value y/n ?");
356 } else if (mArgumentFlags == ARG_LOCK) {
357 Print (L"Do you want to set the value y/n ?");
358 } else {
359 Print (L"Do you want to clear the value y/n ?");
360 }
361
362 if (ReadYN ()) {
363 switch (VarSize) {
364 case 1:
365 *VarPointer = (UINT8)NewValue;
366 break;
367 case 2:
368 *(UINT16 *)(VarPointer) = (UINT16)NewValue;
369 break;
370 case 4:
371 *(UINT32 *)(VarPointer) = (UINT32)NewValue;
372 break;
373 default:
374 *(UINT64 *)(VarPointer) = NewValue;
375 break;
376 }
377
378 Status = gRT->SetVariable (
379 HiiString,
380 (VOID *)&Context->IfrVarStore->Guid,
381 Attributes,
382 DataSize,
383 Data
384 );
385
386 if (!EFI_ERROR (Status)) {
387 Print (L"\nDone. You will have to reboot for the change to take effect.\n");
388 } else {
389 Print (L"\nProblem writing variable - %r\n", Status);
390 }
391 } else {
392 Print (L"\n");
393 }
394 } else {
395 Print (L"Value is as wanted already. No action required.\n");
396 }
397 } else {
398 Print (L"\nCould not read Data\n");
399 }
400
401 FreePool (Data);
402 } else {
403 Print (L"\nCould not allocate memory for Data\n");
404 }
405 } else {
406 Print (L"\nCould not find Variable.\n");
407 }
408
409 FreePool (HiiString);
410}
VENDOR_DEVICE_PATH Header
@ ARG_UNLOCK
@ ARG_LOCK
@ ARG_INTERACTIVE
#define DONT_STOP_AT
VOID OP_CODE_HANDLER(IN EFI_IFR_OP_HEADER *IfrHeader, IN OUT BOOLEAN *Stop OPTIONAL, IN VOID *Context)
BOOLEAN ReadYN(VOID)
UINTN mArgumentFlags
#define PADD(x, y)
VOID HandleIfrOption(IN EFI_IFR_OP_HEADER *IfrHeader, IN OUT BOOLEAN *Stop OPTIONAL, IN OUT VOID *Context)
EFI_IFR_OP_HEADER * IterateOpCode(IN EFI_IFR_OP_HEADER *Header, IN UINT8 OpCode, IN OUT BOOLEAN *Stop OPTIONAL, IN VOID *Context, IN OP_CODE_HANDLER Handler)
struct VAR_STORE_CONTEXT_ VAR_STORE_CONTEXT
EFI_IFR_VARSTORE * GetVarStore(IN EFI_IFR_OP_HEADER *Header, IN EFI_VARSTORE_ID Id)
VOID HandleIfrVariable(IN OUT ONE_OF_CONTEXT *Context)
EFI_HII_PACKAGE_LIST_HEADER * HiiExportPackageLists(IN EFI_HII_HANDLE Handle)
VOID HandleVarStore(IN EFI_IFR_OP_HEADER *IfrHeader, IN OUT BOOLEAN *Stop OPTIONAL, IN OUT VOID *Context)
CHAR16 *EFIAPI OcStriStr(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString)
CHAR16 * AsciiStrCopyToUnicode(IN CONST CHAR8 *String, IN UINTN Length)
Definition OcAsciiLib.c:119
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
APPLE_EVENT_HANDLE Handle
Definition OcTypingLib.h:45
EFI_HII_DATABASE_PROTOCOL * gHiiDatabase
EFI_RUNTIME_SERVICES * gRT
#define ASSERT(x)
Definition coder.h:55
EFI_IFR_ONE_OF * IfrOneOf
EFI_IFR_VARSTORE * IfrVarStore
EFI_IFR_OP_HEADER * FirstIfrHeader
EFI_STRING SearchText
EFI_HII_HANDLE EfiHandle
EFI_VARSTORE_ID Id
EFI_IFR_VARSTORE * VarStoreHeader