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