]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
Refine the comments.
[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
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
453 Private->FeCurrentState = BOOT_FROM_FILE_STATE;\r
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
462 Private->FeCurrentState = ADD_BOOT_OPTION_STATE;\r
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
471 Private->FeCurrentState = ADD_DRIVER_OPTION_STATE;\r
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
628 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (UINT8)));\r
629 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
630 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
631 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
632 NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];\r
633 }\r
634\r
635 Var_DelBootOption ();\r
636 break;\r
637\r
638 case FORM_DRV_DEL_ID:\r
639 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (UINT8)));\r
640 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
641 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
642 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
643 NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];\r
644 }\r
645\r
646 Var_DelDriverOption ();\r
647 break;\r
648\r
649 case FORM_BOOT_CHG_ID:\r
650 Status = Var_UpdateBootOrder (Private);\r
651 break;\r
652\r
653 case FORM_DRV_CHG_ID:\r
654 Status = Var_UpdateDriverOrder (Private);\r
655 break;\r
656\r
657 case FORM_TIME_OUT_ID:\r
8c81cb83 658 PcdSet16 (PcdPlatformBootTimeOut, CurrentFakeNVMap->BootTimeOut);\r
5c08e117 659\r
660 Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;\r
661 break;\r
662\r
663 case FORM_BOOT_NEXT_ID:\r
664 Status = Var_UpdateBootNext (Private);\r
665 break;\r
666\r
667 case FORM_CON_MODE_ID:\r
668 Status = Var_UpdateConMode (Private);\r
669 break;\r
670\r
671 case FORM_CON_COM_SETUP_ID:\r
672 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal);\r
673\r
674 ASSERT (NewMenuEntry != NULL);\r
675\r
676 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
677\r
678 NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate;\r
679 ASSERT (CurrentFakeNVMap->COMBaudRate < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
680 NewTerminalContext->BaudRate = BaudRateList[CurrentFakeNVMap->COMBaudRate].Value;\r
681 NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate;\r
682 ASSERT (CurrentFakeNVMap->COMDataRate < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
683 NewTerminalContext->DataBits = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate].Value;\r
684 NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits;\r
685 ASSERT (CurrentFakeNVMap->COMStopBits < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
686 NewTerminalContext->StopBits = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits].Value;\r
687 NewTerminalContext->ParityIndex = CurrentFakeNVMap->COMParity;\r
688 ASSERT (CurrentFakeNVMap->COMParity < (sizeof (ParityList) / sizeof (ParityList[0])));\r
689 NewTerminalContext->Parity = (UINT8) ParityList[CurrentFakeNVMap->COMParity].Value;\r
690 NewTerminalContext->TerminalType = CurrentFakeNVMap->COMTerminalType;\r
691\r
692 ChangeTerminalDevicePath (\r
693 NewTerminalContext->DevicePath,\r
694 FALSE\r
695 );\r
696\r
697 Var_UpdateConsoleInpOption ();\r
698 Var_UpdateConsoleOutOption ();\r
699 Var_UpdateErrorOutOption ();\r
700 break;\r
701\r
702 case FORM_CON_IN_ID:\r
703 ASSERT ((ConsoleInpMenu.MenuNumber + TerminalMenu.MenuNumber) <= (sizeof (CurrentFakeNVMap->ConsoleCheck) / sizeof (UINT8)));\r
704 for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) {\r
705 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
706 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
707 NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
708 }\r
709\r
710 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
711 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
712 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
713 NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleInpMenu.MenuNumber];\r
714 }\r
715\r
716 Var_UpdateConsoleInpOption ();\r
717 break;\r
718\r
719 case FORM_CON_OUT_ID:\r
720 ASSERT ((ConsoleOutMenu.MenuNumber + TerminalMenu.MenuNumber) <= (sizeof (CurrentFakeNVMap->ConsoleCheck) / sizeof (UINT8)));\r
721 for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) {\r
722 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
723 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
724 NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
725 }\r
726\r
727 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
728 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
729 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
730 NewTerminalContext->IsConOut = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleOutMenu.MenuNumber];\r
731 }\r
732\r
733 Var_UpdateConsoleOutOption ();\r
734 break;\r
735\r
736 case FORM_CON_ERR_ID:\r
737 ASSERT ((ConsoleErrMenu.MenuNumber + TerminalMenu.MenuNumber) <= (sizeof (CurrentFakeNVMap->ConsoleCheck) / sizeof (UINT8)));\r
738 for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) {\r
739 NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
740 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
741 NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
742 }\r
743\r
744 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
745 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
746 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
747 NewTerminalContext->IsStdErr = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleErrMenu.MenuNumber];\r
748 }\r
749\r
750 Var_UpdateErrorOutOption ();\r
751 break;\r
752\r
753 case FORM_DRV_ADD_HANDLE_DESC_ID:\r
754 Status = Var_UpdateDriverOption (\r
755 Private,\r
756 Private->BmmHiiHandle,\r
757 CurrentFakeNVMap->DriverAddHandleDesc,\r
758 CurrentFakeNVMap->DriverAddHandleOptionalData,\r
759 CurrentFakeNVMap->DriverAddForceReconnect\r
760 );\r
761 if (EFI_ERROR (Status)) {\r
762 goto Error;\r
763 }\r
764\r
765 BOpt_GetDriverOptions (Private);\r
766 CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);\r
767 break;\r
768\r
769 default:\r
770 break;\r
771 }\r
772\r
773Error:\r
774 return Status;\r
775}\r
776\r
777/**\r
778 Discard all changes done to the BMM pages such as Boot Order change,\r
779 Driver order change.\r
780\r
781 @param Private The BMM context data.\r
782 @param CurrentFakeNVMap The current Fack NV Map.\r
783\r
784**/\r
785VOID\r
786DiscardChangeHandler (\r
787 IN BMM_CALLBACK_DATA *Private,\r
788 IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
789 )\r
790{\r
791 UINT16 Index;\r
792\r
793 switch (Private->BmmPreviousPageId) {\r
794 case FORM_BOOT_CHG_ID:\r
795 case FORM_DRV_CHG_ID:\r
796 CopyMem (CurrentFakeNVMap->OptionOrder, Private->BmmOldFakeNVData.OptionOrder, 100);\r
797 break;\r
798\r
799 case FORM_BOOT_DEL_ID:\r
800 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
801 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
802 CurrentFakeNVMap->BootOptionDel[Index] = 0x00;\r
803 }\r
804 break;\r
805\r
806 case FORM_DRV_DEL_ID:\r
807 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
808 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
809 CurrentFakeNVMap->DriverOptionDel[Index] = 0x00;\r
810 }\r
811 break;\r
812\r
813 case FORM_BOOT_NEXT_ID:\r
814 CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;\r
815 break;\r
816\r
817 case FORM_TIME_OUT_ID:\r
818 CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;\r
819 break;\r
820\r
821 case FORM_DRV_ADD_HANDLE_DESC_ID:\r
822 case FORM_DRV_ADD_FILE_ID:\r
823 case FORM_DRV_ADD_HANDLE_ID:\r
824 CurrentFakeNVMap->DriverAddHandleDesc[0] = 0x0000;\r
825 CurrentFakeNVMap->DriverAddHandleOptionalData[0] = 0x0000;\r
826 break;\r
827\r
828 default:\r
829 break;\r
830 }\r
831}\r
832\r
833/**\r
834 Initialize the Boot Maintenance Utitliy.\r
835\r
836\r
837 @retval EFI_SUCCESS utility ended successfully\r
838 @retval others contain some errors\r
839\r
840**/\r
841EFI_STATUS\r
842InitializeBM (\r
843 VOID\r
844 )\r
845{\r
846 EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;\r
5c08e117 847 BMM_CALLBACK_DATA *BmmCallbackInfo;\r
848 EFI_STATUS Status;\r
849 UINT8 *Ptr;\r
850\r
851 Status = EFI_SUCCESS;\r
852\r
853 //\r
854 // Create CallbackData structures for Driver Callback\r
855 //\r
856 BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA));\r
857 if (BmmCallbackInfo == NULL) {\r
858 return EFI_OUT_OF_RESOURCES;\r
859 }\r
860\r
861 //\r
862 // Create LoadOption in BmmCallbackInfo for Driver Callback\r
863 //\r
864 Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
865 if (Ptr == NULL) {\r
866 FreePool (BmmCallbackInfo);\r
867 return EFI_OUT_OF_RESOURCES;\r
868 }\r
869\r
870 //\r
871 // Initialize Bmm callback data.\r
872 //\r
873 BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
874 Ptr += sizeof (BM_LOAD_CONTEXT);\r
875\r
876 BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
877 Ptr += sizeof (BM_FILE_CONTEXT);\r
878\r
879 BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
880 Ptr += sizeof (BM_HANDLE_CONTEXT);\r
881\r
882 BmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr;\r
883\r
884 BmmCallbackInfo->Signature = BMM_CALLBACK_DATA_SIGNATURE;\r
885 BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig;\r
886 BmmCallbackInfo->BmmConfigAccess.RouteConfig = FakeRouteConfig;\r
887 BmmCallbackInfo->BmmConfigAccess.Callback = BootMaintCallback;\r
888 BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID;\r
889 BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID;\r
890 BmmCallbackInfo->FeConfigAccess.ExtractConfig = FakeExtractConfig;\r
891 BmmCallbackInfo->FeConfigAccess.RouteConfig = FakeRouteConfig;\r
892 BmmCallbackInfo->FeConfigAccess.Callback = FileExplorerCallback;\r
893 BmmCallbackInfo->FeCurrentState = INACTIVE_STATE;\r
894 BmmCallbackInfo->FeDisplayContext = UNKNOWN_CONTEXT;\r
895\r
896 //\r
f6f910dd 897 // Install Device Path Protocol and Config Access protocol to driver handle\r
5c08e117 898 //\r
f6f910dd 899 Status = gBS->InstallMultipleProtocolInterfaces (\r
5c08e117 900 &BmmCallbackInfo->BmmDriverHandle,\r
f6f910dd 901 &gEfiDevicePathProtocolGuid,\r
902 &mBmmHiiVendorDevicePath,\r
5c08e117 903 &gEfiHiiConfigAccessProtocolGuid,\r
f6f910dd 904 &BmmCallbackInfo->BmmConfigAccess,\r
905 NULL\r
5c08e117 906 );\r
907 if (EFI_ERROR (Status)) {\r
4376a6f2 908 goto Exit;\r
5c08e117 909 }\r
910\r
911 //\r
f6f910dd 912 // Install Device Path Protocol and Config Access protocol to driver handle\r
5c08e117 913 //\r
f6f910dd 914 Status = gBS->InstallMultipleProtocolInterfaces (\r
5c08e117 915 &BmmCallbackInfo->FeDriverHandle,\r
f6f910dd 916 &gEfiDevicePathProtocolGuid,\r
917 &mFeHiiVendorDevicePath,\r
5c08e117 918 &gEfiHiiConfigAccessProtocolGuid,\r
f6f910dd 919 &BmmCallbackInfo->FeConfigAccess,\r
920 NULL\r
5c08e117 921 );\r
922 if (EFI_ERROR (Status)) {\r
4376a6f2 923 goto Exit;\r
5c08e117 924 }\r
925\r
926 //\r
927 // Post our Boot Maint VFR binnary to the HII database.\r
928 //\r
cb7d01c0 929 BmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
930 &mBootMaintGuid,\r
931 BmmCallbackInfo->BmmDriverHandle,\r
932 BmBin,\r
933 BdsDxeStrings,\r
934 NULL\r
935 );\r
936 ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL);\r
5c08e117 937\r
938 //\r
939 // Post our File Explorer VFR binary to the HII database.\r
940 //\r
cb7d01c0 941 BmmCallbackInfo->FeHiiHandle = HiiAddPackages (\r
942 &mFileExplorerGuid,\r
943 BmmCallbackInfo->FeDriverHandle,\r
944 FEBin,\r
945 BdsDxeStrings,\r
946 NULL\r
947 );\r
948 ASSERT (BmmCallbackInfo->FeHiiHandle != NULL);\r
5c08e117 949\r
950 //\r
75bf9d0e 951 // Init OpCode Handle and Allocate space for creation of Buffer\r
5c08e117 952 //\r
75bf9d0e
LG
953 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
954 if (mStartOpCodeHandle == NULL) {\r
4376a6f2 955 Status = EFI_OUT_OF_RESOURCES;\r
956 goto Exit;\r
5c08e117 957 }\r
958\r
75bf9d0e
LG
959 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
960 if (mEndOpCodeHandle == NULL) {\r
961 Status = EFI_OUT_OF_RESOURCES;\r
962 goto Exit;\r
963 }\r
964\r
965 //\r
966 // Create Hii Extend Label OpCode as the start opcode\r
967 //\r
968 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
969 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
970\r
971 //\r
972 // Create Hii Extend Label OpCode as the end opcode\r
973 //\r
974 mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
975 mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
976 mEndLabel->Number = LABEL_END;\r
977\r
5c08e117 978 InitializeStringDepository ();\r
979\r
980 InitAllMenu (BmmCallbackInfo);\r
981\r
982 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleInpMenu);\r
983 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleOutMenu);\r
984 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleErrMenu);\r
985 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &BootOptionMenu);\r
986 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverOptionMenu);\r
987 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &TerminalMenu);\r
988 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverMenu);\r
989\r
990 UpdateBootDelPage (BmmCallbackInfo);\r
991 UpdateDrvDelPage (BmmCallbackInfo);\r
992\r
993 if (TerminalMenu.MenuNumber > 0) {\r
994 BmmCallbackInfo->CurrentTerminal = 0;\r
995 UpdateTerminalPage (BmmCallbackInfo);\r
996 }\r
997\r
998 Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID **) &LegacyBios);\r
999 if (!EFI_ERROR (Status)) {\r
1000 RefreshUpdateData ();\r
75bf9d0e 1001 mStartLabel->Number = FORM_BOOT_LEGACY_DEVICE_ID;\r
5c08e117 1002\r
1003 //\r
1004 // If LegacyBios Protocol is installed, add 3 tags about legacy boot option\r
1005 // in BootOption form: legacy FD/HD/CD/NET/BEV\r
1006 //\r
75bf9d0e
LG
1007 HiiCreateGotoOpCode (\r
1008 mStartOpCodeHandle,\r
5c08e117 1009 FORM_SET_FD_ORDER_ID,\r
1010 STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
1011 STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE),\r
1012 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1013 FORM_SET_FD_ORDER_ID\r
5c08e117 1014 );\r
1015\r
75bf9d0e
LG
1016 HiiCreateGotoOpCode (\r
1017 mStartOpCodeHandle,\r
5c08e117 1018 FORM_SET_HD_ORDER_ID,\r
1019 STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
1020 STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE),\r
1021 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1022 FORM_SET_HD_ORDER_ID\r
5c08e117 1023 );\r
1024\r
75bf9d0e
LG
1025 HiiCreateGotoOpCode (\r
1026 mStartOpCodeHandle,\r
5c08e117 1027 FORM_SET_CD_ORDER_ID,\r
1028 STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
1029 STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE),\r
1030 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1031 FORM_SET_CD_ORDER_ID\r
5c08e117 1032 );\r
1033\r
75bf9d0e
LG
1034 HiiCreateGotoOpCode (\r
1035 mStartOpCodeHandle,\r
5c08e117 1036 FORM_SET_NET_ORDER_ID,\r
1037 STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
1038 STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE),\r
1039 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1040 FORM_SET_NET_ORDER_ID\r
5c08e117 1041 );\r
1042\r
75bf9d0e
LG
1043 HiiCreateGotoOpCode (\r
1044 mStartOpCodeHandle,\r
5c08e117 1045 FORM_SET_BEV_ORDER_ID,\r
1046 STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
1047 STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE),\r
1048 EFI_IFR_FLAG_CALLBACK,\r
75bf9d0e 1049 FORM_SET_BEV_ORDER_ID\r
5c08e117 1050 );\r
75bf9d0e
LG
1051 \r
1052 HiiUpdateForm (\r
5c08e117 1053 BmmCallbackInfo->BmmHiiHandle,\r
1054 &mBootMaintGuid,\r
3cdcfa85 1055 FORM_BOOT_SETUP_ID,\r
75bf9d0e
LG
1056 mStartOpCodeHandle, // Label FORM_BOOT_LEGACY_DEVICE_ID\r
1057 mEndOpCodeHandle // LABEL_END\r
5c08e117 1058 );\r
1059 }\r
1060\r
1061 //\r
1062 // Dispatch BMM main formset and File Explorer formset.\r
1063 //\r
1064 FormSetDispatcher (BmmCallbackInfo);\r
1065\r
1066 //\r
1067 // Remove our IFR data from HII database\r
1068 //\r
cb7d01c0 1069 HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle);\r
1070 HiiRemovePackages (BmmCallbackInfo->FeHiiHandle);\r
5c08e117 1071\r
1072 CleanUpStringDepository ();\r
1073\r
1074 FreeAllMenu ();\r
1075\r
4376a6f2 1076Exit:\r
75bf9d0e
LG
1077 if (mStartOpCodeHandle != NULL) {\r
1078 HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
1079 }\r
1080\r
1081 if (mEndOpCodeHandle != NULL) {\r
1082 HiiFreeOpCodeHandle (mEndOpCodeHandle);\r
1083 }\r
1084\r
4376a6f2 1085 if (BmmCallbackInfo->FeDriverHandle != NULL) {\r
1086 gBS->UninstallMultipleProtocolInterfaces (\r
1087 BmmCallbackInfo->FeDriverHandle,\r
1088 &gEfiDevicePathProtocolGuid,\r
1089 &mFeHiiVendorDevicePath,\r
1090 &gEfiHiiConfigAccessProtocolGuid,\r
1091 &BmmCallbackInfo->FeConfigAccess,\r
1092 NULL\r
1093 );\r
1094 }\r
1095\r
1096 if (BmmCallbackInfo->BmmDriverHandle != NULL) {\r
1097 gBS->UninstallMultipleProtocolInterfaces (\r
1098 BmmCallbackInfo->BmmDriverHandle,\r
1099 &gEfiDevicePathProtocolGuid,\r
1100 &mBmmHiiVendorDevicePath,\r
1101 &gEfiHiiConfigAccessProtocolGuid,\r
1102 &BmmCallbackInfo->BmmConfigAccess,\r
1103 NULL\r
1104 );\r
1105 }\r
1106\r
1107 FreePool (BmmCallbackInfo->LoadContext);\r
1108 FreePool (BmmCallbackInfo);\r
1109\r
5c08e117 1110 return Status;\r
1111}\r
1112\r
1113/**\r
1114 Initialized all Menu Option List.\r
1115\r
1116 @param CallbackData The BMM context data.\r
1117\r
1118**/\r
1119VOID\r
1120InitAllMenu (\r
1121 IN BMM_CALLBACK_DATA *CallbackData\r
1122 )\r
1123{\r
1124 InitializeListHead (&BootOptionMenu.Head);\r
1125 InitializeListHead (&DriverOptionMenu.Head);\r
1126 BOpt_GetBootOptions (CallbackData);\r
1127 BOpt_GetDriverOptions (CallbackData);\r
1128 BOpt_GetLegacyOptions ();\r
1129 InitializeListHead (&FsOptionMenu.Head);\r
1130 BOpt_FindDrivers ();\r
1131 InitializeListHead (&DirectoryMenu.Head);\r
1132 InitializeListHead (&ConsoleInpMenu.Head);\r
1133 InitializeListHead (&ConsoleOutMenu.Head);\r
1134 InitializeListHead (&ConsoleErrMenu.Head);\r
1135 InitializeListHead (&TerminalMenu.Head);\r
1136 LocateSerialIo ();\r
1137 GetAllConsoles ();\r
1138}\r
1139\r
1140/**\r
1141 Free up all Menu Option list.\r
1142\r
1143**/\r
1144VOID\r
1145FreeAllMenu (\r
1146 VOID\r
1147 )\r
1148{\r
1149 BOpt_FreeMenu (&DirectoryMenu);\r
1150 BOpt_FreeMenu (&FsOptionMenu);\r
1151 BOpt_FreeMenu (&BootOptionMenu);\r
1152 BOpt_FreeMenu (&DriverOptionMenu);\r
1153 BOpt_FreeMenu (&DriverMenu);\r
1154 BOpt_FreeLegacyOptions ();\r
1155 FreeAllConsoles ();\r
1156}\r
1157\r
1158/**\r
1159 Intialize all the string depositories.\r
1160\r
1161**/\r
1162VOID\r
1163InitializeStringDepository (\r
1164 VOID\r
1165 )\r
1166{\r
1167 STRING_DEPOSITORY *StringDepository;\r
1168 StringDepository = AllocateZeroPool (sizeof (STRING_DEPOSITORY) * STRING_DEPOSITORY_NUMBER);\r
1169 FileOptionStrDepository = StringDepository++;\r
1170 ConsoleOptionStrDepository = StringDepository++;\r
1171 BootOptionStrDepository = StringDepository++;\r
1172 BootOptionHelpStrDepository = StringDepository++;\r
1173 DriverOptionStrDepository = StringDepository++;\r
1174 DriverOptionHelpStrDepository = StringDepository++;\r
1175 TerminalStrDepository = StringDepository;\r
1176}\r
1177\r
1178/**\r
1179 Fetch a usable string node from the string depository and return the string token.\r
1180\r
1181 @param CallbackData The BMM context data.\r
1182 @param StringDepository The string repository.\r
1183\r
1184 @retval EFI_STRING_ID String token.\r
1185\r
1186**/\r
1187EFI_STRING_ID\r
1188GetStringTokenFromDepository (\r
1189 IN BMM_CALLBACK_DATA *CallbackData,\r
1190 IN STRING_DEPOSITORY *StringDepository\r
1191 )\r
1192{\r
1193 STRING_LIST_NODE *CurrentListNode;\r
1194 STRING_LIST_NODE *NextListNode;\r
1195\r
1196 CurrentListNode = StringDepository->CurrentNode;\r
1197\r
1198 if ((NULL != CurrentListNode) && (NULL != CurrentListNode->Next)) {\r
1199 //\r
1200 // Fetch one reclaimed node from the list.\r
1201 //\r
1202 NextListNode = StringDepository->CurrentNode->Next;\r
1203 } else {\r
1204 //\r
1205 // If there is no usable node in the list, update the list.\r
1206 //\r
1207 NextListNode = AllocateZeroPool (sizeof (STRING_LIST_NODE));\r
1208 ASSERT (NextListNode != NULL);\r
cb7d01c0 1209 NextListNode->StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, L" ", NULL);\r
5c08e117 1210 ASSERT (NextListNode->StringToken != 0);\r
1211\r
1212 StringDepository->TotalNodeNumber++;\r
1213\r
1214 if (NULL == CurrentListNode) {\r
1215 StringDepository->ListHead = NextListNode;\r
1216 } else {\r
1217 CurrentListNode->Next = NextListNode;\r
1218 }\r
1219 }\r
1220\r
1221 StringDepository->CurrentNode = NextListNode;\r
1222\r
1223 return StringDepository->CurrentNode->StringToken;\r
1224}\r
1225\r
1226/**\r
1227 Reclaim string depositories by moving the current node pointer to list head..\r
1228\r
1229**/\r
1230VOID\r
1231ReclaimStringDepository (\r
1232 VOID\r
1233 )\r
1234{\r
1235 UINTN DepositoryIndex;\r
1236 STRING_DEPOSITORY *StringDepository;\r
1237\r
1238 StringDepository = FileOptionStrDepository;\r
1239 for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
1240 StringDepository->CurrentNode = StringDepository->ListHead;\r
1241 StringDepository++;\r
1242 }\r
1243}\r
1244\r
1245/**\r
1246 Release resource for all the string depositories.\r
1247\r
1248**/\r
1249VOID\r
1250CleanUpStringDepository (\r
1251 VOID\r
1252 )\r
1253{\r
1254 UINTN NodeIndex;\r
1255 UINTN DepositoryIndex;\r
1256 STRING_LIST_NODE *CurrentListNode;\r
1257 STRING_LIST_NODE *NextListNode;\r
1258 STRING_DEPOSITORY *StringDepository;\r
1259\r
1260 //\r
1261 // Release string list nodes.\r
1262 //\r
1263 StringDepository = FileOptionStrDepository;\r
1264 for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
1265 CurrentListNode = StringDepository->ListHead;\r
1266 for (NodeIndex = 0; NodeIndex < StringDepository->TotalNodeNumber; NodeIndex++) {\r
1267 NextListNode = CurrentListNode->Next;\r
1268 FreePool (CurrentListNode);\r
1269 CurrentListNode = NextListNode;\r
1270 }\r
1271\r
1272 StringDepository++;\r
1273 }\r
1274 //\r
1275 // Release string depository.\r
1276 //\r
1277 FreePool (FileOptionStrDepository);\r
1278}\r
1279\r
1280/**\r
1281 Start boot maintenance manager\r
1282\r
1283 @retval EFI_SUCCESS If BMM is invoked successfully.\r
1284 @return Other value if BMM return unsuccessfully.\r
1285\r
1286**/\r
1287EFI_STATUS\r
1288BdsStartBootMaint (\r
1289 VOID\r
1290 )\r
1291{\r
1292 EFI_STATUS Status;\r
1293 LIST_ENTRY BdsBootOptionList;\r
1294\r
1295 InitializeListHead (&BdsBootOptionList);\r
1296\r
1297 //\r
1298 // Connect all prior to entering the platform setup menu.\r
1299 //\r
1300 if (!gConnectAllHappened) {\r
1301 BdsLibConnectAllDriversToAllControllers ();\r
1302 gConnectAllHappened = TRUE;\r
1303 }\r
1304 //\r
1305 // Have chance to enumerate boot device\r
1306 //\r
1307 BdsLibEnumerateAllBootOption (&BdsBootOptionList);\r
1308\r
1309 //\r
1310 // Init the BMM\r
1311 //\r
1312 Status = InitializeBM ();\r
1313\r
1314 return Status;\r
1315}\r
1316\r
1317/**\r
1318 Dispatch BMM formset and FileExplorer formset.\r
1319\r
1320\r
1321 @param CallbackData The BMM context data.\r
1322\r
1323 @retval EFI_SUCCESS If function complete successfully.\r
1324 @return Other value if the Setup Browser process BMM's pages and\r
1325 return unsuccessfully.\r
1326\r
1327**/\r
1328EFI_STATUS\r
1329FormSetDispatcher (\r
1330 IN BMM_CALLBACK_DATA *CallbackData\r
1331 )\r
1332{\r
1333 EFI_STATUS Status;\r
1334 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
1335\r
1336 while (TRUE) {\r
1337 UpdatePageId (CallbackData, FORM_MAIN_ID);\r
1338\r
1339 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
1340 Status = gFormBrowser2->SendForm (\r
1341 gFormBrowser2,\r
1342 &CallbackData->BmmHiiHandle,\r
1343 1,\r
75bf9d0e 1344 &mBootMaintGuid,\r
5c08e117 1345 0,\r
1346 NULL,\r
1347 &ActionRequest\r
1348 );\r
1349 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
1350 EnableResetRequired ();\r
1351 }\r
1352\r
1353 ReclaimStringDepository ();\r
1354\r
1355 //\r
1356 // When this Formset returns, check if we are going to explore files.\r
1357 //\r
1358 if (INACTIVE_STATE != CallbackData->FeCurrentState) {\r
1359 UpdateFileExplorer (CallbackData, 0);\r
1360\r
1361 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
1362 Status = gFormBrowser2->SendForm (\r
1363 gFormBrowser2,\r
1364 &CallbackData->FeHiiHandle,\r
1365 1,\r
75bf9d0e 1366 &mFileExplorerGuid,\r
5c08e117 1367 0,\r
1368 NULL,\r
1369 &ActionRequest\r
1370 );\r
1371 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
1372 EnableResetRequired ();\r
1373 }\r
1374\r
1375 CallbackData->FeCurrentState = INACTIVE_STATE;\r
1376 CallbackData->FeDisplayContext = UNKNOWN_CONTEXT;\r
1377 ReclaimStringDepository ();\r
1378 } else {\r
1379 break;\r
1380 }\r
1381 }\r
1382\r
1383 return Status;\r
1384}\r
1385\r
1386\r
1387/**\r
1388 Deletete the Boot Option from EFI Variable. The Boot Order Arrray\r
1389 is also updated.\r
1390\r
1391 @param OptionNumber The number of Boot option want to be deleted.\r
1392 @param BootOrder The Boot Order array.\r
1393 @param BootOrderSize The size of the Boot Order Array.\r
1394\r
1395 @return Other value if the Boot Option specified by OptionNumber is not deleteed succesfully.\r
1396 @retval EFI_SUCCESS If function return successfully.\r
1397\r
1398**/\r
1399EFI_STATUS\r
6ba0bc7c 1400EFIAPI\r
5c08e117 1401BdsDeleteBootOption (\r
1402 IN UINTN OptionNumber,\r
1403 IN OUT UINT16 *BootOrder,\r
1404 IN OUT UINTN *BootOrderSize\r
1405 )\r
1406{\r
1407 UINT16 BootOption[100];\r
1408 UINTN Index;\r
1409 EFI_STATUS Status;\r
1410 UINTN Index2Del;\r
1411\r
1412 Status = EFI_SUCCESS;\r
1413 Index2Del = 0;\r
1414\r
1415 UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", OptionNumber);\r
1416 Status = EfiLibDeleteVariable (BootOption, &gEfiGlobalVariableGuid);\r
1417 \r
1418 //\r
1419 // adjust boot order array\r
1420 //\r
1421 for (Index = 0; Index < *BootOrderSize / sizeof (UINT16); Index++) {\r
1422 if (BootOrder[Index] == OptionNumber) {\r
1423 Index2Del = Index;\r
1424 break;\r
1425 }\r
1426 }\r
1427\r
1428 if (Index != *BootOrderSize / sizeof (UINT16)) {\r
1429 for (Index = 0; Index < *BootOrderSize / sizeof (UINT16) - 1; Index++) {\r
1430 if (Index >= Index2Del) {\r
1431 BootOrder[Index] = BootOrder[Index + 1];\r
1432 }\r
1433 }\r
1434\r
1435 *BootOrderSize -= sizeof (UINT16);\r
1436 }\r
1437\r
1438 return Status;\r
1439\r
1440}\r
1441\r
1442\r