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