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