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