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