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