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