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