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