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