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