]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
Update BdsDxe to use new designed HiiLib, remove the referrence to the original IfrSu...
[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
75bf9d0e 85CHAR16 mBootMaintStorageName[] = L"BmmData";\r
5c08e117 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
75bf9d0e 254 \r
5c08e117 255 if ((Value == NULL) || (ActionRequest == NULL)) {\r
256 return EFI_INVALID_PARAMETER;\r
257 }\r
258\r
259 OldValue = 0;\r
260 NewValue = 0;\r
261 Number = 0;\r
262 OldLegacyDev = NULL;\r
263 NewLegacyDev = NULL;\r
264 NewValuePos = 0;\r
265 DisMap = NULL;\r
266 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
267\r
268 Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
269 UpdatePageId (Private, QuestionId);\r
270\r
271 //\r
272 // Retrive uncommitted data from Form Browser\r
273 //\r
75bf9d0e
LG
274 CurrentFakeNVMap = (BMM_FAKE_NV_DATA *) HiiGetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA));\r
275 if (CurrentFakeNVMap == NULL) {\r
276 CurrentFakeNVMap = &Private->BmmFakeNvData;\r
5c08e117 277 }\r
278\r
279 //\r
280 // need to be subtituded.\r
281 //\r
282 // Update Select FD/HD/CD/NET/BEV Order Form\r
283 //\r
284 if (FORM_SET_FD_ORDER_ID == Private->BmmPreviousPageId ||\r
285 FORM_SET_HD_ORDER_ID == Private->BmmPreviousPageId ||\r
286 FORM_SET_CD_ORDER_ID == Private->BmmPreviousPageId ||\r
287 FORM_SET_NET_ORDER_ID == Private->BmmPreviousPageId ||\r
288 FORM_SET_BEV_ORDER_ID == Private->BmmPreviousPageId ||\r
289 ((FORM_BOOT_SETUP_ID == Private->BmmPreviousPageId) &&\r
290 (QuestionId >= LEGACY_FD_QUESTION_ID) &&\r
291 (QuestionId < (LEGACY_BEV_QUESTION_ID + 100)) )\r
292 ) {\r
293\r
294 DisMap = Private->BmmOldFakeNVData.DisableMap;\r
295\r
296 FormId = Private->BmmPreviousPageId;\r
297 if (FormId == FORM_BOOT_SETUP_ID) {\r
298 FormId = Private->BmmCurrentPageId;\r
299 }\r
300\r
301 switch (FormId) {\r
302 case FORM_SET_FD_ORDER_ID:\r
303 Number = (UINT16) LegacyFDMenu.MenuNumber;\r
304 OldLegacyDev = Private->BmmOldFakeNVData.LegacyFD;\r
305 NewLegacyDev = CurrentFakeNVMap->LegacyFD;\r
306 break;\r
307\r
308 case FORM_SET_HD_ORDER_ID:\r
309 Number = (UINT16) LegacyHDMenu.MenuNumber;\r
310 OldLegacyDev = Private->BmmOldFakeNVData.LegacyHD;\r
311 NewLegacyDev = CurrentFakeNVMap->LegacyHD;\r
312 break;\r
313\r
314 case FORM_SET_CD_ORDER_ID:\r
315 Number = (UINT16) LegacyCDMenu.MenuNumber;\r
316 OldLegacyDev = Private->BmmOldFakeNVData.LegacyCD;\r
317 NewLegacyDev = CurrentFakeNVMap->LegacyCD;\r
318 break;\r
319\r
320 case FORM_SET_NET_ORDER_ID:\r
321 Number = (UINT16) LegacyNETMenu.MenuNumber;\r
322 OldLegacyDev = Private->BmmOldFakeNVData.LegacyNET;\r
323 NewLegacyDev = CurrentFakeNVMap->LegacyNET;\r
324 break;\r
325\r
326 case FORM_SET_BEV_ORDER_ID:\r
327 Number = (UINT16) LegacyBEVMenu.MenuNumber;\r
328 OldLegacyDev = Private->BmmOldFakeNVData.LegacyBEV;\r
329 NewLegacyDev = CurrentFakeNVMap->LegacyBEV;\r
330 break;\r
331\r
332 default:\r
333 break;\r
334 }\r
335 //\r
336 // First, find the different position\r
337 // if there is change, it should be only one\r
338 //\r
339 for (Index = 0; Index < Number; Index++) {\r
340 if (OldLegacyDev[Index] != NewLegacyDev[Index]) {\r
341 OldValue = OldLegacyDev[Index];\r
342 NewValue = NewLegacyDev[Index];\r
343 break;\r
344 }\r
345 }\r
346\r
347 if (Index != Number) {\r
348 //\r
349 // there is change, now process\r
350 //\r
351 if (0xFF == NewValue) {\r
352 //\r
353 // This item will be disable\r
354 // Just move the items behind this forward to overlap it\r
355 //\r
356 Pos = OldValue / 8;\r
357 Bit = 7 - (OldValue % 8);\r
358 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
359 for (Index2 = Index; Index2 < Number - 1; Index2++) {\r
360 NewLegacyDev[Index2] = NewLegacyDev[Index2 + 1];\r
361 }\r
362\r
363 NewLegacyDev[Index2] = 0xFF;\r
364 } else {\r
365 for (Index2 = 0; Index2 < Number; Index2++) {\r
366 if (Index2 == Index) {\r
367 continue;\r
368 }\r
369\r
370 if (OldLegacyDev[Index2] == NewValue) {\r
371 //\r
372 // If NewValue is in OldLegacyDev array\r
373 // remember its old position\r
374 //\r
375 NewValuePos = Index2;\r
376 break;\r
377 }\r
378 }\r
379\r
380 if (Index2 != Number) {\r
381 //\r
382 // We will change current item to an existing item\r
383 // (It's hard to describe here, please read code, it's like a cycle-moving)\r
384 //\r
385 for (Index2 = NewValuePos; Index2 != Index;) {\r
386 if (NewValuePos < Index) {\r
387 NewLegacyDev[Index2] = OldLegacyDev[Index2 + 1];\r
388 Index2++;\r
389 } else {\r
390 NewLegacyDev[Index2] = OldLegacyDev[Index2 - 1];\r
391 Index2--;\r
392 }\r
393 }\r
394 } else {\r
395 //\r
396 // If NewValue is not in OldlegacyDev array, we are changing to a disabled item\r
397 // so we should modify DisMap to reflect the change\r
398 //\r
399 Pos = NewValue / 8;\r
400 Bit = 7 - (NewValue % 8);\r
401 DisMap[Pos] = (UINT8) (DisMap[Pos] & (~ (UINT8) (1 << Bit)));\r
402 if (0xFF != OldValue) {\r
403 //\r
404 // Because NewValue is a item that was disabled before\r
405 // so after changing the OldValue should be disabled\r
406 // actually we are doing a swap of enable-disable states of two items\r
407 //\r
408 Pos = OldValue / 8;\r
409 Bit = 7 - (OldValue % 8);\r
410 DisMap[Pos] = (UINT8) (DisMap[Pos] | (UINT8) (1 << Bit));\r
411 }\r
412 }\r
413 }\r
414 //\r
415 // To prevent DISABLE appears in the middle of the list\r
416 // we should perform a re-ordering\r
417 //\r
418 Index = 0;\r
419 while (Index < Number) {\r
420 if (0xFF != NewLegacyDev[Index]) {\r
421 Index++;\r
422 continue;\r
423 }\r
424\r
425 Index2 = Index;\r
426 Index2++;\r
427 while (Index2 < Number) {\r
428 if (0xFF != NewLegacyDev[Index2]) {\r
429 break;\r
430 }\r
431\r
432 Index2++;\r
433 }\r
434\r
435 if (Index2 < Number) {\r
436 NewLegacyDev[Index] = NewLegacyDev[Index2];\r
437 NewLegacyDev[Index2] = 0xFF;\r
438 }\r
439\r
440 Index++;\r
441 }\r
442\r
443 CopyMem (\r
444 OldLegacyDev,\r
445 NewLegacyDev,\r
446 Number\r
447 );\r
448 }\r
449 }\r
450\r
451 if (QuestionId < FILE_OPTION_OFFSET) {\r
452 if (QuestionId < CONFIG_OPTION_OFFSET) {\r
453 switch (QuestionId) {\r
454 case KEY_VALUE_BOOT_FROM_FILE:\r
455 Private->FeCurrentState = BOOT_FROM_FILE_STATE;\r
456\r
457 //\r
458 // Exit Bmm main formset to send File Explorer formset.\r
459 //\r
460 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
461 break;\r
462\r
463 case FORM_BOOT_ADD_ID:\r
464 Private->FeCurrentState = ADD_BOOT_OPTION_STATE;\r
465\r
466 //\r
467 // Exit Bmm main formset to send File Explorer formset.\r
468 //\r
469 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
470 break;\r
471\r
472 case FORM_DRV_ADD_FILE_ID:\r
473 Private->FeCurrentState = ADD_DRIVER_OPTION_STATE;\r
474\r
475 //\r
476 // Exit Bmm main formset to send File Explorer formset.\r
477 //\r
478 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
479 break;\r
480\r
481 case FORM_DRV_ADD_HANDLE_ID:\r
482 CleanUpPage (FORM_DRV_ADD_HANDLE_ID, Private);\r
483 UpdateDrvAddHandlePage (Private);\r
484 break;\r
485\r
486 case FORM_BOOT_DEL_ID:\r
487 CleanUpPage (FORM_BOOT_DEL_ID, Private);\r
488 UpdateBootDelPage (Private);\r
489 break;\r
490\r
491 case FORM_BOOT_CHG_ID:\r
492 case FORM_DRV_CHG_ID:\r
493 UpdatePageBody (QuestionId, Private);\r
494 break;\r
495\r
496 case FORM_DRV_DEL_ID:\r
497 CleanUpPage (FORM_DRV_DEL_ID, Private);\r
498 UpdateDrvDelPage (Private);\r
499 break;\r
500\r
501 case FORM_BOOT_NEXT_ID:\r
502 CleanUpPage (FORM_BOOT_NEXT_ID, Private);\r
503 UpdateBootNextPage (Private);\r
504 break;\r
505\r
506 case FORM_TIME_OUT_ID:\r
507 CleanUpPage (FORM_TIME_OUT_ID, Private);\r
508 UpdateTimeOutPage (Private);\r
509 break;\r
510\r
511 case FORM_RESET:\r
512 gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
513 return EFI_UNSUPPORTED;\r
514\r
515 case FORM_CON_IN_ID:\r
516 case FORM_CON_OUT_ID:\r
517 case FORM_CON_ERR_ID:\r
518 UpdatePageBody (QuestionId, Private);\r
519 break;\r
520\r
521 case FORM_CON_MODE_ID:\r
522 CleanUpPage (FORM_CON_MODE_ID, Private);\r
523 UpdateConModePage (Private);\r
524 break;\r
525\r
526 case FORM_CON_COM_ID:\r
527 CleanUpPage (FORM_CON_COM_ID, Private);\r
528 UpdateConCOMPage (Private);\r
529 break;\r
530\r
531 case FORM_SET_FD_ORDER_ID:\r
532 case FORM_SET_HD_ORDER_ID:\r
533 case FORM_SET_CD_ORDER_ID:\r
534 case FORM_SET_NET_ORDER_ID:\r
535 case FORM_SET_BEV_ORDER_ID:\r
536 CleanUpPage (QuestionId, Private);\r
537 UpdateSetLegacyDeviceOrderPage (QuestionId, Private);\r
538 break;\r
539\r
540 case KEY_VALUE_SAVE_AND_EXIT:\r
541 case KEY_VALUE_NO_SAVE_AND_EXIT:\r
542\r
543 if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
544 Status = ApplyChangeHandler (Private, CurrentFakeNVMap, Private->BmmPreviousPageId);\r
545 if (EFI_ERROR (Status)) {\r
546 return Status;\r
547 }\r
548 } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
549 DiscardChangeHandler (Private, CurrentFakeNVMap);\r
550 }\r
551\r
552 //\r
553 // Tell browser not to ask for confirmation of changes,\r
554 // since we have already applied or discarded.\r
555 //\r
556 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
557 break;\r
558\r
559 default:\r
560 break;\r
561 }\r
562 } else if ((QuestionId >= TERMINAL_OPTION_OFFSET) && (QuestionId < CONSOLE_OPTION_OFFSET)) {\r
563 Index2 = (UINT16) (QuestionId - TERMINAL_OPTION_OFFSET);\r
564 Private->CurrentTerminal = Index2;\r
565\r
566 CleanUpPage (FORM_CON_COM_SETUP_ID, Private);\r
567 UpdateTerminalPage (Private);\r
568\r
569 } else if (QuestionId >= HANDLE_OPTION_OFFSET) {\r
570 Index2 = (UINT16) (QuestionId - HANDLE_OPTION_OFFSET);\r
571\r
572 NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index2);\r
573 ASSERT (NewMenuEntry != NULL);\r
574 Private->HandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
575\r
576 CleanUpPage (FORM_DRV_ADD_HANDLE_DESC_ID, Private);\r
577\r
578 Private->MenuEntry = NewMenuEntry;\r
579 Private->LoadContext->FilePathList = Private->HandleContext->DevicePath;\r
580\r
581 UpdateDriverAddHandleDescPage (Private);\r
582 }\r
583 }\r
584\r
585 //\r
586 // Pass changed uncommitted data back to Form Browser\r
587 //\r
75bf9d0e
LG
588 Status = HiiSetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap, NULL);\r
589\r
590 //\r
591 // Update local settting.\r
592 //\r
593 if ((UINTN) CurrentFakeNVMap != (UINTN) &Private->BmmFakeNvData) {\r
594 CopyMem (&Private->BmmFakeNvData, CurrentFakeNVMap, sizeof (BMM_FAKE_NV_DATA));\r
595 FreePool (CurrentFakeNVMap);\r
596 }\r
5c08e117 597\r
598 return Status;\r
599}\r
600\r
601/**\r
602 Function handling request to apply changes for BMM pages.\r
603\r
604 @param Private Pointer to callback data buffer.\r
605 @param CurrentFakeNVMap Pointer to buffer holding data of various values used by BMM\r
606 @param FormId ID of the form which has sent the request to apply change.\r
607\r
608 @retval EFI_SUCCESS Change successfully applied.\r
609 @retval Other Error occurs while trying to apply changes.\r
610\r
611**/\r
612EFI_STATUS\r
613ApplyChangeHandler (\r
614 IN BMM_CALLBACK_DATA *Private,\r
615 IN BMM_FAKE_NV_DATA *CurrentFakeNVMap,\r
616 IN EFI_FORM_ID FormId\r
617 )\r
618{\r
619 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
620 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
621 BM_LOAD_CONTEXT *NewLoadContext;\r
622 BM_MENU_ENTRY *NewMenuEntry;\r
623 EFI_STATUS Status;\r
624 UINT16 Index;\r
625\r
626 Status = EFI_SUCCESS;\r
627\r
628 switch (FormId) {\r
629 case FORM_SET_FD_ORDER_ID:\r
630 case FORM_SET_HD_ORDER_ID:\r
631 case FORM_SET_CD_ORDER_ID:\r
632 case FORM_SET_NET_ORDER_ID:\r
633 case FORM_SET_BEV_ORDER_ID:\r
634 Var_UpdateBBSOption (Private);\r
635 break;\r
636\r
637 case FORM_BOOT_DEL_ID:\r
638 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (UINT8)));\r
639 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
640 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
641 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
642 NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];\r
643 }\r
644\r
645 Var_DelBootOption ();\r
646 break;\r
647\r
648 case FORM_DRV_DEL_ID:\r
649 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (UINT8)));\r
650 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
651 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
652 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
653 NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];\r
654 }\r
655\r
656 Var_DelDriverOption ();\r
657 break;\r
658\r
659 case FORM_BOOT_CHG_ID:\r
660 Status = Var_UpdateBootOrder (Private);\r
661 break;\r
662\r
663 case FORM_DRV_CHG_ID:\r
664 Status = Var_UpdateDriverOrder (Private);\r
665 break;\r
666\r
667 case FORM_TIME_OUT_ID:\r
8c81cb83 668 PcdSet16 (PcdPlatformBootTimeOut, CurrentFakeNVMap->BootTimeOut);\r
5c08e117 669\r
670 Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;\r
671 break;\r
672\r
673 case FORM_BOOT_NEXT_ID:\r
674 Status = Var_UpdateBootNext (Private);\r
675 break;\r
676\r
677 case FORM_CON_MODE_ID:\r
678 Status = Var_UpdateConMode (Private);\r
679 break;\r
680\r
681 case FORM_CON_COM_SETUP_ID:\r
682 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal);\r
683\r
684 ASSERT (NewMenuEntry != NULL);\r
685\r
686 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
687\r
688 NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate;\r
689 ASSERT (CurrentFakeNVMap->COMBaudRate < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
690 NewTerminalContext->BaudRate = BaudRateList[CurrentFakeNVMap->COMBaudRate].Value;\r
691 NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate;\r
692 ASSERT (CurrentFakeNVMap->COMDataRate < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
693 NewTerminalContext->DataBits = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate].Value;\r
694 NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits;\r
695 ASSERT (CurrentFakeNVMap->COMStopBits < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
696 NewTerminalContext->StopBits = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits].Value;\r
697 NewTerminalContext->ParityIndex = CurrentFakeNVMap->COMParity;\r
698 ASSERT (CurrentFakeNVMap->COMParity < (sizeof (ParityList) / sizeof (ParityList[0])));\r
699 NewTerminalContext->Parity = (UINT8) ParityList[CurrentFakeNVMap->COMParity].Value;\r
700 NewTerminalContext->TerminalType = CurrentFakeNVMap->COMTerminalType;\r
701\r
702 ChangeTerminalDevicePath (\r
703 NewTerminalContext->DevicePath,\r
704 FALSE\r
705 );\r
706\r
707 Var_UpdateConsoleInpOption ();\r
708 Var_UpdateConsoleOutOption ();\r
709 Var_UpdateErrorOutOption ();\r
710 break;\r
711\r
712 case FORM_CON_IN_ID:\r
713 ASSERT ((ConsoleInpMenu.MenuNumber + TerminalMenu.MenuNumber) <= (sizeof (CurrentFakeNVMap->ConsoleCheck) / sizeof (UINT8)));\r
714 for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) {\r
715 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
716 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
717 NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
718 }\r
719\r
720 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
721 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
722 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
723 NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleInpMenu.MenuNumber];\r
724 }\r
725\r
726 Var_UpdateConsoleInpOption ();\r
727 break;\r
728\r
729 case FORM_CON_OUT_ID:\r
730 ASSERT ((ConsoleOutMenu.MenuNumber + TerminalMenu.MenuNumber) <= (sizeof (CurrentFakeNVMap->ConsoleCheck) / sizeof (UINT8)));\r
731 for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) {\r
732 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
733 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
734 NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
735 }\r
736\r
737 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
738 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
739 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
740 NewTerminalContext->IsConOut = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleOutMenu.MenuNumber];\r
741 }\r
742\r
743 Var_UpdateConsoleOutOption ();\r
744 break;\r
745\r
746 case FORM_CON_ERR_ID:\r
747 ASSERT ((ConsoleErrMenu.MenuNumber + TerminalMenu.MenuNumber) <= (sizeof (CurrentFakeNVMap->ConsoleCheck) / sizeof (UINT8)));\r
748 for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) {\r
749 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
750 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
751 NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
752 }\r
753\r
754 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
755 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
756 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
757 NewTerminalContext->IsStdErr = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleErrMenu.MenuNumber];\r
758 }\r
759\r
760 Var_UpdateErrorOutOption ();\r
761 break;\r
762\r
763 case FORM_DRV_ADD_HANDLE_DESC_ID:\r
764 Status = Var_UpdateDriverOption (\r
765 Private,\r
766 Private->BmmHiiHandle,\r
767 CurrentFakeNVMap->DriverAddHandleDesc,\r
768 CurrentFakeNVMap->DriverAddHandleOptionalData,\r
769 CurrentFakeNVMap->DriverAddForceReconnect\r
770 );\r
771 if (EFI_ERROR (Status)) {\r
772 goto Error;\r
773 }\r
774\r
775 BOpt_GetDriverOptions (Private);\r
776 CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);\r
777 break;\r
778\r
779 default:\r
780 break;\r
781 }\r
782\r
783Error:\r
784 return Status;\r
785}\r
786\r
787/**\r
788 Discard all changes done to the BMM pages such as Boot Order change,\r
789 Driver order change.\r
790\r
791 @param Private The BMM context data.\r
792 @param CurrentFakeNVMap The current Fack NV Map.\r
793\r
794**/\r
795VOID\r
796DiscardChangeHandler (\r
797 IN BMM_CALLBACK_DATA *Private,\r
798 IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
799 )\r
800{\r
801 UINT16 Index;\r
802\r
803 switch (Private->BmmPreviousPageId) {\r
804 case FORM_BOOT_CHG_ID:\r
805 case FORM_DRV_CHG_ID:\r
806 CopyMem (CurrentFakeNVMap->OptionOrder, Private->BmmOldFakeNVData.OptionOrder, 100);\r
807 break;\r
808\r
809 case FORM_BOOT_DEL_ID:\r
810 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
811 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
812 CurrentFakeNVMap->BootOptionDel[Index] = 0x00;\r
813 }\r
814 break;\r
815\r
816 case FORM_DRV_DEL_ID:\r
817 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
818 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
819 CurrentFakeNVMap->DriverOptionDel[Index] = 0x00;\r
820 }\r
821 break;\r
822\r
823 case FORM_BOOT_NEXT_ID:\r
824 CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;\r
825 break;\r
826\r
827 case FORM_TIME_OUT_ID:\r
828 CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;\r
829 break;\r
830\r
831 case FORM_DRV_ADD_HANDLE_DESC_ID:\r
832 case FORM_DRV_ADD_FILE_ID:\r
833 case FORM_DRV_ADD_HANDLE_ID:\r
834 CurrentFakeNVMap->DriverAddHandleDesc[0] = 0x0000;\r
835 CurrentFakeNVMap->DriverAddHandleOptionalData[0] = 0x0000;\r
836 break;\r
837\r
838 default:\r
839 break;\r
840 }\r
841}\r
842\r
843/**\r
844 Initialize the Boot Maintenance Utitliy.\r
845\r
846\r
847 @retval EFI_SUCCESS utility ended successfully\r
848 @retval others contain some errors\r
849\r
850**/\r
851EFI_STATUS\r
852InitializeBM (\r
853 VOID\r
854 )\r
855{\r
856 EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
5c08e117 857 BMM_CALLBACK_DATA *BmmCallbackInfo;\r
858 EFI_STATUS Status;\r
859 UINT8 *Ptr;\r
860\r
861 Status = EFI_SUCCESS;\r
862\r
863 //\r
864 // Create CallbackData structures for Driver Callback\r
865 //\r
866 BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA));\r
867 if (BmmCallbackInfo == NULL) {\r
868 return EFI_OUT_OF_RESOURCES;\r
869 }\r
870\r
871 //\r
872 // Create LoadOption in BmmCallbackInfo for Driver Callback\r
873 //\r
874 Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
875 if (Ptr == NULL) {\r
876 FreePool (BmmCallbackInfo);\r
877 return EFI_OUT_OF_RESOURCES;\r
878 }\r
879\r
880 //\r
881 // Initialize Bmm callback data.\r
882 //\r
883 BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
884 Ptr += sizeof (BM_LOAD_CONTEXT);\r
885\r
886 BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
887 Ptr += sizeof (BM_FILE_CONTEXT);\r
888\r
889 BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
890 Ptr += sizeof (BM_HANDLE_CONTEXT);\r
891\r
892 BmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr;\r
893\r
894 BmmCallbackInfo->Signature = BMM_CALLBACK_DATA_SIGNATURE;\r
895 BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig;\r
896 BmmCallbackInfo->BmmConfigAccess.RouteConfig = FakeRouteConfig;\r
897 BmmCallbackInfo->BmmConfigAccess.Callback = BootMaintCallback;\r
898 BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID;\r
899 BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID;\r
900 BmmCallbackInfo->FeConfigAccess.ExtractConfig = FakeExtractConfig;\r
901 BmmCallbackInfo->FeConfigAccess.RouteConfig = FakeRouteConfig;\r
902 BmmCallbackInfo->FeConfigAccess.Callback = FileExplorerCallback;\r
903 BmmCallbackInfo->FeCurrentState = INACTIVE_STATE;\r
904 BmmCallbackInfo->FeDisplayContext = UNKNOWN_CONTEXT;\r
905\r
906 //\r
f6f910dd 907 // Install Device Path Protocol and Config Access protocol to driver handle\r
5c08e117 908 //\r
f6f910dd 909 Status = gBS->InstallMultipleProtocolInterfaces (\r
5c08e117 910 &BmmCallbackInfo->BmmDriverHandle,\r
f6f910dd 911 &gEfiDevicePathProtocolGuid,\r
912 &mBmmHiiVendorDevicePath,\r
5c08e117 913 &gEfiHiiConfigAccessProtocolGuid,\r
f6f910dd 914 &BmmCallbackInfo->BmmConfigAccess,\r
915 NULL\r
5c08e117 916 );\r
917 if (EFI_ERROR (Status)) {\r
4376a6f2 918 goto Exit;\r
5c08e117 919 }\r
920\r
921 //\r
f6f910dd 922 // Install Device Path Protocol and Config Access protocol to driver handle\r
5c08e117 923 //\r
f6f910dd 924 Status = gBS->InstallMultipleProtocolInterfaces (\r
5c08e117 925 &BmmCallbackInfo->FeDriverHandle,\r
f6f910dd 926 &gEfiDevicePathProtocolGuid,\r
927 &mFeHiiVendorDevicePath,\r
5c08e117 928 &gEfiHiiConfigAccessProtocolGuid,\r
f6f910dd 929 &BmmCallbackInfo->FeConfigAccess,\r
930 NULL\r
5c08e117 931 );\r
932 if (EFI_ERROR (Status)) {\r
4376a6f2 933 goto Exit;\r
5c08e117 934 }\r
935\r
936 //\r
937 // Post our Boot Maint VFR binnary to the HII database.\r
938 //\r
cb7d01c0 939 BmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
940 &mBootMaintGuid,\r
941 BmmCallbackInfo->BmmDriverHandle,\r
942 BmBin,\r
943 BdsDxeStrings,\r
944 NULL\r
945 );\r
946 ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL);\r
5c08e117 947\r
948 //\r
949 // Post our File Explorer VFR binary to the HII database.\r
950 //\r
cb7d01c0 951 BmmCallbackInfo->FeHiiHandle = HiiAddPackages (\r
952 &mFileExplorerGuid,\r
953 BmmCallbackInfo->FeDriverHandle,\r
954 FEBin,\r
955 BdsDxeStrings,\r
956 NULL\r
957 );\r
958 ASSERT (BmmCallbackInfo->FeHiiHandle != NULL);\r
5c08e117 959\r
960 //\r
75bf9d0e 961 // Init OpCode Handle and Allocate space for creation of Buffer\r
5c08e117 962 //\r
75bf9d0e
LG
963 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
964 if (mStartOpCodeHandle == NULL) {\r
4376a6f2 965 Status = EFI_OUT_OF_RESOURCES;\r
966 goto Exit;\r
5c08e117 967 }\r
968\r
75bf9d0e
LG
969 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
970 if (mEndOpCodeHandle == NULL) {\r
971 Status = EFI_OUT_OF_RESOURCES;\r
972 goto Exit;\r
973 }\r
974\r
975 //\r
976 // Create Hii Extend Label OpCode as the start opcode\r
977 //\r
978 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
979 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
980\r
981 //\r
982 // Create Hii Extend Label OpCode as the end opcode\r
983 //\r
984 mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
985 mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
986 mEndLabel->Number = LABEL_END;\r
987\r
5c08e117 988 InitializeStringDepository ();\r
989\r
990 InitAllMenu (BmmCallbackInfo);\r
991\r
992 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleInpMenu);\r
993 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleOutMenu);\r
994 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleErrMenu);\r
995 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &BootOptionMenu);\r
996 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverOptionMenu);\r
997 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &TerminalMenu);\r
998 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverMenu);\r
999\r
1000 UpdateBootDelPage (BmmCallbackInfo);\r
1001 UpdateDrvDelPage (BmmCallbackInfo);\r
1002\r
1003 if (TerminalMenu.MenuNumber > 0) {\r
1004 BmmCallbackInfo->CurrentTerminal = 0;\r
1005 UpdateTerminalPage (BmmCallbackInfo);\r
1006 }\r
1007\r
1008 Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID **) &LegacyBios);\r
1009 if (!EFI_ERROR (Status)) {\r
1010 RefreshUpdateData ();\r
75bf9d0e 1011 mStartLabel->Number = FORM_BOOT_LEGACY_DEVICE_ID;\r
5c08e117 1012\r
1013 //\r
1014 // If LegacyBios Protocol is installed, add 3 tags about legacy boot option\r
1015 // in BootOption form: legacy FD/HD/CD/NET/BEV\r
1016 //\r
75bf9d0e
LG
1017 HiiCreateGotoOpCode (\r
1018 mStartOpCodeHandle,\r
5c08e117 1019 FORM_SET_FD_ORDER_ID,\r
1020 STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
1021 STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
1022 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1023 FORM_SET_FD_ORDER_ID\r
5c08e117 1024 );\r
1025\r
75bf9d0e
LG
1026 HiiCreateGotoOpCode (\r
1027 mStartOpCodeHandle,\r
5c08e117 1028 FORM_SET_HD_ORDER_ID,\r
1029 STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
1030 STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
1031 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1032 FORM_SET_HD_ORDER_ID\r
5c08e117 1033 );\r
1034\r
75bf9d0e
LG
1035 HiiCreateGotoOpCode (\r
1036 mStartOpCodeHandle,\r
5c08e117 1037 FORM_SET_CD_ORDER_ID,\r
1038 STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
1039 STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
1040 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1041 FORM_SET_CD_ORDER_ID\r
5c08e117 1042 );\r
1043\r
75bf9d0e
LG
1044 HiiCreateGotoOpCode (\r
1045 mStartOpCodeHandle,\r
5c08e117 1046 FORM_SET_NET_ORDER_ID,\r
1047 STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
1048 STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
1049 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1050 FORM_SET_NET_ORDER_ID\r
5c08e117 1051 );\r
1052\r
75bf9d0e
LG
1053 HiiCreateGotoOpCode (\r
1054 mStartOpCodeHandle,\r
5c08e117 1055 FORM_SET_BEV_ORDER_ID,\r
1056 STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
1057 STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
1058 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1059 FORM_SET_BEV_ORDER_ID\r
5c08e117 1060 );\r
75bf9d0e
LG
1061 \r
1062 HiiUpdateForm (\r
5c08e117 1063 BmmCallbackInfo->BmmHiiHandle,\r
1064 &mBootMaintGuid,\r
3cdcfa85 1065 FORM_BOOT_SETUP_ID,\r
75bf9d0e
LG
1066 mStartOpCodeHandle, // Label FORM_BOOT_LEGACY_DEVICE_ID\r
1067 mEndOpCodeHandle // LABEL_END\r
5c08e117 1068 );\r
1069 }\r
1070\r
1071 //\r
1072 // Dispatch BMM main formset and File Explorer formset.\r
1073 //\r
1074 FormSetDispatcher (BmmCallbackInfo);\r
1075\r
1076 //\r
1077 // Remove our IFR data from HII database\r
1078 //\r
cb7d01c0 1079 HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle);\r
1080 HiiRemovePackages (BmmCallbackInfo->FeHiiHandle);\r
5c08e117 1081\r
1082 CleanUpStringDepository ();\r
1083\r
1084 FreeAllMenu ();\r
1085\r
4376a6f2 1086Exit:\r
75bf9d0e
LG
1087 if (mStartOpCodeHandle != NULL) {\r
1088 HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
1089 }\r
1090\r
1091 if (mEndOpCodeHandle != NULL) {\r
1092 HiiFreeOpCodeHandle (mEndOpCodeHandle);\r
1093 }\r
1094\r
4376a6f2 1095 if (BmmCallbackInfo->FeDriverHandle != NULL) {\r
1096 gBS->UninstallMultipleProtocolInterfaces (\r
1097 BmmCallbackInfo->FeDriverHandle,\r
1098 &gEfiDevicePathProtocolGuid,\r
1099 &mFeHiiVendorDevicePath,\r
1100 &gEfiHiiConfigAccessProtocolGuid,\r
1101 &BmmCallbackInfo->FeConfigAccess,\r
1102 NULL\r
1103 );\r
1104 }\r
1105\r
1106 if (BmmCallbackInfo->BmmDriverHandle != NULL) {\r
1107 gBS->UninstallMultipleProtocolInterfaces (\r
1108 BmmCallbackInfo->BmmDriverHandle,\r
1109 &gEfiDevicePathProtocolGuid,\r
1110 &mBmmHiiVendorDevicePath,\r
1111 &gEfiHiiConfigAccessProtocolGuid,\r
1112 &BmmCallbackInfo->BmmConfigAccess,\r
1113 NULL\r
1114 );\r
1115 }\r
1116\r
1117 FreePool (BmmCallbackInfo->LoadContext);\r
1118 FreePool (BmmCallbackInfo);\r
1119\r
5c08e117 1120 return Status;\r
1121}\r
1122\r
1123/**\r
1124 Initialized all Menu Option List.\r
1125\r
1126 @param CallbackData The BMM context data.\r
1127\r
1128**/\r
1129VOID\r
1130InitAllMenu (\r
1131 IN BMM_CALLBACK_DATA *CallbackData\r
1132 )\r
1133{\r
1134 InitializeListHead (&BootOptionMenu.Head);\r
1135 InitializeListHead (&DriverOptionMenu.Head);\r
1136 BOpt_GetBootOptions (CallbackData);\r
1137 BOpt_GetDriverOptions (CallbackData);\r
1138 BOpt_GetLegacyOptions ();\r
1139 InitializeListHead (&FsOptionMenu.Head);\r
1140 BOpt_FindDrivers ();\r
1141 InitializeListHead (&DirectoryMenu.Head);\r
1142 InitializeListHead (&ConsoleInpMenu.Head);\r
1143 InitializeListHead (&ConsoleOutMenu.Head);\r
1144 InitializeListHead (&ConsoleErrMenu.Head);\r
1145 InitializeListHead (&TerminalMenu.Head);\r
1146 LocateSerialIo ();\r
1147 GetAllConsoles ();\r
1148}\r
1149\r
1150/**\r
1151 Free up all Menu Option list.\r
1152\r
1153**/\r
1154VOID\r
1155FreeAllMenu (\r
1156 VOID\r
1157 )\r
1158{\r
1159 BOpt_FreeMenu (&DirectoryMenu);\r
1160 BOpt_FreeMenu (&FsOptionMenu);\r
1161 BOpt_FreeMenu (&BootOptionMenu);\r
1162 BOpt_FreeMenu (&DriverOptionMenu);\r
1163 BOpt_FreeMenu (&DriverMenu);\r
1164 BOpt_FreeLegacyOptions ();\r
1165 FreeAllConsoles ();\r
1166}\r
1167\r
1168/**\r
1169 Intialize all the string depositories.\r
1170\r
1171**/\r
1172VOID\r
1173InitializeStringDepository (\r
1174 VOID\r
1175 )\r
1176{\r
1177 STRING_DEPOSITORY *StringDepository;\r
1178 StringDepository = AllocateZeroPool (sizeof (STRING_DEPOSITORY) * STRING_DEPOSITORY_NUMBER);\r
1179 FileOptionStrDepository = StringDepository++;\r
1180 ConsoleOptionStrDepository = StringDepository++;\r
1181 BootOptionStrDepository = StringDepository++;\r
1182 BootOptionHelpStrDepository = StringDepository++;\r
1183 DriverOptionStrDepository = StringDepository++;\r
1184 DriverOptionHelpStrDepository = StringDepository++;\r
1185 TerminalStrDepository = StringDepository;\r
1186}\r
1187\r
1188/**\r
1189 Fetch a usable string node from the string depository and return the string token.\r
1190\r
1191 @param CallbackData The BMM context data.\r
1192 @param StringDepository The string repository.\r
1193\r
1194 @retval EFI_STRING_ID String token.\r
1195\r
1196**/\r
1197EFI_STRING_ID\r
1198GetStringTokenFromDepository (\r
1199 IN BMM_CALLBACK_DATA *CallbackData,\r
1200 IN STRING_DEPOSITORY *StringDepository\r
1201 )\r
1202{\r
1203 STRING_LIST_NODE *CurrentListNode;\r
1204 STRING_LIST_NODE *NextListNode;\r
1205\r
1206 CurrentListNode = StringDepository->CurrentNode;\r
1207\r
1208 if ((NULL != CurrentListNode) && (NULL != CurrentListNode->Next)) {\r
1209 //\r
1210 // Fetch one reclaimed node from the list.\r
1211 //\r
1212 NextListNode = StringDepository->CurrentNode->Next;\r
1213 } else {\r
1214 //\r
1215 // If there is no usable node in the list, update the list.\r
1216 //\r
1217 NextListNode = AllocateZeroPool (sizeof (STRING_LIST_NODE));\r
1218 ASSERT (NextListNode != NULL);\r
cb7d01c0 1219 NextListNode->StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, L" ", NULL);\r
5c08e117 1220 ASSERT (NextListNode->StringToken != 0);\r
1221\r
1222 StringDepository->TotalNodeNumber++;\r
1223\r
1224 if (NULL == CurrentListNode) {\r
1225 StringDepository->ListHead = NextListNode;\r
1226 } else {\r
1227 CurrentListNode->Next = NextListNode;\r
1228 }\r
1229 }\r
1230\r
1231 StringDepository->CurrentNode = NextListNode;\r
1232\r
1233 return StringDepository->CurrentNode->StringToken;\r
1234}\r
1235\r
1236/**\r
1237 Reclaim string depositories by moving the current node pointer to list head..\r
1238\r
1239**/\r
1240VOID\r
1241ReclaimStringDepository (\r
1242 VOID\r
1243 )\r
1244{\r
1245 UINTN DepositoryIndex;\r
1246 STRING_DEPOSITORY *StringDepository;\r
1247\r
1248 StringDepository = FileOptionStrDepository;\r
1249 for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
1250 StringDepository->CurrentNode = StringDepository->ListHead;\r
1251 StringDepository++;\r
1252 }\r
1253}\r
1254\r
1255/**\r
1256 Release resource for all the string depositories.\r
1257\r
1258**/\r
1259VOID\r
1260CleanUpStringDepository (\r
1261 VOID\r
1262 )\r
1263{\r
1264 UINTN NodeIndex;\r
1265 UINTN DepositoryIndex;\r
1266 STRING_LIST_NODE *CurrentListNode;\r
1267 STRING_LIST_NODE *NextListNode;\r
1268 STRING_DEPOSITORY *StringDepository;\r
1269\r
1270 //\r
1271 // Release string list nodes.\r
1272 //\r
1273 StringDepository = FileOptionStrDepository;\r
1274 for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
1275 CurrentListNode = StringDepository->ListHead;\r
1276 for (NodeIndex = 0; NodeIndex < StringDepository->TotalNodeNumber; NodeIndex++) {\r
1277 NextListNode = CurrentListNode->Next;\r
1278 FreePool (CurrentListNode);\r
1279 CurrentListNode = NextListNode;\r
1280 }\r
1281\r
1282 StringDepository++;\r
1283 }\r
1284 //\r
1285 // Release string depository.\r
1286 //\r
1287 FreePool (FileOptionStrDepository);\r
1288}\r
1289\r
1290/**\r
1291 Start boot maintenance manager\r
1292\r
1293 @retval EFI_SUCCESS If BMM is invoked successfully.\r
1294 @return Other value if BMM return unsuccessfully.\r
1295\r
1296**/\r
1297EFI_STATUS\r
1298BdsStartBootMaint (\r
1299 VOID\r
1300 )\r
1301{\r
1302 EFI_STATUS Status;\r
1303 LIST_ENTRY BdsBootOptionList;\r
1304\r
1305 InitializeListHead (&BdsBootOptionList);\r
1306\r
1307 //\r
1308 // Connect all prior to entering the platform setup menu.\r
1309 //\r
1310 if (!gConnectAllHappened) {\r
1311 BdsLibConnectAllDriversToAllControllers ();\r
1312 gConnectAllHappened = TRUE;\r
1313 }\r
1314 //\r
1315 // Have chance to enumerate boot device\r
1316 //\r
1317 BdsLibEnumerateAllBootOption (&BdsBootOptionList);\r
1318\r
1319 //\r
1320 // Init the BMM\r
1321 //\r
1322 Status = InitializeBM ();\r
1323\r
1324 return Status;\r
1325}\r
1326\r
1327/**\r
1328 Dispatch BMM formset and FileExplorer formset.\r
1329\r
1330\r
1331 @param CallbackData The BMM context data.\r
1332\r
1333 @retval EFI_SUCCESS If function complete successfully.\r
1334 @return Other value if the Setup Browser process BMM's pages and\r
1335 return unsuccessfully.\r
1336\r
1337**/\r
1338EFI_STATUS\r
1339FormSetDispatcher (\r
1340 IN BMM_CALLBACK_DATA *CallbackData\r
1341 )\r
1342{\r
1343 EFI_STATUS Status;\r
1344 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
1345\r
1346 while (TRUE) {\r
1347 UpdatePageId (CallbackData, FORM_MAIN_ID);\r
1348\r
1349 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
1350 Status = gFormBrowser2->SendForm (\r
1351 gFormBrowser2,\r
1352 &CallbackData->BmmHiiHandle,\r
1353 1,\r
75bf9d0e 1354 &mBootMaintGuid,\r
5c08e117 1355 0,\r
1356 NULL,\r
1357 &ActionRequest\r
1358 );\r
1359 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
1360 EnableResetRequired ();\r
1361 }\r
1362\r
1363 ReclaimStringDepository ();\r
1364\r
1365 //\r
1366 // When this Formset returns, check if we are going to explore files.\r
1367 //\r
1368 if (INACTIVE_STATE != CallbackData->FeCurrentState) {\r
1369 UpdateFileExplorer (CallbackData, 0);\r
1370\r
1371 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
1372 Status = gFormBrowser2->SendForm (\r
1373 gFormBrowser2,\r
1374 &CallbackData->FeHiiHandle,\r
1375 1,\r
75bf9d0e 1376 &mFileExplorerGuid,\r
5c08e117 1377 0,\r
1378 NULL,\r
1379 &ActionRequest\r
1380 );\r
1381 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
1382 EnableResetRequired ();\r
1383 }\r
1384\r
1385 CallbackData->FeCurrentState = INACTIVE_STATE;\r
1386 CallbackData->FeDisplayContext = UNKNOWN_CONTEXT;\r
1387 ReclaimStringDepository ();\r
1388 } else {\r
1389 break;\r
1390 }\r
1391 }\r
1392\r
1393 return Status;\r
1394}\r
1395\r
1396\r
1397/**\r
1398 Deletete the Boot Option from EFI Variable. The Boot Order Arrray\r
1399 is also updated.\r
1400\r
1401 @param OptionNumber The number of Boot option want to be deleted.\r
1402 @param BootOrder The Boot Order array.\r
1403 @param BootOrderSize The size of the Boot Order Array.\r
1404\r
1405 @return Other value if the Boot Option specified by OptionNumber is not deleteed succesfully.\r
1406 @retval EFI_SUCCESS If function return successfully.\r
1407\r
1408**/\r
1409EFI_STATUS\r
6ba0bc7c 1410EFIAPI\r
5c08e117 1411BdsDeleteBootOption (\r
1412 IN UINTN OptionNumber,\r
1413 IN OUT UINT16 *BootOrder,\r
1414 IN OUT UINTN *BootOrderSize\r
1415 )\r
1416{\r
1417 UINT16 BootOption[100];\r
1418 UINTN Index;\r
1419 EFI_STATUS Status;\r
1420 UINTN Index2Del;\r
1421\r
1422 Status = EFI_SUCCESS;\r
1423 Index2Del = 0;\r
1424\r
1425 UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", OptionNumber);\r
1426 Status = EfiLibDeleteVariable (BootOption, &gEfiGlobalVariableGuid);\r
1427 \r
1428 //\r
1429 // adjust boot order array\r
1430 //\r
1431 for (Index = 0; Index < *BootOrderSize / sizeof (UINT16); Index++) {\r
1432 if (BootOrder[Index] == OptionNumber) {\r
1433 Index2Del = Index;\r
1434 break;\r
1435 }\r
1436 }\r
1437\r
1438 if (Index != *BootOrderSize / sizeof (UINT16)) {\r
1439 for (Index = 0; Index < *BootOrderSize / sizeof (UINT16) - 1; Index++) {\r
1440 if (Index >= Index2Del) {\r
1441 BootOrder[Index] = BootOrder[Index + 1];\r
1442 }\r
1443 }\r
1444\r
1445 *BootOrderSize -= sizeof (UINT16);\r
1446 }\r
1447\r
1448 return Status;\r
1449\r
1450}\r
1451\r
1452\r