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