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