]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
Follow UEFI spec, set TimeOut and HwErrRecSupport variable by EFI variable service...
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / BootMaint / BootMaint.c
CommitLineData
5c08e117 1/** @file\r
2 The functions for Boot Maintainence Main menu.\r
3\r
e1e91b73 4Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
180a5a35 5This program and the accompanying materials\r
5c08e117 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "BootMaint.h"\r
16#include "FormGuid.h"\r
17#include "Bds.h"\r
18#include "FrontPage.h"\r
19\r
20EFI_DEVICE_PATH_PROTOCOL EndDevicePath[] = {\r
21 {\r
22 END_DEVICE_PATH_TYPE,\r
23 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
24 {\r
25 END_DEVICE_PATH_LENGTH,\r
26 0\r
27 }\r
28 }\r
29};\r
30\r
f6f910dd 31HII_VENDOR_DEVICE_PATH mBmmHiiVendorDevicePath = {\r
32 {\r
33 {\r
34 HARDWARE_DEVICE_PATH,\r
35 HW_VENDOR_DP,\r
36 {\r
37 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
38 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
39 }\r
40 },\r
e24fc103 41 BOOT_MAINT_FORMSET_GUID\r
f6f910dd 42 },\r
43 {\r
44 END_DEVICE_PATH_TYPE,\r
45 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
46 { \r
47 (UINT8) (END_DEVICE_PATH_LENGTH),\r
48 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
49 }\r
50 }\r
51};\r
52\r
53HII_VENDOR_DEVICE_PATH mFeHiiVendorDevicePath = {\r
54 {\r
55 {\r
56 HARDWARE_DEVICE_PATH,\r
57 HW_VENDOR_DP,\r
58 {\r
59 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
60 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
61 }\r
62 },\r
e24fc103 63 FILE_EXPLORE_FORMSET_GUID\r
f6f910dd 64 },\r
65 {\r
66 END_DEVICE_PATH_TYPE,\r
67 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
68 { \r
69 (UINT8) (END_DEVICE_PATH_LENGTH),\r
70 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
71 }\r
72 }\r
73};\r
5c08e117 74\r
75bf9d0e 75CHAR16 mBootMaintStorageName[] = L"BmmData";\r
5c08e117 76CHAR16 mFileExplorerStorageName[] = L"FeData";\r
77\r
78/**\r
79 Init all memu.\r
80\r
81 @param CallbackData The BMM context data.\r
82\r
83**/\r
84VOID\r
85InitAllMenu (\r
86 IN BMM_CALLBACK_DATA *CallbackData\r
87 );\r
88\r
89/**\r
90 Free up all Menu Option list.\r
91\r
92**/\r
93VOID\r
94FreeAllMenu (\r
95 VOID\r
96 );\r
97\r
98/**\r
99 Create string tokens for a menu from its help strings and display strings\r
100\r
101 @param CallbackData The BMM context data.\r
102 @param HiiHandle Hii Handle of the package to be updated.\r
103 @param MenuOption The Menu whose string tokens need to be created\r
104\r
105 @retval EFI_SUCCESS String tokens created successfully\r
106 @retval others contain some errors\r
107**/\r
108EFI_STATUS\r
109CreateMenuStringToken (\r
110 IN BMM_CALLBACK_DATA *CallbackData,\r
111 IN EFI_HII_HANDLE HiiHandle,\r
112 IN BM_MENU_OPTION *MenuOption\r
113 )\r
114{\r
115 BM_MENU_ENTRY *NewMenuEntry;\r
116 UINTN Index;\r
117\r
118 for (Index = 0; Index < MenuOption->MenuNumber; Index++) {\r
119 NewMenuEntry = BOpt_GetMenuEntry (MenuOption, Index);\r
120\r
cb7d01c0 121 NewMenuEntry->DisplayStringToken = HiiSetString (\r
122 HiiHandle,\r
123 0,\r
124 NewMenuEntry->DisplayString,\r
125 NULL\r
126 );\r
5c08e117 127\r
128 if (NULL == NewMenuEntry->HelpString) {\r
129 NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
130 } else {\r
cb7d01c0 131 NewMenuEntry->HelpStringToken = HiiSetString (\r
132 HiiHandle,\r
133 0,\r
134 NewMenuEntry->HelpString,\r
135 NULL\r
136 );\r
5c08e117 137 }\r
138 }\r
139\r
140 return EFI_SUCCESS;\r
141}\r
142\r
143/**\r
144 This function allows a caller to extract the current configuration for one\r
145 or more named elements from the target driver.\r
146\r
147\r
148 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
149 @param Request A null-terminated Unicode string in <ConfigRequest> format.\r
150 @param Progress On return, points to a character in the Request string.\r
151 Points to the string's null terminator if request was successful.\r
152 Points to the most recent '&' before the first failing name/value\r
153 pair (or the beginning of the string if the failure is in the\r
154 first name/value pair) if the request was not successful.\r
155 @param Results A null-terminated Unicode string in <ConfigAltResp> format which\r
156 has all values filled in for the names in the Request string.\r
157 String to be allocated by the called function.\r
158\r
159 @retval EFI_SUCCESS The Results is filled with the requested values.\r
160 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
161 @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.\r
162 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
163\r
164**/\r
165EFI_STATUS\r
166EFIAPI\r
167BootMaintExtractConfig (\r
168 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
169 IN CONST EFI_STRING Request,\r
170 OUT EFI_STRING *Progress,\r
171 OUT EFI_STRING *Results\r
172 )\r
173{\r
174 EFI_STATUS Status;\r
175 UINTN BufferSize;\r
176 BMM_CALLBACK_DATA *Private;\r
59aefb7e
LG
177 EFI_STRING ConfigRequestHdr;\r
178 EFI_STRING ConfigRequest;\r
179 BOOLEAN AllocatedRequest;\r
180 UINTN Size;\r
5c08e117 181\r
59aefb7e 182 if (Progress == NULL || Results == NULL) {\r
5c08e117 183 return EFI_INVALID_PARAMETER;\r
184 }\r
185\r
59aefb7e 186 *Progress = Request;\r
e24fc103 187 if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &gBootMaintFormSetGuid, mBootMaintStorageName)) {\r
59aefb7e
LG
188 return EFI_NOT_FOUND;\r
189 }\r
5c08e117 190\r
59aefb7e
LG
191 ConfigRequestHdr = NULL;\r
192 ConfigRequest = NULL;\r
193 AllocatedRequest = FALSE;\r
194 Size = 0;\r
195\r
196 Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
5c08e117 197 //\r
198 // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
199 //\r
200 BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
59aefb7e
LG
201 ConfigRequest = Request;\r
202 if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
203 //\r
204 // Request has no request element, construct full request string.\r
205 // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
206 // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
207 //\r
e24fc103 208 ConfigRequestHdr = HiiConstructConfigHdr (&gBootMaintFormSetGuid, mBootMaintStorageName, Private->BmmDriverHandle);\r
59aefb7e
LG
209 Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
210 ConfigRequest = AllocateZeroPool (Size);\r
211 ASSERT (ConfigRequest != NULL);\r
212 AllocatedRequest = TRUE;\r
213 UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
214 FreePool (ConfigRequestHdr);\r
215 }\r
216\r
5c08e117 217 Status = gHiiConfigRouting->BlockToConfig (\r
218 gHiiConfigRouting,\r
59aefb7e 219 ConfigRequest,\r
5c08e117 220 (UINT8 *) &Private->BmmFakeNvData,\r
221 BufferSize,\r
222 Results,\r
223 Progress\r
224 );\r
59aefb7e
LG
225 //\r
226 // Free the allocated config request string.\r
227 //\r
228 if (AllocatedRequest) {\r
229 FreePool (ConfigRequest);\r
230 ConfigRequest = NULL;\r
231 }\r
232 //\r
233 // Set Progress string to the original request string.\r
234 //\r
235 if (Request == NULL) {\r
236 *Progress = NULL;\r
237 } else if (StrStr (Request, L"OFFSET") == NULL) {\r
238 *Progress = Request + StrLen (Request);\r
239 }\r
240\r
5c08e117 241 return Status;\r
242}\r
243\r
244/**\r
245 This function processes the results of changes in configuration.\r
246\r
247\r
248 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
249 @param Action Specifies the type of action taken by the browser.\r
250 @param QuestionId A unique value which is sent to the original exporting driver\r
251 so that it can identify the type of data to expect.\r
252 @param Type The type of value for the question.\r
253 @param Value A pointer to the data being sent to the original exporting driver.\r
254 @param ActionRequest On return, points to the action requested by the callback function.\r
255\r
256 @retval EFI_SUCCESS The callback successfully handled the action.\r
257 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.\r
258 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
259 @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.\r
260 @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.\r
261**/\r
262EFI_STATUS\r
263EFIAPI\r
264BootMaintCallback (\r
265 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
266 IN EFI_BROWSER_ACTION Action,\r
267 IN EFI_QUESTION_ID QuestionId,\r
268 IN UINT8 Type,\r
269 IN EFI_IFR_TYPE_VALUE *Value,\r
270 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
271 )\r
272{\r
273 BMM_CALLBACK_DATA *Private;\r
274 BM_MENU_ENTRY *NewMenuEntry;\r
275 BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
276 EFI_STATUS Status;\r
277 UINTN OldValue;\r
278 UINTN NewValue;\r
279 UINTN Number;\r
280 UINTN Pos;\r
281 UINTN Bit;\r
282 UINT16 NewValuePos;\r
98ba35a4 283 UINT16 Index3; \r
5c08e117 284 UINT16 Index2;\r
285 UINT16 Index;\r
286 UINT8 *OldLegacyDev;\r
287 UINT8 *NewLegacyDev;\r
288 UINT8 *DisMap;\r
d88f86f1 289\r
84724077
ED
290 if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) { \r
291 //\r
292 // All other action return unsupported.\r
293 //\r
294 return EFI_UNSUPPORTED;\r
295 }\r
296 \r
297 Status = EFI_SUCCESS;\r
298 OldValue = 0;\r
299 NewValue = 0;\r
300 Number = 0;\r
301 OldLegacyDev = NULL;\r
302 NewLegacyDev = NULL;\r
303 NewValuePos = 0;\r
304 DisMap = NULL;\r
305\r
306 Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
307 //\r
308 // Retrive uncommitted data from Form Browser\r
309 //\r
310 CurrentFakeNVMap = &Private->BmmFakeNvData;\r
311 HiiGetBrowserData (&gBootMaintFormSetGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap);\r
d88f86f1 312 if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
84724077 313 if (Value == NULL) {\r
d88f86f1
ED
314 return EFI_INVALID_PARAMETER;\r
315 }\r
84724077 316 \r
d88f86f1
ED
317 UpdatePageId (Private, QuestionId);\r
318\r
d88f86f1
ED
319 //\r
320 // need to be subtituded.\r
321 //\r
322 // Update Select FD/HD/CD/NET/BEV Order Form\r
323 //\r
98ba35a4 324 if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {\r
d88f86f1
ED
325\r
326 DisMap = Private->BmmOldFakeNVData.DisableMap;\r
327\r
98ba35a4 328 if (QuestionId >= LEGACY_FD_QUESTION_ID && QuestionId < LEGACY_FD_QUESTION_ID + MAX_MENU_NUMBER) {\r
d88f86f1
ED
329 Number = (UINT16) LegacyFDMenu.MenuNumber;\r
330 OldLegacyDev = Private->BmmOldFakeNVData.LegacyFD;\r
331 NewLegacyDev = CurrentFakeNVMap->LegacyFD;\r
98ba35a4 332 } else if (QuestionId >= LEGACY_HD_QUESTION_ID && QuestionId < LEGACY_HD_QUESTION_ID + MAX_MENU_NUMBER) {\r
d88f86f1
ED
333 Number = (UINT16) LegacyHDMenu.MenuNumber;\r
334 OldLegacyDev = Private->BmmOldFakeNVData.LegacyHD;\r
335 NewLegacyDev = CurrentFakeNVMap->LegacyHD;\r
98ba35a4 336 } else if (QuestionId >= LEGACY_CD_QUESTION_ID && QuestionId < LEGACY_CD_QUESTION_ID + MAX_MENU_NUMBER) {\r
d88f86f1
ED
337 Number = (UINT16) LegacyCDMenu.MenuNumber;\r
338 OldLegacyDev = Private->BmmOldFakeNVData.LegacyCD;\r
339 NewLegacyDev = CurrentFakeNVMap->LegacyCD;\r
98ba35a4 340 } else if (QuestionId >= LEGACY_NET_QUESTION_ID && QuestionId < LEGACY_NET_QUESTION_ID + MAX_MENU_NUMBER) {\r
d88f86f1
ED
341 Number = (UINT16) LegacyNETMenu.MenuNumber;\r
342 OldLegacyDev = Private->BmmOldFakeNVData.LegacyNET;\r
343 NewLegacyDev = CurrentFakeNVMap->LegacyNET;\r
98ba35a4 344 } else if (QuestionId >= LEGACY_BEV_QUESTION_ID && QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER) {\r
d88f86f1
ED
345 Number = (UINT16) LegacyBEVMenu.MenuNumber;\r
346 OldLegacyDev = Private->BmmOldFakeNVData.LegacyBEV;\r
347 NewLegacyDev = CurrentFakeNVMap->LegacyBEV;\r
d88f86f1 348 }\r
5c08e117 349 //\r
d88f86f1
ED
350 // First, find the different position\r
351 // if there is change, it should be only one\r
5c08e117 352 //\r
d88f86f1
ED
353 for (Index = 0; Index < Number; Index++) {\r
354 if (OldLegacyDev[Index] != NewLegacyDev[Index]) {\r
355 OldValue = OldLegacyDev[Index];\r
356 NewValue = NewLegacyDev[Index];\r
357 break;\r
358 }\r
359 }\r
360\r
361 if (Index != Number) {\r
5c08e117 362 //\r
d88f86f1 363 // there is change, now process\r
5c08e117 364 //\r
d88f86f1
ED
365 if (0xFF == NewValue) {\r
366 //\r
367 // This item will be disable\r
368 // Just move the items behind this forward to overlap it\r
369 //\r
370 Pos = OldValue / 8;\r
371 Bit = 7 - (OldValue % 8);\r
372 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
373 for (Index2 = Index; Index2 < Number - 1; Index2++) {\r
374 NewLegacyDev[Index2] = NewLegacyDev[Index2 + 1];\r
375 }\r
5c08e117 376\r
d88f86f1
ED
377 NewLegacyDev[Index2] = 0xFF;\r
378 } else {\r
379 for (Index2 = 0; Index2 < Number; Index2++) {\r
380 if (Index2 == Index) {\r
381 continue;\r
382 }\r
383\r
384 if (OldLegacyDev[Index2] == NewValue) {\r
385 //\r
386 // If NewValue is in OldLegacyDev array\r
387 // remember its old position\r
388 //\r
389 NewValuePos = Index2;\r
390 break;\r
391 }\r
5c08e117 392 }\r
393\r
d88f86f1 394 if (Index2 != Number) {\r
5c08e117 395 //\r
d88f86f1
ED
396 // We will change current item to an existing item\r
397 // (It's hard to describe here, please read code, it's like a cycle-moving)\r
5c08e117 398 //\r
d88f86f1
ED
399 for (Index2 = NewValuePos; Index2 != Index;) {\r
400 if (NewValuePos < Index) {\r
401 NewLegacyDev[Index2] = OldLegacyDev[Index2 + 1];\r
402 Index2++;\r
403 } else {\r
404 NewLegacyDev[Index2] = OldLegacyDev[Index2 - 1];\r
405 Index2--;\r
406 }\r
5c08e117 407 }\r
d88f86f1 408 } else {\r
5c08e117 409 //\r
d88f86f1
ED
410 // If NewValue is not in OldlegacyDev array, we are changing to a disabled item\r
411 // so we should modify DisMap to reflect the change\r
5c08e117 412 //\r
d88f86f1
ED
413 Pos = NewValue / 8;\r
414 Bit = 7 - (NewValue % 8);\r
415 DisMap[Pos] = (UINT8) (DisMap[Pos] & (~ (UINT8) (1 << Bit)));\r
416 if (0xFF != OldValue) {\r
417 //\r
418 // Because NewValue is a item that was disabled before\r
419 // so after changing the OldValue should be disabled\r
420 // actually we are doing a swap of enable-disable states of two items\r
421 //\r
422 Pos = OldValue / 8;\r
423 Bit = 7 - (OldValue % 8);\r
424 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
425 }\r
5c08e117 426 }\r
427 }\r
d88f86f1
ED
428 //\r
429 // To prevent DISABLE appears in the middle of the list\r
430 // we should perform a re-ordering\r
431 //\r
98ba35a4 432 Index3 = Index;\r
d88f86f1
ED
433 Index = 0;\r
434 while (Index < Number) {\r
435 if (0xFF != NewLegacyDev[Index]) {\r
436 Index++;\r
437 continue;\r
5c08e117 438 }\r
439\r
d88f86f1 440 Index2 = Index;\r
5c08e117 441 Index2++;\r
d88f86f1
ED
442 while (Index2 < Number) {\r
443 if (0xFF != NewLegacyDev[Index2]) {\r
444 break;\r
445 }\r
5c08e117 446\r
d88f86f1
ED
447 Index2++;\r
448 }\r
449\r
450 if (Index2 < Number) {\r
451 NewLegacyDev[Index] = NewLegacyDev[Index2];\r
452 NewLegacyDev[Index2] = 0xFF;\r
453 }\r
454\r
455 Index++;\r
5c08e117 456 }\r
457\r
d88f86f1
ED
458 CopyMem (\r
459 OldLegacyDev,\r
460 NewLegacyDev,\r
461 Number\r
462 );\r
98ba35a4
ED
463\r
464 //\r
465 // Return correct question value.\r
466 //\r
467 Value->u8 = NewLegacyDev[Index3];\r
5c08e117 468 }\r
5c08e117 469 }\r
5c08e117 470\r
d88f86f1
ED
471 if (QuestionId < FILE_OPTION_OFFSET) {\r
472 if (QuestionId < CONFIG_OPTION_OFFSET) {\r
473 switch (QuestionId) {\r
474 case KEY_VALUE_BOOT_FROM_FILE:\r
475 Private->FeCurrentState = FileExplorerStateBootFromFile;\r
d88f86f1 476 break;\r
5c08e117 477\r
d88f86f1
ED
478 case FORM_BOOT_ADD_ID:\r
479 Private->FeCurrentState = FileExplorerStateAddBootOption;\r
d88f86f1 480 break;\r
5c08e117 481\r
d88f86f1
ED
482 case FORM_DRV_ADD_FILE_ID:\r
483 Private->FeCurrentState = FileExplorerStateAddDriverOptionState;\r
d88f86f1
ED
484 break;\r
485\r
486 case FORM_DRV_ADD_HANDLE_ID:\r
487 CleanUpPage (FORM_DRV_ADD_HANDLE_ID, Private);\r
488 UpdateDrvAddHandlePage (Private);\r
489 break;\r
490\r
491 case FORM_BOOT_DEL_ID:\r
492 CleanUpPage (FORM_BOOT_DEL_ID, Private);\r
493 UpdateBootDelPage (Private);\r
494 break;\r
495\r
496 case FORM_BOOT_CHG_ID:\r
497 case FORM_DRV_CHG_ID:\r
498 UpdatePageBody (QuestionId, Private);\r
499 break;\r
500\r
501 case FORM_DRV_DEL_ID:\r
502 CleanUpPage (FORM_DRV_DEL_ID, Private);\r
503 UpdateDrvDelPage (Private);\r
504 break;\r
505\r
506 case FORM_BOOT_NEXT_ID:\r
507 CleanUpPage (FORM_BOOT_NEXT_ID, Private);\r
508 UpdateBootNextPage (Private);\r
509 break;\r
510\r
511 case FORM_TIME_OUT_ID:\r
512 CleanUpPage (FORM_TIME_OUT_ID, Private);\r
513 UpdateTimeOutPage (Private);\r
514 break;\r
515\r
d88f86f1
ED
516 case FORM_CON_IN_ID:\r
517 case FORM_CON_OUT_ID:\r
518 case FORM_CON_ERR_ID:\r
519 UpdatePageBody (QuestionId, Private);\r
520 break;\r
521\r
522 case FORM_CON_MODE_ID:\r
523 CleanUpPage (FORM_CON_MODE_ID, Private);\r
524 UpdateConModePage (Private);\r
525 break;\r
526\r
527 case FORM_CON_COM_ID:\r
528 CleanUpPage (FORM_CON_COM_ID, Private);\r
529 UpdateConCOMPage (Private);\r
530 break;\r
531\r
532 case FORM_SET_FD_ORDER_ID:\r
533 case FORM_SET_HD_ORDER_ID:\r
534 case FORM_SET_CD_ORDER_ID:\r
535 case FORM_SET_NET_ORDER_ID:\r
536 case FORM_SET_BEV_ORDER_ID:\r
537 CleanUpPage (QuestionId, Private);\r
538 UpdateSetLegacyDeviceOrderPage (QuestionId, Private);\r
539 break;\r
540\r
d88f86f1
ED
541 default:\r
542 break;\r
543 }\r
544 } else if ((QuestionId >= TERMINAL_OPTION_OFFSET) && (QuestionId < CONSOLE_OPTION_OFFSET)) {\r
545 Index2 = (UINT16) (QuestionId - TERMINAL_OPTION_OFFSET);\r
546 Private->CurrentTerminal = Index2;\r
5c08e117 547\r
d88f86f1
ED
548 CleanUpPage (FORM_CON_COM_SETUP_ID, Private);\r
549 UpdateTerminalPage (Private);\r
5c08e117 550\r
d88f86f1
ED
551 } else if (QuestionId >= HANDLE_OPTION_OFFSET) {\r
552 Index2 = (UINT16) (QuestionId - HANDLE_OPTION_OFFSET);\r
5c08e117 553\r
d88f86f1
ED
554 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index2);\r
555 ASSERT (NewMenuEntry != NULL);\r
556 Private->HandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
5c08e117 557\r
d88f86f1 558 CleanUpPage (FORM_DRV_ADD_HANDLE_DESC_ID, Private);\r
5c08e117 559\r
d88f86f1
ED
560 Private->MenuEntry = NewMenuEntry;\r
561 Private->LoadContext->FilePathList = Private->HandleContext->DevicePath;\r
5c08e117 562\r
d88f86f1
ED
563 UpdateDriverAddHandleDescPage (Private);\r
564 }\r
5c08e117 565 }\r
84724077
ED
566 } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
567 if ((Value == NULL) || (ActionRequest == NULL)) {\r
568 return EFI_INVALID_PARAMETER;\r
569 }\r
570 \r
571 switch (QuestionId) {\r
572 case KEY_VALUE_SAVE_AND_EXIT:\r
573 case KEY_VALUE_NO_SAVE_AND_EXIT:\r
574 if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
575 Status = ApplyChangeHandler (Private, CurrentFakeNVMap, Private->BmmPreviousPageId);\r
576 if (EFI_ERROR (Status)) {\r
577 return Status;\r
578 }\r
579 } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
580 DiscardChangeHandler (Private, CurrentFakeNVMap);\r
581 }\r
d88f86f1 582\r
84724077
ED
583 //\r
584 // Tell browser not to ask for confirmation of changes,\r
585 // since we have already applied or discarded.\r
586 //\r
587 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
588 break; \r
589\r
590 case FORM_RESET:\r
591 gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
592 return EFI_UNSUPPORTED;\r
593\r
594 default:\r
595 break;\r
596 }\r
5c08e117 597 }\r
598\r
599 //\r
84724077 600 // Pass changed uncommitted data back to Form Browser\r
5c08e117 601 //\r
84724077
ED
602 HiiSetBrowserData (&gBootMaintFormSetGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap, NULL);\r
603 return EFI_SUCCESS;\r
5c08e117 604}\r
605\r
606/**\r
607 Function handling request to apply changes for BMM pages.\r
608\r
609 @param Private Pointer to callback data buffer.\r
610 @param CurrentFakeNVMap Pointer to buffer holding data of various values used by BMM\r
611 @param FormId ID of the form which has sent the request to apply change.\r
612\r
613 @retval EFI_SUCCESS Change successfully applied.\r
614 @retval Other Error occurs while trying to apply changes.\r
615\r
616**/\r
617EFI_STATUS\r
618ApplyChangeHandler (\r
619 IN BMM_CALLBACK_DATA *Private,\r
620 IN BMM_FAKE_NV_DATA *CurrentFakeNVMap,\r
621 IN EFI_FORM_ID FormId\r
622 )\r
623{\r
624 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
625 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
626 BM_LOAD_CONTEXT *NewLoadContext;\r
627 BM_MENU_ENTRY *NewMenuEntry;\r
628 EFI_STATUS Status;\r
629 UINT16 Index;\r
630\r
631 Status = EFI_SUCCESS;\r
632\r
633 switch (FormId) {\r
634 case FORM_SET_FD_ORDER_ID:\r
635 case FORM_SET_HD_ORDER_ID:\r
636 case FORM_SET_CD_ORDER_ID:\r
637 case FORM_SET_NET_ORDER_ID:\r
638 case FORM_SET_BEV_ORDER_ID:\r
639 Var_UpdateBBSOption (Private);\r
640 break;\r
641\r
642 case FORM_BOOT_DEL_ID:\r
bd828c8e 643 for (Index = 0; \r
b452ca89 644 ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0])))); \r
bd828c8e 645 Index ++) {\r
5c08e117 646 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
647 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
b452ca89 648 NewLoadContext->Deleted = CurrentFakeNVMap->OptionDel[Index];\r
5c08e117 649 }\r
650\r
651 Var_DelBootOption ();\r
652 break;\r
653\r
654 case FORM_DRV_DEL_ID:\r
bd828c8e 655 for (Index = 0; \r
b452ca89 656 ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0])))); \r
bd828c8e 657 Index++) {\r
5c08e117 658 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
659 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
b452ca89 660 NewLoadContext->Deleted = CurrentFakeNVMap->OptionDel[Index];\r
5c08e117 661 }\r
662\r
663 Var_DelDriverOption ();\r
664 break;\r
665\r
666 case FORM_BOOT_CHG_ID:\r
667 Status = Var_UpdateBootOrder (Private);\r
668 break;\r
669\r
670 case FORM_DRV_CHG_ID:\r
671 Status = Var_UpdateDriverOrder (Private);\r
672 break;\r
673\r
674 case FORM_TIME_OUT_ID:\r
e1e91b73
SZ
675 Status = gRT->SetVariable (\r
676 L"Timeout",\r
677 &gEfiGlobalVariableGuid,\r
678 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
679 sizeof (UINT16),\r
680 &(CurrentFakeNVMap->BootTimeOut)\r
681 );\r
682 ASSERT_EFI_ERROR(Status);\r
5c08e117 683\r
684 Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;\r
685 break;\r
686\r
687 case FORM_BOOT_NEXT_ID:\r
688 Status = Var_UpdateBootNext (Private);\r
689 break;\r
690\r
691 case FORM_CON_MODE_ID:\r
692 Status = Var_UpdateConMode (Private);\r
693 break;\r
694\r
695 case FORM_CON_COM_SETUP_ID:\r
696 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal);\r
697\r
698 ASSERT (NewMenuEntry != NULL);\r
699\r
700 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
701\r
702 NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate;\r
703 ASSERT (CurrentFakeNVMap->COMBaudRate < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
704 NewTerminalContext->BaudRate = BaudRateList[CurrentFakeNVMap->COMBaudRate].Value;\r
705 NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate;\r
706 ASSERT (CurrentFakeNVMap->COMDataRate < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
707 NewTerminalContext->DataBits = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate].Value;\r
708 NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits;\r
709 ASSERT (CurrentFakeNVMap->COMStopBits < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
710 NewTerminalContext->StopBits = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits].Value;\r
711 NewTerminalContext->ParityIndex = CurrentFakeNVMap->COMParity;\r
712 ASSERT (CurrentFakeNVMap->COMParity < (sizeof (ParityList) / sizeof (ParityList[0])));\r
713 NewTerminalContext->Parity = (UINT8) ParityList[CurrentFakeNVMap->COMParity].Value;\r
714 NewTerminalContext->TerminalType = CurrentFakeNVMap->COMTerminalType;\r
8e491a81 715 NewTerminalContext->FlowControl = CurrentFakeNVMap->COMFlowControl;\r
5c08e117 716\r
717 ChangeTerminalDevicePath (\r
8e491a81 718 &(NewTerminalContext->DevicePath),\r
5c08e117 719 FALSE\r
720 );\r
721\r
722 Var_UpdateConsoleInpOption ();\r
723 Var_UpdateConsoleOutOption ();\r
724 Var_UpdateErrorOutOption ();\r
725 break;\r
726\r
727 case FORM_CON_IN_ID:\r
b7b0dca2 728 for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) {\r
5c08e117 729 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
730 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
b452ca89 731 ASSERT (Index < MAX_MENU_NUMBER);\r
5c08e117 732 NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
733 }\r
734\r
b7b0dca2 735 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
5c08e117 736 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
737 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
b452ca89 738 ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
5c08e117 739 NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleInpMenu.MenuNumber];\r
740 }\r
741\r
742 Var_UpdateConsoleInpOption ();\r
743 break;\r
744\r
745 case FORM_CON_OUT_ID:\r
b7b0dca2 746 for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) {\r
5c08e117 747 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
748 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
b452ca89 749 ASSERT (Index < MAX_MENU_NUMBER);\r
5c08e117 750 NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
751 }\r
752\r
b7b0dca2 753 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
5c08e117 754 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
755 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
b452ca89 756 ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
5c08e117 757 NewTerminalContext->IsConOut = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleOutMenu.MenuNumber];\r
758 }\r
759\r
760 Var_UpdateConsoleOutOption ();\r
761 break;\r
762\r
763 case FORM_CON_ERR_ID:\r
b7b0dca2 764 for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) {\r
5c08e117 765 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
766 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
b452ca89 767 ASSERT (Index < MAX_MENU_NUMBER);\r
5c08e117 768 NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
769 }\r
770\r
b7b0dca2 771 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
5c08e117 772 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
773 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
b452ca89 774 ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
5c08e117 775 NewTerminalContext->IsStdErr = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleErrMenu.MenuNumber];\r
776 }\r
777\r
778 Var_UpdateErrorOutOption ();\r
779 break;\r
780\r
781 case FORM_DRV_ADD_HANDLE_DESC_ID:\r
782 Status = Var_UpdateDriverOption (\r
783 Private,\r
784 Private->BmmHiiHandle,\r
785 CurrentFakeNVMap->DriverAddHandleDesc,\r
786 CurrentFakeNVMap->DriverAddHandleOptionalData,\r
787 CurrentFakeNVMap->DriverAddForceReconnect\r
788 );\r
789 if (EFI_ERROR (Status)) {\r
790 goto Error;\r
791 }\r
792\r
793 BOpt_GetDriverOptions (Private);\r
794 CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);\r
795 break;\r
796\r
797 default:\r
798 break;\r
799 }\r
800\r
801Error:\r
802 return Status;\r
803}\r
804\r
805/**\r
806 Discard all changes done to the BMM pages such as Boot Order change,\r
807 Driver order change.\r
808\r
809 @param Private The BMM context data.\r
810 @param CurrentFakeNVMap The current Fack NV Map.\r
811\r
812**/\r
813VOID\r
814DiscardChangeHandler (\r
815 IN BMM_CALLBACK_DATA *Private,\r
816 IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
817 )\r
818{\r
819 UINT16 Index;\r
820\r
821 switch (Private->BmmPreviousPageId) {\r
822 case FORM_BOOT_CHG_ID:\r
823 case FORM_DRV_CHG_ID:\r
b452ca89 824 CopyMem (CurrentFakeNVMap->OptionOrder, Private->BmmOldFakeNVData.OptionOrder, sizeof (CurrentFakeNVMap->OptionOrder));\r
5c08e117 825 break;\r
826\r
827 case FORM_BOOT_DEL_ID:\r
b452ca89 828 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0])));\r
5c08e117 829 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
b452ca89 830 CurrentFakeNVMap->OptionDel[Index] = FALSE;\r
5c08e117 831 }\r
832 break;\r
833\r
834 case FORM_DRV_DEL_ID:\r
b452ca89 835 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0])));\r
5c08e117 836 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
b452ca89 837 CurrentFakeNVMap->OptionDel[Index] = FALSE;\r
5c08e117 838 }\r
839 break;\r
840\r
841 case FORM_BOOT_NEXT_ID:\r
842 CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;\r
843 break;\r
844\r
845 case FORM_TIME_OUT_ID:\r
846 CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;\r
847 break;\r
848\r
849 case FORM_DRV_ADD_HANDLE_DESC_ID:\r
850 case FORM_DRV_ADD_FILE_ID:\r
851 case FORM_DRV_ADD_HANDLE_ID:\r
852 CurrentFakeNVMap->DriverAddHandleDesc[0] = 0x0000;\r
853 CurrentFakeNVMap->DriverAddHandleOptionalData[0] = 0x0000;\r
854 break;\r
855\r
856 default:\r
857 break;\r
858 }\r
859}\r
860\r
861/**\r
862 Initialize the Boot Maintenance Utitliy.\r
863\r
864\r
865 @retval EFI_SUCCESS utility ended successfully\r
866 @retval others contain some errors\r
867\r
868**/\r
869EFI_STATUS\r
870InitializeBM (\r
871 VOID\r
872 )\r
873{\r
874 EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
5c08e117 875 BMM_CALLBACK_DATA *BmmCallbackInfo;\r
876 EFI_STATUS Status;\r
877 UINT8 *Ptr;\r
878\r
879 Status = EFI_SUCCESS;\r
880\r
881 //\r
882 // Create CallbackData structures for Driver Callback\r
883 //\r
884 BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA));\r
885 if (BmmCallbackInfo == NULL) {\r
886 return EFI_OUT_OF_RESOURCES;\r
887 }\r
888\r
889 //\r
890 // Create LoadOption in BmmCallbackInfo for Driver Callback\r
891 //\r
892 Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
893 if (Ptr == NULL) {\r
894 FreePool (BmmCallbackInfo);\r
895 return EFI_OUT_OF_RESOURCES;\r
896 }\r
897\r
898 //\r
899 // Initialize Bmm callback data.\r
900 //\r
901 BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
902 Ptr += sizeof (BM_LOAD_CONTEXT);\r
903\r
904 BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
905 Ptr += sizeof (BM_FILE_CONTEXT);\r
906\r
907 BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
908 Ptr += sizeof (BM_HANDLE_CONTEXT);\r
909\r
910 BmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr;\r
911\r
912 BmmCallbackInfo->Signature = BMM_CALLBACK_DATA_SIGNATURE;\r
913 BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig;\r
914 BmmCallbackInfo->BmmConfigAccess.RouteConfig = FakeRouteConfig;\r
915 BmmCallbackInfo->BmmConfigAccess.Callback = BootMaintCallback;\r
916 BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID;\r
917 BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID;\r
918 BmmCallbackInfo->FeConfigAccess.ExtractConfig = FakeExtractConfig;\r
919 BmmCallbackInfo->FeConfigAccess.RouteConfig = FakeRouteConfig;\r
920 BmmCallbackInfo->FeConfigAccess.Callback = FileExplorerCallback;\r
13078b3f 921 BmmCallbackInfo->FeCurrentState = FileExplorerStateInActive;\r
922 BmmCallbackInfo->FeDisplayContext = FileExplorerDisplayUnknown;\r
5c08e117 923\r
924 //\r
f6f910dd 925 // Install Device Path Protocol and Config Access protocol to driver handle\r
5c08e117 926 //\r
f6f910dd 927 Status = gBS->InstallMultipleProtocolInterfaces (\r
5c08e117 928 &BmmCallbackInfo->BmmDriverHandle,\r
f6f910dd 929 &gEfiDevicePathProtocolGuid,\r
930 &mBmmHiiVendorDevicePath,\r
5c08e117 931 &gEfiHiiConfigAccessProtocolGuid,\r
f6f910dd 932 &BmmCallbackInfo->BmmConfigAccess,\r
933 NULL\r
5c08e117 934 );\r
935 if (EFI_ERROR (Status)) {\r
4376a6f2 936 goto Exit;\r
5c08e117 937 }\r
938\r
939 //\r
f6f910dd 940 // Install Device Path Protocol and Config Access protocol to driver handle\r
5c08e117 941 //\r
f6f910dd 942 Status = gBS->InstallMultipleProtocolInterfaces (\r
5c08e117 943 &BmmCallbackInfo->FeDriverHandle,\r
f6f910dd 944 &gEfiDevicePathProtocolGuid,\r
945 &mFeHiiVendorDevicePath,\r
5c08e117 946 &gEfiHiiConfigAccessProtocolGuid,\r
f6f910dd 947 &BmmCallbackInfo->FeConfigAccess,\r
948 NULL\r
5c08e117 949 );\r
950 if (EFI_ERROR (Status)) {\r
4376a6f2 951 goto Exit;\r
5c08e117 952 }\r
953\r
954 //\r
baf46e70 955 // Post our Boot Maint VFR binary to the HII database.\r
5c08e117 956 //\r
cb7d01c0 957 BmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
e24fc103 958 &gBootMaintFormSetGuid,\r
cb7d01c0 959 BmmCallbackInfo->BmmDriverHandle,\r
960 BmBin,\r
961 BdsDxeStrings,\r
962 NULL\r
963 );\r
964 ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL);\r
5c08e117 965\r
966 //\r
967 // Post our File Explorer VFR binary to the HII database.\r
968 //\r
cb7d01c0 969 BmmCallbackInfo->FeHiiHandle = HiiAddPackages (\r
e24fc103 970 &gFileExploreFormSetGuid,\r
cb7d01c0 971 BmmCallbackInfo->FeDriverHandle,\r
972 FEBin,\r
973 BdsDxeStrings,\r
974 NULL\r
975 );\r
976 ASSERT (BmmCallbackInfo->FeHiiHandle != NULL);\r
5c08e117 977\r
978 //\r
75bf9d0e 979 // Init OpCode Handle and Allocate space for creation of Buffer\r
5c08e117 980 //\r
75bf9d0e
LG
981 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
982 if (mStartOpCodeHandle == NULL) {\r
4376a6f2 983 Status = EFI_OUT_OF_RESOURCES;\r
984 goto Exit;\r
5c08e117 985 }\r
986\r
75bf9d0e
LG
987 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
988 if (mEndOpCodeHandle == NULL) {\r
989 Status = EFI_OUT_OF_RESOURCES;\r
990 goto Exit;\r
991 }\r
992\r
993 //\r
994 // Create Hii Extend Label OpCode as the start opcode\r
995 //\r
996 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
997 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
998\r
999 //\r
1000 // Create Hii Extend Label OpCode as the end opcode\r
1001 //\r
1002 mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
1003 mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
1004 mEndLabel->Number = LABEL_END;\r
1005\r
5c08e117 1006 InitializeStringDepository ();\r
1007\r
1008 InitAllMenu (BmmCallbackInfo);\r
1009\r
1010 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleInpMenu);\r
1011 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleOutMenu);\r
1012 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleErrMenu);\r
1013 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &BootOptionMenu);\r
1014 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverOptionMenu);\r
1015 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &TerminalMenu);\r
1016 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverMenu);\r
1017\r
1018 UpdateBootDelPage (BmmCallbackInfo);\r
1019 UpdateDrvDelPage (BmmCallbackInfo);\r
1020\r
1021 if (TerminalMenu.MenuNumber > 0) {\r
1022 BmmCallbackInfo->CurrentTerminal = 0;\r
1023 UpdateTerminalPage (BmmCallbackInfo);\r
1024 }\r
1025\r
16e5944a 1026 Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios);\r
5c08e117 1027 if (!EFI_ERROR (Status)) {\r
1028 RefreshUpdateData ();\r
75bf9d0e 1029 mStartLabel->Number = FORM_BOOT_LEGACY_DEVICE_ID;\r
5c08e117 1030\r
1031 //\r
1032 // If LegacyBios Protocol is installed, add 3 tags about legacy boot option\r
1033 // in BootOption form: legacy FD/HD/CD/NET/BEV\r
1034 //\r
75bf9d0e
LG
1035 HiiCreateGotoOpCode (\r
1036 mStartOpCodeHandle,\r
5c08e117 1037 FORM_SET_FD_ORDER_ID,\r
1038 STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
1039 STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
1040 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1041 FORM_SET_FD_ORDER_ID\r
5c08e117 1042 );\r
1043\r
75bf9d0e
LG
1044 HiiCreateGotoOpCode (\r
1045 mStartOpCodeHandle,\r
5c08e117 1046 FORM_SET_HD_ORDER_ID,\r
1047 STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
1048 STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
1049 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1050 FORM_SET_HD_ORDER_ID\r
5c08e117 1051 );\r
1052\r
75bf9d0e
LG
1053 HiiCreateGotoOpCode (\r
1054 mStartOpCodeHandle,\r
5c08e117 1055 FORM_SET_CD_ORDER_ID,\r
1056 STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
1057 STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
1058 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1059 FORM_SET_CD_ORDER_ID\r
5c08e117 1060 );\r
1061\r
75bf9d0e
LG
1062 HiiCreateGotoOpCode (\r
1063 mStartOpCodeHandle,\r
5c08e117 1064 FORM_SET_NET_ORDER_ID,\r
1065 STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
1066 STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
1067 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1068 FORM_SET_NET_ORDER_ID\r
5c08e117 1069 );\r
1070\r
75bf9d0e
LG
1071 HiiCreateGotoOpCode (\r
1072 mStartOpCodeHandle,\r
5c08e117 1073 FORM_SET_BEV_ORDER_ID,\r
1074 STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
1075 STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
1076 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1077 FORM_SET_BEV_ORDER_ID\r
5c08e117 1078 );\r
75bf9d0e
LG
1079 \r
1080 HiiUpdateForm (\r
5c08e117 1081 BmmCallbackInfo->BmmHiiHandle,\r
e24fc103 1082 &gBootMaintFormSetGuid,\r
3cdcfa85 1083 FORM_BOOT_SETUP_ID,\r
75bf9d0e
LG
1084 mStartOpCodeHandle, // Label FORM_BOOT_LEGACY_DEVICE_ID\r
1085 mEndOpCodeHandle // LABEL_END\r
5c08e117 1086 );\r
1087 }\r
1088\r
1089 //\r
1090 // Dispatch BMM main formset and File Explorer formset.\r
1091 //\r
1092 FormSetDispatcher (BmmCallbackInfo);\r
1093\r
1094 //\r
1095 // Remove our IFR data from HII database\r
1096 //\r
cb7d01c0 1097 HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle);\r
1098 HiiRemovePackages (BmmCallbackInfo->FeHiiHandle);\r
5c08e117 1099\r
1100 CleanUpStringDepository ();\r
1101\r
1102 FreeAllMenu ();\r
1103\r
4376a6f2 1104Exit:\r
75bf9d0e
LG
1105 if (mStartOpCodeHandle != NULL) {\r
1106 HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
1107 }\r
1108\r
1109 if (mEndOpCodeHandle != NULL) {\r
1110 HiiFreeOpCodeHandle (mEndOpCodeHandle);\r
1111 }\r
1112\r
4376a6f2 1113 if (BmmCallbackInfo->FeDriverHandle != NULL) {\r
1114 gBS->UninstallMultipleProtocolInterfaces (\r
1115 BmmCallbackInfo->FeDriverHandle,\r
1116 &gEfiDevicePathProtocolGuid,\r
1117 &mFeHiiVendorDevicePath,\r
1118 &gEfiHiiConfigAccessProtocolGuid,\r
1119 &BmmCallbackInfo->FeConfigAccess,\r
1120 NULL\r
1121 );\r
1122 }\r
1123\r
1124 if (BmmCallbackInfo->BmmDriverHandle != NULL) {\r
1125 gBS->UninstallMultipleProtocolInterfaces (\r
1126 BmmCallbackInfo->BmmDriverHandle,\r
1127 &gEfiDevicePathProtocolGuid,\r
1128 &mBmmHiiVendorDevicePath,\r
1129 &gEfiHiiConfigAccessProtocolGuid,\r
1130 &BmmCallbackInfo->BmmConfigAccess,\r
1131 NULL\r
1132 );\r
1133 }\r
1134\r
1135 FreePool (BmmCallbackInfo->LoadContext);\r
1136 FreePool (BmmCallbackInfo);\r
1137\r
5c08e117 1138 return Status;\r
1139}\r
1140\r
1141/**\r
1142 Initialized all Menu Option List.\r
1143\r
1144 @param CallbackData The BMM context data.\r
1145\r
1146**/\r
1147VOID\r
1148InitAllMenu (\r
1149 IN BMM_CALLBACK_DATA *CallbackData\r
1150 )\r
1151{\r
1152 InitializeListHead (&BootOptionMenu.Head);\r
1153 InitializeListHead (&DriverOptionMenu.Head);\r
1154 BOpt_GetBootOptions (CallbackData);\r
1155 BOpt_GetDriverOptions (CallbackData);\r
1156 BOpt_GetLegacyOptions ();\r
1157 InitializeListHead (&FsOptionMenu.Head);\r
1158 BOpt_FindDrivers ();\r
1159 InitializeListHead (&DirectoryMenu.Head);\r
1160 InitializeListHead (&ConsoleInpMenu.Head);\r
1161 InitializeListHead (&ConsoleOutMenu.Head);\r
1162 InitializeListHead (&ConsoleErrMenu.Head);\r
1163 InitializeListHead (&TerminalMenu.Head);\r
1164 LocateSerialIo ();\r
1165 GetAllConsoles ();\r
1166}\r
1167\r
1168/**\r
1169 Free up all Menu Option list.\r
1170\r
1171**/\r
1172VOID\r
1173FreeAllMenu (\r
1174 VOID\r
1175 )\r
1176{\r
1177 BOpt_FreeMenu (&DirectoryMenu);\r
1178 BOpt_FreeMenu (&FsOptionMenu);\r
1179 BOpt_FreeMenu (&BootOptionMenu);\r
1180 BOpt_FreeMenu (&DriverOptionMenu);\r
1181 BOpt_FreeMenu (&DriverMenu);\r
1182 BOpt_FreeLegacyOptions ();\r
1183 FreeAllConsoles ();\r
1184}\r
1185\r
1186/**\r
baf46e70 1187 Initialize all the string depositories.\r
5c08e117 1188\r
1189**/\r
1190VOID\r
1191InitializeStringDepository (\r
1192 VOID\r
1193 )\r
1194{\r
1195 STRING_DEPOSITORY *StringDepository;\r
1196 StringDepository = AllocateZeroPool (sizeof (STRING_DEPOSITORY) * STRING_DEPOSITORY_NUMBER);\r
1197 FileOptionStrDepository = StringDepository++;\r
1198 ConsoleOptionStrDepository = StringDepository++;\r
1199 BootOptionStrDepository = StringDepository++;\r
1200 BootOptionHelpStrDepository = StringDepository++;\r
1201 DriverOptionStrDepository = StringDepository++;\r
1202 DriverOptionHelpStrDepository = StringDepository++;\r
1203 TerminalStrDepository = StringDepository;\r
1204}\r
1205\r
1206/**\r
1207 Fetch a usable string node from the string depository and return the string token.\r
1208\r
1209 @param CallbackData The BMM context data.\r
1210 @param StringDepository The string repository.\r
1211\r
1212 @retval EFI_STRING_ID String token.\r
1213\r
1214**/\r
1215EFI_STRING_ID\r
1216GetStringTokenFromDepository (\r
1217 IN BMM_CALLBACK_DATA *CallbackData,\r
1218 IN STRING_DEPOSITORY *StringDepository\r
1219 )\r
1220{\r
1221 STRING_LIST_NODE *CurrentListNode;\r
1222 STRING_LIST_NODE *NextListNode;\r
1223\r
1224 CurrentListNode = StringDepository->CurrentNode;\r
1225\r
1226 if ((NULL != CurrentListNode) && (NULL != CurrentListNode->Next)) {\r
1227 //\r
1228 // Fetch one reclaimed node from the list.\r
1229 //\r
1230 NextListNode = StringDepository->CurrentNode->Next;\r
1231 } else {\r
1232 //\r
1233 // If there is no usable node in the list, update the list.\r
1234 //\r
1235 NextListNode = AllocateZeroPool (sizeof (STRING_LIST_NODE));\r
1236 ASSERT (NextListNode != NULL);\r
cb7d01c0 1237 NextListNode->StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, L" ", NULL);\r
5c08e117 1238 ASSERT (NextListNode->StringToken != 0);\r
1239\r
1240 StringDepository->TotalNodeNumber++;\r
1241\r
1242 if (NULL == CurrentListNode) {\r
1243 StringDepository->ListHead = NextListNode;\r
1244 } else {\r
1245 CurrentListNode->Next = NextListNode;\r
1246 }\r
1247 }\r
1248\r
1249 StringDepository->CurrentNode = NextListNode;\r
1250\r
1251 return StringDepository->CurrentNode->StringToken;\r
1252}\r
1253\r
1254/**\r
1255 Reclaim string depositories by moving the current node pointer to list head..\r
1256\r
1257**/\r
1258VOID\r
1259ReclaimStringDepository (\r
1260 VOID\r
1261 )\r
1262{\r
1263 UINTN DepositoryIndex;\r
1264 STRING_DEPOSITORY *StringDepository;\r
1265\r
1266 StringDepository = FileOptionStrDepository;\r
1267 for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
1268 StringDepository->CurrentNode = StringDepository->ListHead;\r
1269 StringDepository++;\r
1270 }\r
1271}\r
1272\r
1273/**\r
1274 Release resource for all the string depositories.\r
1275\r
1276**/\r
1277VOID\r
1278CleanUpStringDepository (\r
1279 VOID\r
1280 )\r
1281{\r
1282 UINTN NodeIndex;\r
1283 UINTN DepositoryIndex;\r
1284 STRING_LIST_NODE *CurrentListNode;\r
1285 STRING_LIST_NODE *NextListNode;\r
1286 STRING_DEPOSITORY *StringDepository;\r
1287\r
1288 //\r
1289 // Release string list nodes.\r
1290 //\r
1291 StringDepository = FileOptionStrDepository;\r
1292 for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
1293 CurrentListNode = StringDepository->ListHead;\r
1294 for (NodeIndex = 0; NodeIndex < StringDepository->TotalNodeNumber; NodeIndex++) {\r
1295 NextListNode = CurrentListNode->Next;\r
1296 FreePool (CurrentListNode);\r
1297 CurrentListNode = NextListNode;\r
1298 }\r
1299\r
1300 StringDepository++;\r
1301 }\r
1302 //\r
1303 // Release string depository.\r
1304 //\r
1305 FreePool (FileOptionStrDepository);\r
1306}\r
1307\r
1308/**\r
1309 Start boot maintenance manager\r
1310\r
1311 @retval EFI_SUCCESS If BMM is invoked successfully.\r
1312 @return Other value if BMM return unsuccessfully.\r
1313\r
1314**/\r
1315EFI_STATUS\r
1316BdsStartBootMaint (\r
1317 VOID\r
1318 )\r
1319{\r
1320 EFI_STATUS Status;\r
1321 LIST_ENTRY BdsBootOptionList;\r
1322\r
1323 InitializeListHead (&BdsBootOptionList);\r
1324\r
1325 //\r
1326 // Connect all prior to entering the platform setup menu.\r
1327 //\r
1328 if (!gConnectAllHappened) {\r
1329 BdsLibConnectAllDriversToAllControllers ();\r
1330 gConnectAllHappened = TRUE;\r
1331 }\r
1332 //\r
1333 // Have chance to enumerate boot device\r
1334 //\r
1335 BdsLibEnumerateAllBootOption (&BdsBootOptionList);\r
1336\r
16e5944a
RN
1337 //\r
1338 // Group the legacy boot options for the same device type\r
1339 //\r
1340 GroupMultipleLegacyBootOption4SameType ();\r
1341\r
5c08e117 1342 //\r
1343 // Init the BMM\r
1344 //\r
1345 Status = InitializeBM ();\r
1346\r
1347 return Status;\r
1348}\r
1349\r
1350/**\r
1351 Dispatch BMM formset and FileExplorer formset.\r
1352\r
1353\r
1354 @param CallbackData The BMM context data.\r
1355\r
1356 @retval EFI_SUCCESS If function complete successfully.\r
1357 @return Other value if the Setup Browser process BMM's pages and\r
1358 return unsuccessfully.\r
1359\r
1360**/\r
1361EFI_STATUS\r
1362FormSetDispatcher (\r
1363 IN BMM_CALLBACK_DATA *CallbackData\r
1364 )\r
1365{\r
1366 EFI_STATUS Status;\r
1367 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
1368\r
1369 while (TRUE) {\r
1370 UpdatePageId (CallbackData, FORM_MAIN_ID);\r
1371\r
1372 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
1373 Status = gFormBrowser2->SendForm (\r
1374 gFormBrowser2,\r
1375 &CallbackData->BmmHiiHandle,\r
1376 1,\r
e24fc103 1377 &gBootMaintFormSetGuid,\r
5c08e117 1378 0,\r
1379 NULL,\r
1380 &ActionRequest\r
1381 );\r
1382 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
1383 EnableResetRequired ();\r
1384 }\r
1385\r
1386 ReclaimStringDepository ();\r
1387\r
1388 //\r
1389 // When this Formset returns, check if we are going to explore files.\r
1390 //\r
13078b3f 1391 if (FileExplorerStateInActive != CallbackData->FeCurrentState) {\r
5c08e117 1392 UpdateFileExplorer (CallbackData, 0);\r
1393\r
1394 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
1395 Status = gFormBrowser2->SendForm (\r
1396 gFormBrowser2,\r
1397 &CallbackData->FeHiiHandle,\r
1398 1,\r
e24fc103 1399 &gFileExploreFormSetGuid,\r
5c08e117 1400 0,\r
1401 NULL,\r
1402 &ActionRequest\r
1403 );\r
1404 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
1405 EnableResetRequired ();\r
1406 }\r
1407\r
13078b3f 1408 CallbackData->FeCurrentState = FileExplorerStateInActive;\r
1409 CallbackData->FeDisplayContext = FileExplorerDisplayUnknown;\r
5c08e117 1410 ReclaimStringDepository ();\r
1411 } else {\r
1412 break;\r
1413 }\r
1414 }\r
1415\r
1416 return Status;\r
1417}\r
1418\r