]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerCustomizedUiSupport.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / BootMaintenanceManagerCustomizedUiSupport.c
1 /** @file
2 The functions for Boot Maintainence Main menu.
3
4 Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #include "BootMaintenanceManager.h"
10 #include "BootMaintenanceManagerCustomizedUiSupport.h"
11
12 #define UI_HII_DRIVER_LIST_SIZE 0x8
13
14 typedef struct {
15 EFI_STRING_ID PromptId;
16 EFI_STRING_ID HelpId;
17 EFI_STRING_ID DevicePathId;
18 EFI_GUID FormSetGuid;
19 BOOLEAN EmptyLineAfter;
20 } UI_HII_DRIVER_INSTANCE;
21
22 STATIC UI_HII_DRIVER_INSTANCE *gHiiDriverList;
23
24 /**
25 Create the dynamic item to allow user to set the "BootNext" vaule.
26
27 @param[in] HiiHandle The hii handle for the Uiapp driver.
28 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
29
30 **/
31 VOID
32 BmmCreateBootNextMenu (
33 IN EFI_HII_HANDLE HiiHandle,
34 IN VOID *StartOpCodeHandle
35 )
36 {
37 BM_MENU_ENTRY *NewMenuEntry;
38 BM_LOAD_CONTEXT *NewLoadContext;
39 UINT16 Index;
40 VOID *OptionsOpCodeHandle;
41 UINT32 BootNextIndex;
42
43 if (BootOptionMenu.MenuNumber == 0) {
44 return;
45 }
46
47 BootNextIndex = NONE_BOOTNEXT_VALUE;
48
49 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
50 ASSERT (OptionsOpCodeHandle != NULL);
51
52 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
53 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
54 NewLoadContext = (BM_LOAD_CONTEXT *)NewMenuEntry->VariableContext;
55
56 if (NewLoadContext->IsBootNext) {
57 HiiCreateOneOfOptionOpCode (
58 OptionsOpCodeHandle,
59 NewMenuEntry->DisplayStringToken,
60 EFI_IFR_OPTION_DEFAULT,
61 EFI_IFR_TYPE_NUM_SIZE_32,
62 Index
63 );
64 BootNextIndex = Index;
65 } else {
66 HiiCreateOneOfOptionOpCode (
67 OptionsOpCodeHandle,
68 NewMenuEntry->DisplayStringToken,
69 0,
70 EFI_IFR_TYPE_NUM_SIZE_32,
71 Index
72 );
73 }
74 }
75
76 if (BootNextIndex == NONE_BOOTNEXT_VALUE) {
77 HiiCreateOneOfOptionOpCode (
78 OptionsOpCodeHandle,
79 STRING_TOKEN (STR_NONE),
80 EFI_IFR_OPTION_DEFAULT,
81 EFI_IFR_TYPE_NUM_SIZE_32,
82 NONE_BOOTNEXT_VALUE
83 );
84 } else {
85 HiiCreateOneOfOptionOpCode (
86 OptionsOpCodeHandle,
87 STRING_TOKEN (STR_NONE),
88 0,
89 EFI_IFR_TYPE_NUM_SIZE_32,
90 NONE_BOOTNEXT_VALUE
91 );
92 }
93
94 HiiCreateOneOfOpCode (
95 StartOpCodeHandle,
96 (EFI_QUESTION_ID)BOOT_NEXT_QUESTION_ID,
97 VARSTORE_ID_BOOT_MAINT,
98 BOOT_NEXT_VAR_OFFSET,
99 STRING_TOKEN (STR_BOOT_NEXT),
100 STRING_TOKEN (STR_BOOT_NEXT_HELP),
101 0,
102 EFI_IFR_NUMERIC_SIZE_4,
103 OptionsOpCodeHandle,
104 NULL
105 );
106
107 HiiFreeOpCodeHandle (OptionsOpCodeHandle);
108 }
109
110 /**
111 Create Time Out Menu in the page.
112
113 @param[in] HiiHandle The hii handle for the Uiapp driver.
114 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
115
116 **/
117 VOID
118 BmmCreateTimeOutMenu (
119 IN EFI_HII_HANDLE HiiHandle,
120 IN VOID *StartOpCodeHandle
121 )
122 {
123 HiiCreateNumericOpCode (
124 StartOpCodeHandle,
125 (EFI_QUESTION_ID)FORM_TIME_OUT_ID,
126 VARSTORE_ID_BOOT_MAINT,
127 BOOT_TIME_OUT_VAR_OFFSET,
128 STRING_TOKEN (STR_NUM_AUTO_BOOT),
129 STRING_TOKEN (STR_HLP_AUTO_BOOT),
130 EFI_IFR_FLAG_CALLBACK,
131 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,
132 0,
133 65535,
134 0,
135 NULL
136 );
137 }
138
139 /**
140 Create Boot Option menu in the page.
141
142 @param[in] HiiHandle The hii handle for the Uiapp driver.
143 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
144
145 **/
146 VOID
147 BmmCreateBootOptionMenu (
148 IN EFI_HII_HANDLE HiiHandle,
149 IN VOID *StartOpCodeHandle
150 )
151 {
152 HiiCreateGotoOpCode (
153 StartOpCodeHandle,
154 FORM_BOOT_SETUP_ID,
155 STRING_TOKEN (STR_FORM_BOOT_SETUP_TITLE),
156 STRING_TOKEN (STR_FORM_BOOT_SETUP_HELP),
157 EFI_IFR_FLAG_CALLBACK,
158 FORM_BOOT_SETUP_ID
159 );
160 }
161
162 /**
163 Create Driver Option menu in the page.
164
165 @param[in] HiiHandle The hii handle for the Uiapp driver.
166 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
167
168 **/
169 VOID
170 BmmCreateDriverOptionMenu (
171 IN EFI_HII_HANDLE HiiHandle,
172 IN VOID *StartOpCodeHandle
173 )
174 {
175 HiiCreateGotoOpCode (
176 StartOpCodeHandle,
177 FORM_DRIVER_SETUP_ID,
178 STRING_TOKEN (STR_FORM_DRIVER_SETUP_TITLE),
179 STRING_TOKEN (STR_FORM_DRIVER_SETUP_HELP),
180 EFI_IFR_FLAG_CALLBACK,
181 FORM_DRIVER_SETUP_ID
182 );
183 }
184
185 /**
186 Create Com Option menu in the page.
187
188 @param[in] HiiHandle The hii handle for the Uiapp driver.
189 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
190
191 **/
192 VOID
193 BmmCreateComOptionMenu (
194 IN EFI_HII_HANDLE HiiHandle,
195 IN VOID *StartOpCodeHandle
196 )
197 {
198 HiiCreateGotoOpCode (
199 StartOpCodeHandle,
200 FORM_CON_MAIN_ID,
201 STRING_TOKEN (STR_FORM_CON_MAIN_TITLE),
202 STRING_TOKEN (STR_FORM_CON_MAIN_HELP),
203 EFI_IFR_FLAG_CALLBACK,
204 FORM_CON_MAIN_ID
205 );
206 }
207
208 /**
209 Create Com Option menu in the page.
210
211 @param[in] HiiHandle The hii handle for the Uiapp driver.
212 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
213
214 **/
215 VOID
216 BmmCreateBootFromFileMenu (
217 IN EFI_HII_HANDLE HiiHandle,
218 IN VOID *StartOpCodeHandle
219 )
220 {
221 HiiCreateGotoOpCode (
222 StartOpCodeHandle,
223 FORM_MAIN_ID,
224 STRING_TOKEN (STR_BOOT_FROM_FILE),
225 STRING_TOKEN (STR_BOOT_FROM_FILE_HELP),
226 EFI_IFR_FLAG_CALLBACK,
227 KEY_VALUE_BOOT_FROM_FILE
228 );
229 }
230
231 /**
232 Create empty line menu in the front page.
233
234 @param HiiHandle The hii handle for the Uiapp driver.
235 @param StartOpCodeHandle The opcode handle to save the new opcode.
236
237 **/
238 VOID
239 BmmCreateEmptyLine (
240 IN EFI_HII_HANDLE HiiHandle,
241 IN VOID *StartOpCodeHandle
242 )
243 {
244 HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0);
245 }
246
247 /**
248 Extract device path for given HII handle and class guid.
249
250 @param Handle The HII handle.
251
252 @retval NULL Fail to get the device path string.
253 @return PathString Get the device path string.
254
255 **/
256 CHAR16 *
257 ExtractDevicePathFromHandle (
258 IN EFI_HII_HANDLE Handle
259 )
260 {
261 EFI_STATUS Status;
262 EFI_HANDLE DriverHandle;
263
264 ASSERT (Handle != NULL);
265
266 if (Handle == NULL) {
267 return NULL;
268 }
269
270 Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);
271 if (EFI_ERROR (Status)) {
272 return NULL;
273 }
274
275 return ConvertDevicePathToText (DevicePathFromHandle (DriverHandle), FALSE, FALSE);
276 }
277
278 /**
279 Check whether this driver need to be shown in the front page.
280
281 @param HiiHandle The hii handle for the driver.
282 @param Guid The special guid for the driver which is the target.
283 @param PromptId Return the prompt string id.
284 @param HelpId Return the help string id.
285 @param FormsetGuid Return the formset guid info.
286
287 @retval EFI_SUCCESS Search the driver success
288
289 **/
290 BOOLEAN
291 IsRequiredDriver (
292 IN EFI_HII_HANDLE HiiHandle,
293 IN EFI_GUID *Guid,
294 OUT EFI_STRING_ID *PromptId,
295 OUT EFI_STRING_ID *HelpId,
296 OUT VOID *FormsetGuid
297 )
298 {
299 EFI_STATUS Status;
300 UINT8 ClassGuidNum;
301 EFI_GUID *ClassGuid;
302 EFI_IFR_FORM_SET *Buffer;
303 UINTN BufferSize;
304 UINT8 *Ptr;
305 UINTN TempSize;
306 BOOLEAN RetVal;
307
308 Status = HiiGetFormSetFromHiiHandle (HiiHandle, &Buffer, &BufferSize);
309 if (EFI_ERROR (Status)) {
310 return FALSE;
311 }
312
313 RetVal = FALSE;
314 TempSize = 0;
315 Ptr = (UINT8 *)Buffer;
316 while (TempSize < BufferSize) {
317 TempSize += ((EFI_IFR_OP_HEADER *)Ptr)->Length;
318
319 if (((EFI_IFR_OP_HEADER *)Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {
320 Ptr += ((EFI_IFR_OP_HEADER *)Ptr)->Length;
321 continue;
322 }
323
324 ClassGuidNum = (UINT8)(((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);
325 ClassGuid = (EFI_GUID *)(VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));
326 while (ClassGuidNum-- > 0) {
327 if (!CompareGuid (Guid, ClassGuid)) {
328 ClassGuid++;
329 continue;
330 }
331
332 *PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle;
333 *HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;
334 CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *)Ptr)->Guid, sizeof (EFI_GUID));
335 RetVal = TRUE;
336 }
337 }
338
339 FreePool (Buffer);
340
341 return RetVal;
342 }
343
344 /**
345 Search the drivers in the system which need to show in the front page
346 and insert the menu to the front page.
347
348 @param HiiHandle The hii handle for the Uiapp driver.
349 @param ClassGuid The class guid for the driver which is the target.
350 @param SpecialHandlerFn The pointer to the specail handler function, if any.
351 @param StartOpCodeHandle The opcode handle to save the new opcode.
352
353 @retval EFI_SUCCESS Search the driver success
354
355 **/
356 EFI_STATUS
357 BmmListThirdPartyDrivers (
358 IN EFI_HII_HANDLE HiiHandle,
359 IN EFI_GUID *ClassGuid,
360 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,
361 IN VOID *StartOpCodeHandle
362 )
363 {
364 UINTN Index;
365 EFI_STRING String;
366 EFI_STRING_ID Token;
367 EFI_STRING_ID TokenHelp;
368 EFI_HII_HANDLE *HiiHandles;
369 CHAR16 *DevicePathStr;
370 UINTN Count;
371 UINTN CurrentSize;
372 UI_HII_DRIVER_INSTANCE *DriverListPtr;
373 EFI_STRING NewName;
374 BOOLEAN EmptyLineAfter;
375
376 if (gHiiDriverList != NULL) {
377 FreePool (gHiiDriverList);
378 }
379
380 HiiHandles = HiiGetHiiHandles (NULL);
381 ASSERT (HiiHandles != NULL);
382
383 gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE));
384 ASSERT (gHiiDriverList != NULL);
385 DriverListPtr = gHiiDriverList;
386 CurrentSize = UI_HII_DRIVER_LIST_SIZE;
387
388 for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) {
389 if (!IsRequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) {
390 continue;
391 }
392
393 String = HiiGetString (HiiHandles[Index], Token, NULL);
394 if (String == NULL) {
395 String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);
396 ASSERT (String != NULL);
397 } else if (SpecialHandlerFn != NULL) {
398 //
399 // Check whether need to rename the driver name.
400 //
401 EmptyLineAfter = FALSE;
402 if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) {
403 FreePool (String);
404 String = NewName;
405 DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter;
406 }
407 }
408
409 DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL);
410 FreePool (String);
411
412 String = HiiGetString (HiiHandles[Index], TokenHelp, NULL);
413 if (String == NULL) {
414 String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);
415 ASSERT (String != NULL);
416 }
417
418 DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL);
419 FreePool (String);
420
421 DevicePathStr = ExtractDevicePathFromHandle (HiiHandles[Index]);
422 if (DevicePathStr != NULL) {
423 DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);
424 FreePool (DevicePathStr);
425 } else {
426 DriverListPtr[Count].DevicePathId = 0;
427 }
428
429 Count++;
430 if (Count >= CurrentSize) {
431 DriverListPtr = ReallocatePool (
432 CurrentSize * sizeof (UI_HII_DRIVER_INSTANCE),
433 (Count + UI_HII_DRIVER_LIST_SIZE)
434 * sizeof (UI_HII_DRIVER_INSTANCE),
435 gHiiDriverList
436 );
437 ASSERT (DriverListPtr != NULL);
438 gHiiDriverList = DriverListPtr;
439 CurrentSize += UI_HII_DRIVER_LIST_SIZE;
440 }
441 }
442
443 FreePool (HiiHandles);
444
445 Index = 0;
446 while (gHiiDriverList[Index].PromptId != 0) {
447 HiiCreateGotoExOpCode (
448 StartOpCodeHandle,
449 0,
450 gHiiDriverList[Index].PromptId,
451 gHiiDriverList[Index].HelpId,
452 0,
453 0,
454 0,
455 &gHiiDriverList[Index].FormSetGuid,
456 gHiiDriverList[Index].DevicePathId
457 );
458
459 if (gHiiDriverList[Index].EmptyLineAfter) {
460 BmmCreateEmptyLine (HiiHandle, StartOpCodeHandle);
461 }
462
463 Index++;
464 }
465
466 return EFI_SUCCESS;
467 }