]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c
rename XXXDflt to XXXDefault (expand for better readability)
[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
69fc8f08 4Copyright (c) 2004 - 2014, 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
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
146 // \r
147 GetConsoleOutMode (CallbackData); \r
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
317 <ConfigString> format. \r
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
327 awaiting distribution. \r
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
355 UINT16 Index; \r
356 BOOLEAN TerminalAttChange;\r
357 BMM_CALLBACK_DATA *Private; \r
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
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
404 // Compare new and old BMM configuration data and only do action for modified item to \r
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
ED
431 //\r
432 // Change for "delete boot option" page need update NewBmmData->BootOptionOrder, so process \r
433 // NewBmmData->BootOptionOrder before NewBmmData->BootOptionDel\r
434 //\r
435 if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) { \r
436 Status = Var_UpdateBootOrder (Private);\r
437 }\r
438\r
439 //\r
440 // Change for "delete driver option" page need update NewBmmData->DriverOptionOrder, so process \r
441 // NewBmmData->DriverOptionOrder before NewBmmData->DriverOptionDel\r
442 //\r
443 if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { \r
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
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
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
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
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
493 Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut; \r
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
500 if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, sizeof (NewBmmData->ConsoleOutMode)) != 0) { \r
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
523 ASSERT (NewBmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
524 NewTerminalContext->BaudRate = BaudRateList[NewBmmData->COMBaudRate[Index]].Value;\r
525 NewTerminalContext->DataBitsIndex = NewBmmData->COMDataRate[Index];\r
526 ASSERT (NewBmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
527 NewTerminalContext->DataBits = (UINT8) DataBitsList[NewBmmData->COMDataRate[Index]].Value;\r
528 NewTerminalContext->StopBitsIndex = NewBmmData->COMStopBits[Index];\r
529 ASSERT (NewBmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
530 NewTerminalContext->StopBits = (UINT8) StopBitsList[NewBmmData->COMStopBits[Index]].Value;\r
531 NewTerminalContext->ParityIndex = NewBmmData->COMParity[Index];\r
532 ASSERT (NewBmmData->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
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
573 if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, sizeof (NewBmmData->ConsoleErrCheck)) != 0) { \r
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
603 \r
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
652 \r
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
660 \r
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
98ba35a4 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
720 \r
721 return EFI_SUCCESS;\r
722 }\r
d88f86f1 723\r
84724077
ED
724 if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) { \r
725 //\r
726 // All other action return unsupported.\r
727 //\r
728 return EFI_UNSUPPORTED;\r
729 }\r
730 \r
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
742 // Retrive uncommitted data from Form Browser\r
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
84724077 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
d88f86f1
ED
1007 CopyMem (\r
1008 OldLegacyDev,\r
1009 NewLegacyDev,\r
1010 Number\r
1011 );\r
98ba35a4
ED
1012\r
1013 //\r
1014 // Return correct question value.\r
1015 //\r
1016 Value->u8 = NewLegacyDev[Index3];\r
5c08e117 1017 }\r
dc840773
ED
1018 } else {\r
1019 switch (QuestionId) {\r
1020 case KEY_VALUE_SAVE_AND_EXIT:\r
8acb3f7b
ED
1021 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
1022 break;\r
5c08e117 1023\r
8acb3f7b 1024 case KEY_VALUE_NO_SAVE_AND_EXIT:\r
dc840773 1025 //\r
8acb3f7b 1026 // Restore local maintain data.\r
dc840773 1027 //\r
8acb3f7b
ED
1028 DiscardChangeHandler (Private, CurrentFakeNVMap);\r
1029 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
dc840773 1030 break; \r
5c08e117 1031\r
dc840773
ED
1032 case FORM_RESET:\r
1033 gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
1034 return EFI_UNSUPPORTED;\r
5c08e117 1035\r
dc840773
ED
1036 default:\r
1037 break;\r
d88f86f1 1038 }\r
5c08e117 1039 }\r
1040 }\r
1041\r
1042 //\r
84724077 1043 // Pass changed uncommitted data back to Form Browser\r
5c08e117 1044 //\r
84724077
ED
1045 HiiSetBrowserData (&gBootMaintFormSetGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap, NULL);\r
1046 return EFI_SUCCESS;\r
5c08e117 1047}\r
1048\r
5c08e117 1049/**\r
1050 Discard all changes done to the BMM pages such as Boot Order change,\r
1051 Driver order change.\r
1052\r
1053 @param Private The BMM context data.\r
1054 @param CurrentFakeNVMap The current Fack NV Map.\r
1055\r
1056**/\r
1057VOID\r
1058DiscardChangeHandler (\r
1059 IN BMM_CALLBACK_DATA *Private,\r
1060 IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
1061 )\r
1062{\r
1063 UINT16 Index;\r
1064\r
1065 switch (Private->BmmPreviousPageId) {\r
1066 case FORM_BOOT_CHG_ID:\r
be9304f3
ED
1067 CopyMem (CurrentFakeNVMap->BootOptionOrder, Private->BmmOldFakeNVData.BootOptionOrder, sizeof (CurrentFakeNVMap->BootOptionOrder));\r
1068 break;\r
1069\r
5c08e117 1070 case FORM_DRV_CHG_ID:\r
be9304f3 1071 CopyMem (CurrentFakeNVMap->DriverOptionOrder, Private->BmmOldFakeNVData.DriverOptionOrder, sizeof (CurrentFakeNVMap->DriverOptionOrder));\r
5c08e117 1072 break;\r
1073\r
1074 case FORM_BOOT_DEL_ID:\r
be9304f3 1075 ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
5c08e117 1076 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
be9304f3 1077 CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
8acb3f7b 1078 CurrentFakeNVMap->BootOptionDelMark[Index] = FALSE;\r
5c08e117 1079 }\r
1080 break;\r
1081\r
1082 case FORM_DRV_DEL_ID:\r
be9304f3 1083 ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
5c08e117 1084 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
be9304f3 1085 CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
8acb3f7b 1086 CurrentFakeNVMap->DriverOptionDelMark[Index] = FALSE;\r
5c08e117 1087 }\r
1088 break;\r
1089\r
1090 case FORM_BOOT_NEXT_ID:\r
1091 CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;\r
1092 break;\r
1093\r
1094 case FORM_TIME_OUT_ID:\r
1095 CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;\r
1096 break;\r
1097\r
1098 case FORM_DRV_ADD_HANDLE_DESC_ID:\r
1099 case FORM_DRV_ADD_FILE_ID:\r
1100 case FORM_DRV_ADD_HANDLE_ID:\r
1101 CurrentFakeNVMap->DriverAddHandleDesc[0] = 0x0000;\r
1102 CurrentFakeNVMap->DriverAddHandleOptionalData[0] = 0x0000;\r
1103 break;\r
1104\r
1105 default:\r
1106 break;\r
1107 }\r
1108}\r
1109\r
1110/**\r
1111 Initialize the Boot Maintenance Utitliy.\r
1112\r
1113\r
1114 @retval EFI_SUCCESS utility ended successfully\r
1115 @retval others contain some errors\r
1116\r
1117**/\r
1118EFI_STATUS\r
1119InitializeBM (\r
1120 VOID\r
1121 )\r
1122{\r
5c08e117 1123 BMM_CALLBACK_DATA *BmmCallbackInfo;\r
1124 EFI_STATUS Status;\r
be9304f3
ED
1125 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
1126 UINT32 Length;\r
1127 UINT8 *Data;\r
5c08e117 1128\r
1129 Status = EFI_SUCCESS;\r
be9304f3
ED
1130 BmmCallbackInfo = mBmmCallbackInfo; \r
1131\r
1132 BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID;\r
1133 BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID;\r
1134 BmmCallbackInfo->FeCurrentState = FileExplorerStateInActive;\r
1135 BmmCallbackInfo->FeDisplayContext = FileExplorerDisplayUnknown;\r
5c08e117 1136\r
1137 //\r
be9304f3 1138 // Reinstall String packages to include more new strings.\r
5c08e117 1139 //\r
be9304f3 1140 \r
5c08e117 1141 //\r
be9304f3 1142 // String package size\r
5c08e117 1143 //\r
be9304f3 1144 Length = ReadUnaligned32 ((UINT32 *) BdsDxeStrings) - sizeof (UINT32);\r
5c08e117 1145\r
1146 //\r
be9304f3 1147 // Add the length of the Package List Header and the terminating Package Header \r
5c08e117 1148 //\r
be9304f3
ED
1149 Length += sizeof (EFI_HII_PACKAGE_LIST_HEADER) + sizeof (EFI_HII_PACKAGE_HEADER);\r
1150 \r
1151 //\r
1152 // Allocate the storage for the entire Package List\r
1153 //\r
1154 PackageListHeader = AllocateZeroPool (Length);\r
5c08e117 1155\r
1156 //\r
be9304f3 1157 // If the Package List can not be allocated, then return a NULL HII Handle\r
5c08e117 1158 //\r
be9304f3
ED
1159 if (PackageListHeader == NULL) {\r
1160 return EFI_OUT_OF_RESOURCES;\r
5c08e117 1161 }\r
1162\r
1163 //\r
be9304f3 1164 // Fill in the GUID and Length of the Package List Header\r
5c08e117 1165 //\r
be9304f3 1166 PackageListHeader->PackageLength = Length;\r
5c08e117 1167\r
1168 //\r
be9304f3 1169 // Copy String Data into Package list. \r
5c08e117 1170 //\r
be9304f3
ED
1171 Data = (UINT8 *)(PackageListHeader + 1);\r
1172 Length = ReadUnaligned32 ((UINT32 *) BdsDxeStrings) - sizeof (UINT32);\r
1173 CopyMem (Data, (UINT8 *) BdsDxeStrings + sizeof (UINT32), Length);\r
1174 \r
1175 //\r
1176 // Add End type HII package.\r
1177 //\r
1178 Data += Length;\r
1179 ((EFI_HII_PACKAGE_HEADER *) Data)->Type = EFI_HII_PACKAGE_END;\r
1180 ((EFI_HII_PACKAGE_HEADER *) Data)->Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
5c08e117 1181\r
1182 //\r
be9304f3 1183 // Update String package for BM\r
5c08e117 1184 //\r
be9304f3
ED
1185 CopyGuid (&PackageListHeader->PackageListGuid, &gBootMaintFormSetGuid);\r
1186 Status = gHiiDatabase->UpdatePackageList (gHiiDatabase, BmmCallbackInfo->BmmHiiHandle, PackageListHeader);\r
1187 \r
1188 //\r
1189 // Update String package for FE.\r
1190 //\r
1191 CopyGuid (&PackageListHeader->PackageListGuid, &gFileExploreFormSetGuid);\r
1192 Status = gHiiDatabase->UpdatePackageList (gHiiDatabase, BmmCallbackInfo->FeHiiHandle, PackageListHeader);\r
1193 \r
1194 FreePool (PackageListHeader);\r
5c08e117 1195\r
1196 //\r
75bf9d0e 1197 // Init OpCode Handle and Allocate space for creation of Buffer\r
5c08e117 1198 //\r
75bf9d0e
LG
1199 mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1200 if (mStartOpCodeHandle == NULL) {\r
4376a6f2 1201 Status = EFI_OUT_OF_RESOURCES;\r
1202 goto Exit;\r
5c08e117 1203 }\r
1204\r
75bf9d0e
LG
1205 mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
1206 if (mEndOpCodeHandle == NULL) {\r
1207 Status = EFI_OUT_OF_RESOURCES;\r
1208 goto Exit;\r
1209 }\r
1210\r
1211 //\r
1212 // Create Hii Extend Label OpCode as the start opcode\r
1213 //\r
1214 mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
1215 mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
1216\r
1217 //\r
1218 // Create Hii Extend Label OpCode as the end opcode\r
1219 //\r
1220 mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
1221 mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
1222 mEndLabel->Number = LABEL_END;\r
1223\r
5c08e117 1224 InitializeStringDepository ();\r
1225\r
1226 InitAllMenu (BmmCallbackInfo);\r
1227\r
1228 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleInpMenu);\r
1229 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleOutMenu);\r
1230 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleErrMenu);\r
1231 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &BootOptionMenu);\r
1232 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverOptionMenu);\r
1233 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &TerminalMenu);\r
1234 CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverMenu);\r
be9304f3
ED
1235 \r
1236 InitializeBmmConfig (BmmCallbackInfo);\r
5c08e117 1237\r
1238 //\r
1239 // Dispatch BMM main formset and File Explorer formset.\r
1240 //\r
1241 FormSetDispatcher (BmmCallbackInfo);\r
1242\r
1243 //\r
be9304f3 1244 // Clean up.\r
5c08e117 1245 //\r
5c08e117 1246 CleanUpStringDepository ();\r
be9304f3 1247 \r
5c08e117 1248 FreeAllMenu ();\r
1249\r
4376a6f2 1250Exit:\r
75bf9d0e
LG
1251 if (mStartOpCodeHandle != NULL) {\r
1252 HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
1253 }\r
1254\r
1255 if (mEndOpCodeHandle != NULL) {\r
1256 HiiFreeOpCodeHandle (mEndOpCodeHandle);\r
1257 }\r
1258\r
5c08e117 1259 return Status;\r
1260}\r
1261\r
be9304f3 1262\r
5c08e117 1263/**\r
1264 Initialized all Menu Option List.\r
1265\r
1266 @param CallbackData The BMM context data.\r
1267\r
1268**/\r
1269VOID\r
1270InitAllMenu (\r
1271 IN BMM_CALLBACK_DATA *CallbackData\r
1272 )\r
1273{\r
1274 InitializeListHead (&BootOptionMenu.Head);\r
1275 InitializeListHead (&DriverOptionMenu.Head);\r
1276 BOpt_GetBootOptions (CallbackData);\r
1277 BOpt_GetDriverOptions (CallbackData);\r
1278 BOpt_GetLegacyOptions ();\r
1279 InitializeListHead (&FsOptionMenu.Head);\r
1280 BOpt_FindDrivers ();\r
1281 InitializeListHead (&DirectoryMenu.Head);\r
1282 InitializeListHead (&ConsoleInpMenu.Head);\r
1283 InitializeListHead (&ConsoleOutMenu.Head);\r
1284 InitializeListHead (&ConsoleErrMenu.Head);\r
1285 InitializeListHead (&TerminalMenu.Head);\r
1286 LocateSerialIo ();\r
1287 GetAllConsoles ();\r
1288}\r
1289\r
1290/**\r
1291 Free up all Menu Option list.\r
1292\r
1293**/\r
1294VOID\r
1295FreeAllMenu (\r
1296 VOID\r
1297 )\r
1298{\r
1299 BOpt_FreeMenu (&DirectoryMenu);\r
1300 BOpt_FreeMenu (&FsOptionMenu);\r
1301 BOpt_FreeMenu (&BootOptionMenu);\r
1302 BOpt_FreeMenu (&DriverOptionMenu);\r
1303 BOpt_FreeMenu (&DriverMenu);\r
1304 BOpt_FreeLegacyOptions ();\r
1305 FreeAllConsoles ();\r
1306}\r
1307\r
1308/**\r
baf46e70 1309 Initialize all the string depositories.\r
5c08e117 1310\r
1311**/\r
1312VOID\r
1313InitializeStringDepository (\r
1314 VOID\r
1315 )\r
1316{\r
1317 STRING_DEPOSITORY *StringDepository;\r
1318 StringDepository = AllocateZeroPool (sizeof (STRING_DEPOSITORY) * STRING_DEPOSITORY_NUMBER);\r
1319 FileOptionStrDepository = StringDepository++;\r
1320 ConsoleOptionStrDepository = StringDepository++;\r
1321 BootOptionStrDepository = StringDepository++;\r
1322 BootOptionHelpStrDepository = StringDepository++;\r
1323 DriverOptionStrDepository = StringDepository++;\r
1324 DriverOptionHelpStrDepository = StringDepository++;\r
1325 TerminalStrDepository = StringDepository;\r
1326}\r
1327\r
1328/**\r
1329 Fetch a usable string node from the string depository and return the string token.\r
1330\r
1331 @param CallbackData The BMM context data.\r
1332 @param StringDepository The string repository.\r
1333\r
1334 @retval EFI_STRING_ID String token.\r
1335\r
1336**/\r
1337EFI_STRING_ID\r
1338GetStringTokenFromDepository (\r
1339 IN BMM_CALLBACK_DATA *CallbackData,\r
1340 IN STRING_DEPOSITORY *StringDepository\r
1341 )\r
1342{\r
1343 STRING_LIST_NODE *CurrentListNode;\r
1344 STRING_LIST_NODE *NextListNode;\r
1345\r
1346 CurrentListNode = StringDepository->CurrentNode;\r
1347\r
1348 if ((NULL != CurrentListNode) && (NULL != CurrentListNode->Next)) {\r
1349 //\r
1350 // Fetch one reclaimed node from the list.\r
1351 //\r
1352 NextListNode = StringDepository->CurrentNode->Next;\r
1353 } else {\r
1354 //\r
1355 // If there is no usable node in the list, update the list.\r
1356 //\r
1357 NextListNode = AllocateZeroPool (sizeof (STRING_LIST_NODE));\r
1358 ASSERT (NextListNode != NULL);\r
cb7d01c0 1359 NextListNode->StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, L" ", NULL);\r
5c08e117 1360 ASSERT (NextListNode->StringToken != 0);\r
1361\r
1362 StringDepository->TotalNodeNumber++;\r
1363\r
1364 if (NULL == CurrentListNode) {\r
1365 StringDepository->ListHead = NextListNode;\r
1366 } else {\r
1367 CurrentListNode->Next = NextListNode;\r
1368 }\r
1369 }\r
1370\r
1371 StringDepository->CurrentNode = NextListNode;\r
1372\r
1373 return StringDepository->CurrentNode->StringToken;\r
1374}\r
1375\r
1376/**\r
1377 Reclaim string depositories by moving the current node pointer to list head..\r
1378\r
1379**/\r
1380VOID\r
1381ReclaimStringDepository (\r
1382 VOID\r
1383 )\r
1384{\r
1385 UINTN DepositoryIndex;\r
1386 STRING_DEPOSITORY *StringDepository;\r
1387\r
1388 StringDepository = FileOptionStrDepository;\r
1389 for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
1390 StringDepository->CurrentNode = StringDepository->ListHead;\r
1391 StringDepository++;\r
1392 }\r
1393}\r
1394\r
1395/**\r
1396 Release resource for all the string depositories.\r
1397\r
1398**/\r
1399VOID\r
1400CleanUpStringDepository (\r
1401 VOID\r
1402 )\r
1403{\r
1404 UINTN NodeIndex;\r
1405 UINTN DepositoryIndex;\r
1406 STRING_LIST_NODE *CurrentListNode;\r
1407 STRING_LIST_NODE *NextListNode;\r
1408 STRING_DEPOSITORY *StringDepository;\r
1409\r
1410 //\r
1411 // Release string list nodes.\r
1412 //\r
1413 StringDepository = FileOptionStrDepository;\r
1414 for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; DepositoryIndex++) {\r
1415 CurrentListNode = StringDepository->ListHead;\r
1416 for (NodeIndex = 0; NodeIndex < StringDepository->TotalNodeNumber; NodeIndex++) {\r
1417 NextListNode = CurrentListNode->Next;\r
1418 FreePool (CurrentListNode);\r
1419 CurrentListNode = NextListNode;\r
1420 }\r
1421\r
1422 StringDepository++;\r
1423 }\r
1424 //\r
1425 // Release string depository.\r
1426 //\r
1427 FreePool (FileOptionStrDepository);\r
1428}\r
1429\r
1430/**\r
1431 Start boot maintenance manager\r
1432\r
1433 @retval EFI_SUCCESS If BMM is invoked successfully.\r
1434 @return Other value if BMM return unsuccessfully.\r
1435\r
1436**/\r
1437EFI_STATUS\r
1438BdsStartBootMaint (\r
1439 VOID\r
1440 )\r
1441{\r
1442 EFI_STATUS Status;\r
1443 LIST_ENTRY BdsBootOptionList;\r
1444\r
1445 InitializeListHead (&BdsBootOptionList);\r
1446\r
1447 //\r
1448 // Connect all prior to entering the platform setup menu.\r
1449 //\r
1450 if (!gConnectAllHappened) {\r
1451 BdsLibConnectAllDriversToAllControllers ();\r
1452 gConnectAllHappened = TRUE;\r
1453 }\r
1454 //\r
1455 // Have chance to enumerate boot device\r
1456 //\r
1457 BdsLibEnumerateAllBootOption (&BdsBootOptionList);\r
1458\r
16e5944a
RN
1459 //\r
1460 // Group the legacy boot options for the same device type\r
1461 //\r
1462 GroupMultipleLegacyBootOption4SameType ();\r
1463\r
5c08e117 1464 //\r
1465 // Init the BMM\r
1466 //\r
1467 Status = InitializeBM ();\r
1468\r
1469 return Status;\r
1470}\r
1471\r
1472/**\r
1473 Dispatch BMM formset and FileExplorer formset.\r
1474\r
1475\r
1476 @param CallbackData The BMM context data.\r
1477\r
1478 @retval EFI_SUCCESS If function complete successfully.\r
1479 @return Other value if the Setup Browser process BMM's pages and\r
1480 return unsuccessfully.\r
1481\r
1482**/\r
1483EFI_STATUS\r
1484FormSetDispatcher (\r
1485 IN BMM_CALLBACK_DATA *CallbackData\r
1486 )\r
1487{\r
1488 EFI_STATUS Status;\r
1489 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
1490\r
1491 while (TRUE) {\r
1492 UpdatePageId (CallbackData, FORM_MAIN_ID);\r
1493\r
1494 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
1495 Status = gFormBrowser2->SendForm (\r
1496 gFormBrowser2,\r
1497 &CallbackData->BmmHiiHandle,\r
1498 1,\r
e24fc103 1499 &gBootMaintFormSetGuid,\r
5c08e117 1500 0,\r
1501 NULL,\r
1502 &ActionRequest\r
1503 );\r
1504 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
1505 EnableResetRequired ();\r
1506 }\r
1507\r
1508 ReclaimStringDepository ();\r
1509\r
1510 //\r
1511 // When this Formset returns, check if we are going to explore files.\r
1512 //\r
13078b3f 1513 if (FileExplorerStateInActive != CallbackData->FeCurrentState) {\r
5c08e117 1514 UpdateFileExplorer (CallbackData, 0);\r
1515\r
1516 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
1517 Status = gFormBrowser2->SendForm (\r
1518 gFormBrowser2,\r
1519 &CallbackData->FeHiiHandle,\r
1520 1,\r
e24fc103 1521 &gFileExploreFormSetGuid,\r
5c08e117 1522 0,\r
1523 NULL,\r
1524 &ActionRequest\r
1525 );\r
1526 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
1527 EnableResetRequired ();\r
1528 }\r
1529\r
13078b3f 1530 CallbackData->FeCurrentState = FileExplorerStateInActive;\r
1531 CallbackData->FeDisplayContext = FileExplorerDisplayUnknown;\r
5c08e117 1532 ReclaimStringDepository ();\r
1533 } else {\r
1534 break;\r
1535 }\r
1536 }\r
1537\r
1538 return Status;\r
1539}\r
1540\r
be9304f3
ED
1541/**\r
1542 Intall BootMaint and FileExplorer HiiPackages.\r
1543\r
1544**/\r
1545EFI_STATUS\r
1546InitBMPackage (\r
1547 VOID\r
1548 )\r
1549{\r
1550 BMM_CALLBACK_DATA *BmmCallbackInfo;\r
1551 EFI_STATUS Status;\r
1552 UINT8 *Ptr;\r
1553 \r
1554 //\r
1555 // Create CallbackData structures for Driver Callback\r
1556 //\r
1557 BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA));\r
1558 if (BmmCallbackInfo == NULL) {\r
1559 return EFI_OUT_OF_RESOURCES;\r
1560 }\r
1561 \r
1562 //\r
1563 // Create LoadOption in BmmCallbackInfo for Driver Callback\r
1564 //\r
1565 Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
1566 if (Ptr == NULL) {\r
1567 FreePool (BmmCallbackInfo);\r
1568 BmmCallbackInfo = NULL;\r
1569 return EFI_OUT_OF_RESOURCES;\r
1570 }\r
1571 //\r
1572 // Initialize Bmm callback data.\r
1573 //\r
1574 BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
1575 Ptr += sizeof (BM_LOAD_CONTEXT);\r
1576\r
1577 BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
1578 Ptr += sizeof (BM_FILE_CONTEXT);\r
1579\r
1580 BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
1581 Ptr += sizeof (BM_HANDLE_CONTEXT);\r
1582\r
1583 BmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr;\r
1584\r
1585 BmmCallbackInfo->Signature = BMM_CALLBACK_DATA_SIGNATURE;\r
1586 BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig;\r
1587 BmmCallbackInfo->BmmConfigAccess.RouteConfig = BootMaintRouteConfig;\r
1588 BmmCallbackInfo->BmmConfigAccess.Callback = BootMaintCallback;\r
1589 BmmCallbackInfo->FeConfigAccess.ExtractConfig = FakeExtractConfig;\r
1590 BmmCallbackInfo->FeConfigAccess.RouteConfig = FileExplorerRouteConfig;\r
1591 BmmCallbackInfo->FeConfigAccess.Callback = FileExplorerCallback;\r
1592\r
1593 //\r
1594 // Install Device Path Protocol and Config Access protocol to driver handle\r
1595 //\r
1596 Status = gBS->InstallMultipleProtocolInterfaces (\r
1597 &BmmCallbackInfo->BmmDriverHandle,\r
1598 &gEfiDevicePathProtocolGuid,\r
1599 &mBmmHiiVendorDevicePath,\r
1600 &gEfiHiiConfigAccessProtocolGuid,\r
1601 &BmmCallbackInfo->BmmConfigAccess,\r
1602 NULL\r
1603 );\r
1604 ASSERT_EFI_ERROR (Status);\r
1605\r
1606 //\r
1607 // Install Device Path Protocol and Config Access protocol to driver handle\r
1608 //\r
1609 Status = gBS->InstallMultipleProtocolInterfaces (\r
1610 &BmmCallbackInfo->FeDriverHandle,\r
1611 &gEfiDevicePathProtocolGuid,\r
1612 &mFeHiiVendorDevicePath,\r
1613 &gEfiHiiConfigAccessProtocolGuid,\r
1614 &BmmCallbackInfo->FeConfigAccess,\r
1615 NULL\r
1616 );\r
1617 ASSERT_EFI_ERROR (Status);\r
1618\r
1619 //\r
1620 // Post our Boot Maint VFR binary to the HII database.\r
1621 //\r
1622 BmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
1623 &gBootMaintFormSetGuid,\r
1624 BmmCallbackInfo->BmmDriverHandle,\r
1625 BmBin,\r
1626 BdsDxeStrings,\r
1627 NULL\r
1628 );\r
1629 ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL);\r
1630\r
1631 //\r
1632 // Post our File Explorer VFR binary to the HII database.\r
1633 //\r
1634 BmmCallbackInfo->FeHiiHandle = HiiAddPackages (\r
1635 &gFileExploreFormSetGuid,\r
1636 BmmCallbackInfo->FeDriverHandle,\r
1637 FEBin,\r
1638 BdsDxeStrings,\r
1639 NULL\r
1640 );\r
1641 ASSERT (BmmCallbackInfo->FeHiiHandle != NULL);\r
1642 \r
1643 mBmmCallbackInfo = BmmCallbackInfo;\r
1644 \r
1645 return EFI_SUCCESS; \r
1646}\r
1647\r
1648/**\r
1649 Remvoe the intalled BootMaint and FileExplorer HiiPackages.\r
1650\r
1651**/\r
1652VOID\r
1653FreeBMPackage (\r
1654 VOID\r
1655 )\r
1656{\r
1657 BMM_CALLBACK_DATA *BmmCallbackInfo;\r
1658\r
1659 BmmCallbackInfo = mBmmCallbackInfo;\r
1660\r
1661 //\r
1662 // Remove our IFR data from HII database\r
1663 //\r
1664 HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle);\r
1665 HiiRemovePackages (BmmCallbackInfo->FeHiiHandle);\r
1666\r
1667 if (BmmCallbackInfo->FeDriverHandle != NULL) {\r
1668 gBS->UninstallMultipleProtocolInterfaces (\r
1669 BmmCallbackInfo->FeDriverHandle,\r
1670 &gEfiDevicePathProtocolGuid,\r
1671 &mFeHiiVendorDevicePath,\r
1672 &gEfiHiiConfigAccessProtocolGuid,\r
1673 &BmmCallbackInfo->FeConfigAccess,\r
1674 NULL\r
1675 );\r
1676 }\r
1677\r
1678 if (BmmCallbackInfo->BmmDriverHandle != NULL) {\r
1679 gBS->UninstallMultipleProtocolInterfaces (\r
1680 BmmCallbackInfo->BmmDriverHandle,\r
1681 &gEfiDevicePathProtocolGuid,\r
1682 &mBmmHiiVendorDevicePath,\r
1683 &gEfiHiiConfigAccessProtocolGuid,\r
1684 &BmmCallbackInfo->BmmConfigAccess,\r
1685 NULL\r
1686 );\r
1687 }\r
1688\r
1689 FreePool (BmmCallbackInfo->LoadContext);\r
1690 FreePool (BmmCallbackInfo);\r
1691\r
1692 mBmmCallbackInfo = NULL; \r
1693 \r
1694 return;\r
1695}\r
1696\r