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