]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/BdsDxe/BootMaint/Variable.c
Code scrube for MdeModule Definitions.
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / BootMaint / Variable.c
CommitLineData
fd6a62f3 1/** @file\r
2 Variable operation that will be used by bootmaint\r
93e3992d 3\r
fd6a62f3 4Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
93e3992d 5All rights reserved. This program and the accompanying materials\r
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
fd6a62f3 13**/\r
93e3992d 14\r
15#include "BootMaint.h"\r
16\r
b30312ba 17/**\r
93e3992d 18 Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
19 After deleting this boot option, call Var_ChangeBootOrder to\r
20 make sure BootOrder is in valid state.\r
21\r
93e3992d 22\r
b30312ba 23 @param VOID EDES_TODO: Add parameter description\r
24\r
25 EDES_TODO: Incomplete Descriptions EFI_SUCCESS\r
26 EDES_TODO: Incomplete Descriptions Others\r
93e3992d 27\r
b30312ba 28**/\r
29EFI_STATUS\r
30Var_DelBootOption (\r
31 VOID\r
32 )\r
93e3992d 33{\r
34 BM_MENU_ENTRY *NewMenuEntry;\r
35 BM_LOAD_CONTEXT *NewLoadContext;\r
36 UINT16 BootString[10];\r
37 EFI_STATUS Status;\r
38 UINTN Index;\r
39 UINTN Index2;\r
40\r
41 Status = EFI_SUCCESS;\r
42 Index2 = 0;\r
43 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
44 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));\r
45 if (NULL == NewMenuEntry) {\r
46 return EFI_NOT_FOUND;\r
47 }\r
48\r
49 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
50 if (!NewLoadContext->Deleted) {\r
51 continue;\r
52 }\r
53\r
54 UnicodeSPrint (\r
55 BootString,\r
56 sizeof (BootString),\r
57 L"Boot%04x",\r
58 NewMenuEntry->OptionNumber\r
59 );\r
60\r
61 EfiLibDeleteVariable (BootString, &gEfiGlobalVariableGuid);\r
62 Index2++;\r
63 //\r
64 // If current Load Option is the same as BootNext,\r
65 // must delete BootNext in order to make sure\r
66 // there will be no panic on next boot\r
67 //\r
68 if (NewLoadContext->IsBootNext) {\r
69 EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
70 }\r
71\r
72 RemoveEntryList (&NewMenuEntry->Link);\r
73 BOpt_DestroyMenuEntry (NewMenuEntry);\r
74 NewMenuEntry = NULL;\r
75 }\r
76\r
77 BootOptionMenu.MenuNumber -= Index2;\r
78\r
79 Status = Var_ChangeBootOrder ();\r
80 return Status;\r
81}\r
82\r
b30312ba 83/**\r
93e3992d 84 After any operation on Boot####, there will be a discrepancy in BootOrder.\r
85 Since some are missing but in BootOrder, while some are present but are\r
86 not reflected by BootOrder. Then a function rebuild BootOrder from\r
87 scratch by content from BootOptionMenu is needed.\r
88\r
93e3992d 89\r
b30312ba 90 @param VOID EDES_TODO: Add parameter description\r
91\r
92 EDES_TODO: Incomplete Descriptions EFI_SUCCESS\r
93 EDES_TODO: Incomplete Descriptions Others\r
93e3992d 94\r
b30312ba 95**/\r
96EFI_STATUS\r
97Var_ChangeBootOrder (\r
98 VOID\r
99 )\r
93e3992d 100{\r
101\r
102 EFI_STATUS Status;\r
103 BM_MENU_ENTRY *NewMenuEntry;\r
104 UINT16 *BootOrderList;\r
105 UINT16 *BootOrderListPtr;\r
106 UINTN BootOrderListSize;\r
107 UINTN Index;\r
108\r
109 BootOrderList = NULL;\r
110 BootOrderListSize = 0;\r
111\r
112 //\r
113 // First check whether BootOrder is present in current configuration\r
114 //\r
115 BootOrderList = BdsLibGetVariableAndSize (\r
116 L"BootOrder",\r
117 &gEfiGlobalVariableGuid,\r
118 &BootOrderListSize\r
119 );\r
120\r
121 //\r
122 // If exists, delete it to hold new BootOrder\r
123 //\r
a78b08d1 124 if (BootOrderList != NULL) {\r
93e3992d 125 EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
126 SafeFreePool (BootOrderList);\r
127 BootOrderList = NULL;\r
128 }\r
129 //\r
130 // Maybe here should be some check method to ensure that\r
131 // no new added boot options will be added\r
132 // but the setup engine now will give only one callback\r
133 // that is to say, user are granted only one chance to\r
134 // decide whether the boot option will be added or not\r
135 // there should be no indictor to show whether this\r
136 // is a "new" boot option\r
137 //\r
138 BootOrderListSize = BootOptionMenu.MenuNumber;\r
139\r
140 if (BootOrderListSize > 0) {\r
141 BootOrderList = EfiAllocateZeroPool (BootOrderListSize * sizeof (UINT16));\r
142 ASSERT (BootOrderList != NULL);\r
143 BootOrderListPtr = BootOrderList;\r
144\r
145 //\r
146 // Get all current used Boot#### from BootOptionMenu.\r
147 // OptionNumber in each BM_LOAD_OPTION is really its\r
148 // #### value.\r
149 //\r
150 for (Index = 0; Index < BootOrderListSize; Index++) {\r
151 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
152 *BootOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
153 BootOrderList++;\r
154 }\r
155\r
156 BootOrderList = BootOrderListPtr;\r
157\r
158 //\r
159 // After building the BootOrderList, write it back\r
160 //\r
161 Status = gRT->SetVariable (\r
162 L"BootOrder",\r
163 &gEfiGlobalVariableGuid,\r
164 VAR_FLAG,\r
165 BootOrderListSize * sizeof (UINT16),\r
166 BootOrderList\r
167 );\r
168 if (EFI_ERROR (Status)) {\r
169 return Status;\r
170 }\r
171 }\r
172 return EFI_SUCCESS;\r
173}\r
174\r
b30312ba 175/**\r
93e3992d 176 Delete Load Option that represent a Deleted state in BootOptionMenu.\r
177 After deleting this Driver option, call Var_ChangeDriverOrder to\r
178 make sure DriverOrder is in valid state.\r
179\r
93e3992d 180\r
b30312ba 181 @param VOID EDES_TODO: Add parameter description\r
182\r
183 EDES_TODO: Incomplete Descriptions EFI_SUCCESS\r
184 EDES_TODO: Incomplete Descriptions Others\r
93e3992d 185\r
b30312ba 186**/\r
187EFI_STATUS\r
188Var_DelDriverOption (\r
189 VOID\r
190 )\r
93e3992d 191{\r
192 BM_MENU_ENTRY *NewMenuEntry;\r
193 BM_LOAD_CONTEXT *NewLoadContext;\r
194 UINT16 DriverString[12];\r
195 EFI_STATUS Status;\r
196 UINTN Index;\r
197 UINTN Index2;\r
198\r
199 Status = EFI_SUCCESS;\r
200 Index2 = 0;\r
201 for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
202 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));\r
203 if (NULL == NewMenuEntry) {\r
204 return EFI_NOT_FOUND;\r
205 }\r
206\r
207 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
208 if (!NewLoadContext->Deleted) {\r
209 continue;\r
210 }\r
211\r
212 UnicodeSPrint (\r
213 DriverString,\r
214 sizeof (DriverString),\r
215 L"Driver%04x",\r
216 NewMenuEntry->OptionNumber\r
217 );\r
218\r
219 EfiLibDeleteVariable (DriverString, &gEfiGlobalVariableGuid);\r
220 Index2++;\r
221\r
222 RemoveEntryList (&NewMenuEntry->Link);\r
223 BOpt_DestroyMenuEntry (NewMenuEntry);\r
224 NewMenuEntry = NULL;\r
225 }\r
226\r
227 DriverOptionMenu.MenuNumber -= Index2;\r
228\r
229 Status = Var_ChangeDriverOrder ();\r
230 return Status;\r
231}\r
232\r
b30312ba 233/**\r
93e3992d 234 After any operation on Driver####, there will be a discrepancy in\r
235 DriverOrder. Since some are missing but in DriverOrder, while some\r
236 are present but are not reflected by DriverOrder. Then a function\r
237 rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
238 needed.\r
239\r
93e3992d 240\r
b30312ba 241 @param VOID EDES_TODO: Add parameter description\r
93e3992d 242\r
b30312ba 243 EDES_TODO: Incomplete Descriptions EFI_SUCCESS\r
244 EDES_TODO: Incomplete Descriptions Others\r
245\r
246**/\r
247EFI_STATUS\r
248Var_ChangeDriverOrder (\r
249 VOID\r
250 )\r
93e3992d 251{\r
252 EFI_STATUS Status;\r
253 BM_MENU_ENTRY *NewMenuEntry;\r
254 UINT16 *DriverOrderList;\r
255 UINT16 *DriverOrderListPtr;\r
256 UINTN DriverOrderListSize;\r
257 UINTN Index;\r
258\r
259 DriverOrderList = NULL;\r
260 DriverOrderListSize = 0;\r
261\r
262 //\r
263 // First check whether DriverOrder is present in current configuration\r
264 //\r
265 DriverOrderList = BdsLibGetVariableAndSize (\r
266 L"DriverOrder",\r
267 &gEfiGlobalVariableGuid,\r
268 &DriverOrderListSize\r
269 );\r
270\r
271 //\r
272 // If exists, delete it to hold new DriverOrder\r
273 //\r
a78b08d1 274 if (DriverOrderList != NULL) {\r
93e3992d 275 EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
276 SafeFreePool (DriverOrderList);\r
277 DriverOrderList = NULL;\r
278 }\r
279\r
280 DriverOrderListSize = DriverOptionMenu.MenuNumber;\r
281\r
282 if (DriverOrderListSize > 0) {\r
283 DriverOrderList = EfiAllocateZeroPool (DriverOrderListSize * sizeof (UINT16));\r
284 ASSERT (DriverOrderList != NULL);\r
285 DriverOrderListPtr = DriverOrderList;\r
286\r
287 //\r
288 // Get all current used Driver#### from DriverOptionMenu.\r
289 // OptionNumber in each BM_LOAD_OPTION is really its\r
290 // #### value.\r
291 //\r
292 for (Index = 0; Index < DriverOrderListSize; Index++) {\r
293 NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
294 *DriverOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
295 DriverOrderList++;\r
296 }\r
297\r
298 DriverOrderList = DriverOrderListPtr;\r
299\r
300 //\r
301 // After building the DriverOrderList, write it back\r
302 //\r
303 Status = gRT->SetVariable (\r
304 L"DriverOrder",\r
305 &gEfiGlobalVariableGuid,\r
306 VAR_FLAG,\r
307 DriverOrderListSize * sizeof (UINT16),\r
308 DriverOrderList\r
309 );\r
310 if (EFI_ERROR (Status)) {\r
311 return Status;\r
312 }\r
313 }\r
314 return EFI_SUCCESS;\r
315}\r
316\r
b30312ba 317/**\r
a78b08d1 318 EDES_TODO: Add function description.\r
b30312ba 319\r
320 @param VOID EDES_TODO: Add parameter description\r
321\r
322 @return EDES_TODO: Add description for return value\r
323\r
324**/\r
93e3992d 325VOID\r
326Var_UpdateAllConsoleOption (\r
327 VOID\r
328 )\r
329{\r
330 EFI_DEVICE_PATH_PROTOCOL *OutDevicePath;\r
331 EFI_DEVICE_PATH_PROTOCOL *InpDevicePath;\r
332 EFI_DEVICE_PATH_PROTOCOL *ErrDevicePath;\r
333 EFI_STATUS Status;\r
334\r
335 OutDevicePath = EfiLibGetVariable (L"ConOut", &gEfiGlobalVariableGuid);\r
336 InpDevicePath = EfiLibGetVariable (L"ConIn", &gEfiGlobalVariableGuid);\r
337 ErrDevicePath = EfiLibGetVariable (L"ErrOut", &gEfiGlobalVariableGuid);\r
a78b08d1 338 if (OutDevicePath != NULL) {\r
93e3992d 339 ChangeVariableDevicePath (OutDevicePath);\r
340 Status = gRT->SetVariable (\r
341 L"ConOut",\r
342 &gEfiGlobalVariableGuid,\r
343 VAR_FLAG,\r
344 GetDevicePathSize (OutDevicePath),\r
345 OutDevicePath\r
346 );\r
347 ASSERT (!EFI_ERROR (Status));\r
348 }\r
349\r
a78b08d1 350 if (InpDevicePath != NULL) {\r
93e3992d 351 ChangeVariableDevicePath (InpDevicePath);\r
352 Status = gRT->SetVariable (\r
353 L"ConIn",\r
354 &gEfiGlobalVariableGuid,\r
355 VAR_FLAG,\r
356 GetDevicePathSize (InpDevicePath),\r
357 InpDevicePath\r
358 );\r
359 ASSERT (!EFI_ERROR (Status));\r
360 }\r
361\r
a78b08d1 362 if (ErrDevicePath != NULL) {\r
93e3992d 363 ChangeVariableDevicePath (ErrDevicePath);\r
364 Status = gRT->SetVariable (\r
365 L"ErrOut",\r
366 &gEfiGlobalVariableGuid,\r
367 VAR_FLAG,\r
368 GetDevicePathSize (ErrDevicePath),\r
369 ErrDevicePath\r
370 );\r
371 ASSERT (!EFI_ERROR (Status));\r
372 }\r
373}\r
374\r
b30312ba 375/**\r
a78b08d1 376 EDES_TODO: Add function description.\r
b30312ba 377\r
378 @param ConsoleName EDES_TODO: Add parameter description\r
379 @param ConsoleMenu EDES_TODO: Add parameter description\r
380 @param UpdatePageId EDES_TODO: Add parameter description\r
381\r
382 @return EDES_TODO: Add description for return value\r
383\r
384**/\r
93e3992d 385EFI_STATUS\r
386Var_UpdateConsoleOption (\r
387 IN UINT16 *ConsoleName,\r
388 IN BM_MENU_OPTION *ConsoleMenu,\r
389 IN UINT16 UpdatePageId\r
390 )\r
391{\r
392 EFI_DEVICE_PATH_PROTOCOL *ConDevicePath;\r
393 BM_MENU_ENTRY *NewMenuEntry;\r
394 BM_CONSOLE_CONTEXT *NewConsoleContext;\r
395 BM_TERMINAL_CONTEXT *NewTerminalContext;\r
396 EFI_STATUS Status;\r
397 VENDOR_DEVICE_PATH Vendor;\r
398 EFI_DEVICE_PATH_PROTOCOL *TerminalDevicePath;\r
399 UINTN Index;\r
400\r
401 ConDevicePath = EfiLibGetVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
402 if (ConDevicePath != NULL) {\r
403 EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
404 SafeFreePool (ConDevicePath);\r
405 ConDevicePath = NULL;\r
406 };\r
407\r
408 //\r
409 // First add all console input device to it from console input menu\r
410 //\r
411 for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
412 NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
413 if (NULL == NewMenuEntry) {\r
414 return EFI_NOT_FOUND;\r
415 }\r
416\r
417 NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
418 if (NewConsoleContext->IsActive) {\r
419 ConDevicePath = AppendDevicePathInstance (\r
420 ConDevicePath,\r
421 NewConsoleContext->DevicePath\r
422 );\r
423 }\r
424 }\r
425\r
426 for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
427 NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
428 if (NULL == NewMenuEntry) {\r
429 return EFI_NOT_FOUND;\r
430 }\r
431\r
432 NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
a78b08d1 433 if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
434 ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
435 ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
93e3992d 436 ) {\r
437 Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
438 Vendor.Header.SubType = MSG_VENDOR_DP;\r
439 CopyMem (\r
440 &Vendor.Guid,\r
441 &Guid[NewTerminalContext->TerminalType],\r
442 sizeof (EFI_GUID)\r
443 );\r
444 SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
445 TerminalDevicePath = AppendDevicePathNode (\r
446 NewTerminalContext->DevicePath,\r
447 (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
448 );\r
449 ASSERT (TerminalDevicePath != NULL);\r
450 ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
451 ConDevicePath = AppendDevicePathInstance (\r
452 ConDevicePath,\r
453 TerminalDevicePath\r
454 );\r
455 }\r
456 }\r
457\r
a78b08d1 458 if (ConDevicePath != NULL) {\r
93e3992d 459 Status = gRT->SetVariable (\r
460 ConsoleName,\r
461 &gEfiGlobalVariableGuid,\r
462 VAR_FLAG,\r
463 GetDevicePathSize (ConDevicePath),\r
464 ConDevicePath\r
465 );\r
466 if (EFI_ERROR (Status)) {\r
467 return Status;\r
468 }\r
469 }\r
470\r
471 return EFI_SUCCESS;\r
472\r
473}\r
474\r
b30312ba 475/**\r
a78b08d1 476 EDES_TODO: Add function description.\r
b30312ba 477\r
478 @param VOID EDES_TODO: Add parameter description\r
479\r
480 @return EDES_TODO: Add description for return value\r
481\r
482**/\r
93e3992d 483EFI_STATUS\r
484Var_UpdateConsoleInpOption (\r
485 VOID\r
486 )\r
487{\r
488 return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);\r
489}\r
490\r
b30312ba 491/**\r
a78b08d1 492 EDES_TODO: Add function description.\r
b30312ba 493\r
494 @param VOID EDES_TODO: Add parameter description\r
495\r
496 @return EDES_TODO: Add description for return value\r
497\r
498**/\r
93e3992d 499EFI_STATUS\r
500Var_UpdateConsoleOutOption (\r
501 VOID\r
502 )\r
503{\r
504 return Var_UpdateConsoleOption (L"ConOut", &ConsoleOutMenu, FORM_CON_OUT_ID);\r
505}\r
506\r
b30312ba 507/**\r
a78b08d1 508 EDES_TODO: Add function description.\r
b30312ba 509\r
510 @param VOID EDES_TODO: Add parameter description\r
511\r
512 @return EDES_TODO: Add description for return value\r
513\r
514**/\r
93e3992d 515EFI_STATUS\r
516Var_UpdateErrorOutOption (\r
517 VOID\r
518 )\r
519{\r
520 return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);\r
521}\r
522\r
b30312ba 523/**\r
a78b08d1 524 EDES_TODO: Add function description.\r
b30312ba 525\r
526 @param CallbackData EDES_TODO: Add parameter description\r
527 @param HiiHandle EDES_TODO: Add parameter description\r
528 @param DescriptionData EDES_TODO: Add parameter description\r
529 @param OptionalData EDES_TODO: Add parameter description\r
530 @param ForceReconnect EDES_TODO: Add parameter description\r
531\r
532 @return EDES_TODO: Add description for return value\r
533\r
534**/\r
93e3992d 535EFI_STATUS\r
536Var_UpdateDriverOption (\r
537 IN BMM_CALLBACK_DATA *CallbackData,\r
538 IN EFI_HII_HANDLE HiiHandle,\r
539 IN UINT16 *DescriptionData,\r
540 IN UINT16 *OptionalData,\r
541 IN UINT8 ForceReconnect\r
542 )\r
543{\r
544 UINT16 Index;\r
545 UINT16 *DriverOrderList;\r
546 UINT16 *NewDriverOrderList;\r
547 UINT16 DriverString[12];\r
548 UINTN DriverOrderListSize;\r
549 VOID *Buffer;\r
550 UINTN BufferSize;\r
551 UINT8 *Ptr;\r
552 BM_MENU_ENTRY *NewMenuEntry;\r
553 BM_LOAD_CONTEXT *NewLoadContext;\r
554 BOOLEAN OptionalDataExist;\r
555 EFI_STATUS Status;\r
556\r
557 OptionalDataExist = FALSE;\r
558\r
559 Index = BOpt_GetDriverOptionNumber ();\r
560 UnicodeSPrint (\r
561 DriverString,\r
562 sizeof (DriverString),\r
563 L"Driver%04x",\r
564 Index\r
565 );\r
566\r
567 if (*DescriptionData == 0x0000) {\r
568 StrCpy (DescriptionData, DriverString);\r
569 }\r
570\r
571 BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData);\r
572 BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
573\r
574 if (*OptionalData != 0x0000) {\r
575 OptionalDataExist = TRUE;\r
576 BufferSize += StrSize (OptionalData);\r
577 }\r
578\r
579 Buffer = EfiAllocateZeroPool (BufferSize);\r
580 if (NULL == Buffer) {\r
581 return EFI_OUT_OF_RESOURCES;\r
582 }\r
583\r
584 NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
585 if (NULL == NewMenuEntry) {\r
586 return EFI_OUT_OF_RESOURCES;\r
587 }\r
588\r
589 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
590 NewLoadContext->Deleted = FALSE;\r
591 NewLoadContext->LoadOptionSize = BufferSize;\r
592 Ptr = (UINT8 *) Buffer;\r
593 NewLoadContext->LoadOption = Ptr;\r
594 *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
595 NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
596 NewLoadContext->IsActive = TRUE;\r
597 NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
598\r
599 Ptr += sizeof (UINT32);\r
600 *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
601 NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
602\r
603 Ptr += sizeof (UINT16);\r
604 CopyMem (\r
605 Ptr,\r
606 DescriptionData,\r
607 StrSize (DescriptionData)\r
608 );\r
609\r
610 NewLoadContext->Description = EfiAllocateZeroPool (StrSize (DescriptionData));\r
611 ASSERT (NewLoadContext->Description != NULL);\r
612 NewMenuEntry->DisplayString = NewLoadContext->Description;\r
613 CopyMem (\r
614 NewLoadContext->Description,\r
615 (VOID *) Ptr,\r
616 StrSize (DescriptionData)\r
617 );\r
618\r
619 Ptr += StrSize (DescriptionData);\r
620 CopyMem (\r
621 Ptr,\r
622 CallbackData->LoadContext->FilePathList,\r
623 GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
624 );\r
625\r
626 NewLoadContext->FilePathList = EfiAllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
627 ASSERT (NewLoadContext->FilePathList != NULL);\r
628\r
629 CopyMem (\r
630 NewLoadContext->FilePathList,\r
631 (VOID *) Ptr,\r
632 GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
633 );\r
634\r
635 NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);\r
636 NewMenuEntry->OptionNumber = Index;\r
637 NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
638 CallbackData,\r
639 DriverOptionStrDepository\r
640 );\r
9226efe5 641 HiiLibNewString (HiiHandle, &NewMenuEntry->DisplayStringToken, NewMenuEntry->DisplayString);\r
93e3992d 642\r
643 NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
644 CallbackData,\r
645 DriverOptionHelpStrDepository\r
646 );\r
9226efe5 647 HiiLibNewString (HiiHandle, &NewMenuEntry->HelpStringToken, NewMenuEntry->HelpString);\r
93e3992d 648\r
649 if (OptionalDataExist) {\r
650 Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
651\r
652 CopyMem (\r
653 Ptr,\r
654 OptionalData,\r
655 StrSize (OptionalData)\r
656 );\r
657 }\r
658\r
659 Status = gRT->SetVariable (\r
660 DriverString,\r
661 &gEfiGlobalVariableGuid,\r
662 VAR_FLAG,\r
663 BufferSize,\r
664 Buffer\r
665 );\r
666 ASSERT_EFI_ERROR (Status);\r
667 DriverOrderList = BdsLibGetVariableAndSize (\r
668 L"DriverOrder",\r
669 &gEfiGlobalVariableGuid,\r
670 &DriverOrderListSize\r
671 );\r
672 NewDriverOrderList = EfiAllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
673 ASSERT (NewDriverOrderList != NULL);\r
674 CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
675 NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
676 if (DriverOrderList != NULL) {\r
677 EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
678 }\r
679\r
680 Status = gRT->SetVariable (\r
681 L"DriverOrder",\r
682 &gEfiGlobalVariableGuid,\r
683 VAR_FLAG,\r
684 DriverOrderListSize + sizeof (UINT16),\r
685 NewDriverOrderList\r
686 );\r
687 ASSERT_EFI_ERROR (Status);\r
688 SafeFreePool (DriverOrderList);\r
689 DriverOrderList = NULL;\r
690 SafeFreePool (NewDriverOrderList);\r
691 NewDriverOrderList = NULL;\r
692 InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
693 DriverOptionMenu.MenuNumber++;\r
694\r
695 *DescriptionData = 0x0000;\r
696 *OptionalData = 0x0000;\r
697 return EFI_SUCCESS;\r
698}\r
699\r
b30312ba 700/**\r
a78b08d1 701 EDES_TODO: Add function description.\r
b30312ba 702\r
703 @param CallbackData EDES_TODO: Add parameter description\r
704 @param NvRamMap EDES_TODO: Add parameter description\r
705\r
706 @return EDES_TODO: Add description for return value\r
707\r
708**/\r
93e3992d 709EFI_STATUS\r
710Var_UpdateBootOption (\r
711 IN BMM_CALLBACK_DATA *CallbackData,\r
712 IN FILE_EXPLORER_NV_DATA *NvRamMap\r
713 )\r
714{\r
715 UINT16 *BootOrderList;\r
716 UINT16 *NewBootOrderList;\r
717 UINTN BootOrderListSize;\r
718 UINT16 BootString[10];\r
719 VOID *Buffer;\r
720 UINTN BufferSize;\r
721 UINT8 *Ptr;\r
722 UINT16 Index;\r
723 BM_MENU_ENTRY *NewMenuEntry;\r
724 BM_LOAD_CONTEXT *NewLoadContext;\r
725 BOOLEAN OptionalDataExist;\r
726 EFI_STATUS Status;\r
727\r
728 OptionalDataExist = FALSE;\r
729\r
730 Index = BOpt_GetBootOptionNumber () ;\r
731 UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
732\r
733 if (NvRamMap->DescriptionData[0] == 0x0000) {\r
734 StrCpy (NvRamMap->DescriptionData, BootString);\r
735 }\r
736\r
737 BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->DescriptionData);\r
738 BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
739\r
740 if (NvRamMap->OptionalData[0] != 0x0000) {\r
741 OptionalDataExist = TRUE;\r
742 BufferSize += StrSize (NvRamMap->OptionalData);\r
743 }\r
744\r
745 Buffer = EfiAllocateZeroPool (BufferSize);\r
746 if (NULL == Buffer) {\r
747 return EFI_OUT_OF_RESOURCES;\r
748 }\r
749\r
750 NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
751 if (NULL == NewMenuEntry) {\r
752 return EFI_OUT_OF_RESOURCES;\r
753 }\r
754\r
755 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
756 NewLoadContext->Deleted = FALSE;\r
757 NewLoadContext->LoadOptionSize = BufferSize;\r
758 Ptr = (UINT8 *) Buffer;\r
759 NewLoadContext->LoadOption = Ptr;\r
760 *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
761 NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
762 NewLoadContext->IsActive = TRUE;\r
763 NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
764\r
765 Ptr += sizeof (UINT32);\r
766 *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
767 NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
768 Ptr += sizeof (UINT16);\r
769\r
770 CopyMem (\r
771 Ptr,\r
772 NvRamMap->DescriptionData,\r
773 StrSize (NvRamMap->DescriptionData)\r
774 );\r
775\r
776 NewLoadContext->Description = EfiAllocateZeroPool (StrSize (NvRamMap->DescriptionData));\r
777 ASSERT (NewLoadContext->Description != NULL);\r
778\r
779 NewMenuEntry->DisplayString = NewLoadContext->Description;\r
780 CopyMem (\r
781 NewLoadContext->Description,\r
782 (VOID *) Ptr,\r
783 StrSize (NvRamMap->DescriptionData)\r
784 );\r
785\r
786 Ptr += StrSize (NvRamMap->DescriptionData);\r
787 CopyMem (\r
788 Ptr,\r
789 CallbackData->LoadContext->FilePathList,\r
790 GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
791 );\r
792\r
793 NewLoadContext->FilePathList = EfiAllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
794 ASSERT (NewLoadContext->FilePathList != NULL);\r
795\r
796 CopyMem (\r
797 NewLoadContext->FilePathList,\r
798 (VOID *) Ptr,\r
799 GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
800 );\r
801\r
802 NewMenuEntry->HelpString = DevicePathToStr (NewLoadContext->FilePathList);\r
803 NewMenuEntry->OptionNumber = Index;\r
804 NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
805 CallbackData,\r
806 BootOptionStrDepository\r
807 );\r
9226efe5 808 HiiLibNewString (CallbackData->FeHiiHandle, &NewMenuEntry->DisplayStringToken, NewMenuEntry->DisplayString);\r
93e3992d 809\r
810 NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
811 CallbackData,\r
812 BootOptionHelpStrDepository\r
813 );\r
9226efe5 814 HiiLibNewString (CallbackData->FeHiiHandle, &NewMenuEntry->HelpStringToken, NewMenuEntry->HelpString);\r
93e3992d 815\r
816 if (OptionalDataExist) {\r
817 Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
818\r
819 CopyMem (Ptr, NvRamMap->OptionalData, StrSize (NvRamMap->OptionalData));\r
820 }\r
821\r
822 Status = gRT->SetVariable (\r
823 BootString,\r
824 &gEfiGlobalVariableGuid,\r
825 VAR_FLAG,\r
826 BufferSize,\r
827 Buffer\r
828 );\r
829 ASSERT_EFI_ERROR (Status);\r
830\r
831 BootOrderList = BdsLibGetVariableAndSize (\r
832 L"BootOrder",\r
833 &gEfiGlobalVariableGuid,\r
834 &BootOrderListSize\r
835 );\r
836\r
837 NewBootOrderList = EfiAllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
838 ASSERT (NewBootOrderList != NULL);\r
839 CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
840 NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
841\r
842 if (BootOrderList != NULL) {\r
843 EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
844 }\r
845\r
846 Status = gRT->SetVariable (\r
847 L"BootOrder",\r
848 &gEfiGlobalVariableGuid,\r
849 VAR_FLAG,\r
850 BootOrderListSize + sizeof (UINT16),\r
851 NewBootOrderList\r
852 );\r
853 ASSERT_EFI_ERROR (Status);\r
854\r
855 SafeFreePool (BootOrderList);\r
856 BootOrderList = NULL;\r
857 SafeFreePool (NewBootOrderList);\r
858 NewBootOrderList = NULL;\r
859 InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
860 BootOptionMenu.MenuNumber++;\r
861\r
862 NvRamMap->DescriptionData[0] = 0x0000;\r
863 NvRamMap->OptionalData[0] = 0x0000;\r
864 return EFI_SUCCESS;\r
865}\r
866\r
b30312ba 867/**\r
a78b08d1 868 EDES_TODO: Add function description.\r
b30312ba 869\r
870 @param CallbackData EDES_TODO: Add parameter description\r
871\r
872 @return EDES_TODO: Add description for return value\r
873\r
874**/\r
93e3992d 875EFI_STATUS\r
876Var_UpdateBootNext (\r
877 IN BMM_CALLBACK_DATA *CallbackData\r
878 )\r
879{\r
880 BM_MENU_ENTRY *NewMenuEntry;\r
881 BM_LOAD_CONTEXT *NewLoadContext;\r
882 BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
883 UINT16 Index;\r
884 EFI_STATUS Status;\r
885\r
886 Status = EFI_SUCCESS;\r
887 CurrentFakeNVMap = &CallbackData->BmmFakeNvData;\r
888 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
889 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
890 if (NULL == NewMenuEntry) {\r
891 return EFI_NOT_FOUND;\r
892 }\r
893\r
894 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
895 NewLoadContext->IsBootNext = FALSE;\r
896 }\r
897\r
898 if (CurrentFakeNVMap->BootNext == BootOptionMenu.MenuNumber) {\r
899 EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
900 return EFI_SUCCESS;\r
901 }\r
902\r
903 NewMenuEntry = BOpt_GetMenuEntry (\r
904 &BootOptionMenu,\r
905 CurrentFakeNVMap->BootNext\r
906 );\r
907 if (NULL == NewMenuEntry) {\r
908 return EFI_NOT_FOUND;\r
909 }\r
910\r
911 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
912 Status = gRT->SetVariable (\r
913 L"BootNext",\r
914 &gEfiGlobalVariableGuid,\r
915 VAR_FLAG,\r
916 sizeof (UINT16),\r
917 &NewMenuEntry->OptionNumber\r
918 );\r
919 NewLoadContext->IsBootNext = TRUE;\r
920 CallbackData->BmmOldFakeNVData.BootNext = CurrentFakeNVMap->BootNext;\r
921 return Status;\r
922}\r
923\r
b30312ba 924/**\r
a78b08d1 925 EDES_TODO: Add function description.\r
b30312ba 926\r
927 @param CallbackData EDES_TODO: Add parameter description\r
928\r
929 @return EDES_TODO: Add description for return value\r
930\r
931**/\r
93e3992d 932EFI_STATUS\r
933Var_UpdateBootOrder (\r
934 IN BMM_CALLBACK_DATA *CallbackData\r
935 )\r
936{\r
937 EFI_STATUS Status;\r
938 UINT16 Index;\r
939 UINT16 *BootOrderList;\r
940 UINT16 *NewBootOrderList;\r
941 UINTN BootOrderListSize;\r
942 UINT8 *Map;\r
943\r
944 BootOrderList = NULL;\r
945 BootOrderListSize = 0;\r
946\r
947 //\r
948 // First check whether BootOrder is present in current configuration\r
949 //\r
950 BootOrderList = BdsLibGetVariableAndSize (\r
951 L"BootOrder",\r
952 &gEfiGlobalVariableGuid,\r
953 &BootOrderListSize\r
954 );\r
955\r
956 NewBootOrderList = EfiAllocateZeroPool (BootOrderListSize);\r
a78b08d1 957 if (NewBootOrderList == NULL) {\r
93e3992d 958 return EFI_OUT_OF_RESOURCES;\r
959 }\r
960\r
961 Map = EfiAllocateZeroPool (BootOrderListSize / sizeof (UINT16));\r
a78b08d1 962 if (Map == NULL) {\r
93e3992d 963 return EFI_OUT_OF_RESOURCES;\r
964 }\r
965 //\r
966 // If exists, delete it to hold new BootOrder\r
967 //\r
a78b08d1 968 if (BootOrderList != NULL) {\r
93e3992d 969 EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
970 }\r
971\r
972 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
973 NewBootOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.OptionOrder[Index] - 1);\r
974 }\r
975\r
976 Status = gRT->SetVariable (\r
977 L"BootOrder",\r
978 &gEfiGlobalVariableGuid,\r
979 VAR_FLAG,\r
980 BootOrderListSize,\r
981 NewBootOrderList\r
982 );\r
983 SafeFreePool (BootOrderList);\r
984 SafeFreePool (NewBootOrderList);\r
985 SafeFreePool (Map);\r
986 if (EFI_ERROR (Status)) {\r
987 return Status;\r
988 }\r
989\r
990 BOpt_FreeMenu (&BootOptionMenu);\r
991 BOpt_GetBootOptions (CallbackData);\r
992\r
993 return EFI_SUCCESS;\r
994\r
995}\r
996\r
b30312ba 997/**\r
a78b08d1 998 EDES_TODO: Add function description.\r
b30312ba 999\r
1000 @param CallbackData EDES_TODO: Add parameter description\r
1001\r
1002 @return EDES_TODO: Add description for return value\r
1003\r
1004**/\r
93e3992d 1005EFI_STATUS\r
1006Var_UpdateDriverOrder (\r
1007 IN BMM_CALLBACK_DATA *CallbackData\r
1008 )\r
1009{\r
1010 EFI_STATUS Status;\r
1011 UINT16 Index;\r
1012 UINT16 *DriverOrderList;\r
1013 UINT16 *NewDriverOrderList;\r
1014 UINTN DriverOrderListSize;\r
1015\r
1016 DriverOrderList = NULL;\r
1017 DriverOrderListSize = 0;\r
1018\r
1019 //\r
1020 // First check whether DriverOrder is present in current configuration\r
1021 //\r
1022 DriverOrderList = BdsLibGetVariableAndSize (\r
1023 L"DriverOrder",\r
1024 &gEfiGlobalVariableGuid,\r
1025 &DriverOrderListSize\r
1026 );\r
1027\r
1028 NewDriverOrderList = EfiAllocateZeroPool (DriverOrderListSize);\r
1029\r
a78b08d1 1030 if (NewDriverOrderList == NULL) {\r
93e3992d 1031 return EFI_OUT_OF_RESOURCES;\r
1032 }\r
1033 //\r
1034 // If exists, delete it to hold new DriverOrder\r
1035 //\r
a78b08d1 1036 if (DriverOrderList != NULL) {\r
93e3992d 1037 EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
1038 }\r
1039\r
1040 for (Index = 0; Index < DriverOrderListSize; Index++) {\r
1041 NewDriverOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.OptionOrder[Index] - 1);\r
1042 }\r
1043\r
1044 Status = gRT->SetVariable (\r
1045 L"DriverOrder",\r
1046 &gEfiGlobalVariableGuid,\r
1047 VAR_FLAG,\r
1048 DriverOrderListSize,\r
1049 NewDriverOrderList\r
1050 );\r
1051 if (EFI_ERROR (Status)) {\r
1052 return Status;\r
1053 }\r
1054\r
1055 SafeFreePool (DriverOrderList);\r
1056\r
1057 BOpt_FreeMenu (&DriverOptionMenu);\r
1058 BOpt_GetDriverOptions (CallbackData);\r
1059 return EFI_SUCCESS;\r
1060}\r
1061\r
b30312ba 1062/**\r
a78b08d1 1063 EDES_TODO: Add function description.\r
b30312ba 1064\r
1065 @param CallbackData EDES_TODO: Add parameter description\r
1066\r
1067 @return EDES_TODO: Add description for return value\r
1068\r
1069**/\r
93e3992d 1070EFI_STATUS\r
1071Var_UpdateBBSOption (\r
1072 IN BMM_CALLBACK_DATA *CallbackData\r
1073 )\r
1074{\r
1075 UINTN Index;\r
1076 UINTN Index2;\r
1077 VOID *BootOptionVar;\r
1078 CHAR16 VarName[100];\r
1079 UINTN OptionSize;\r
1080 UINT8 *Ptr;\r
1081 EFI_STATUS Status;\r
1082 CHAR16 DescString[100];\r
1083 CHAR8 DescAsciiString[100];\r
1084 UINTN NewOptionSize;\r
1085 UINT8 *NewOptionPtr;\r
1086 UINT8 *TempPtr;\r
1087 UINT32 *Attribute;\r
1088 BM_MENU_OPTION *OptionMenu;\r
1089 BM_LEGACY_DEVICE_CONTEXT *LegacyDeviceContext;\r
1090 UINT8 *LegacyDev;\r
1091 UINT8 *VarData;\r
1092 UINTN VarSize;\r
1093 BM_MENU_ENTRY *NewMenuEntry;\r
1094 BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;\r
1095 UINT8 *OriginalPtr;\r
1096 UINT8 *DisMap;\r
1097 UINTN Pos;\r
1098 UINTN Bit;\r
1099 UINT16 *NewOrder;\r
1100 UINT16 Tmp;\r
1101\r
1102 LegacyDeviceContext = NULL;\r
1103 DisMap = NULL;\r
1104 NewOrder = NULL;\r
1105\r
1106 if (FORM_SET_FD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
1107 OptionMenu = (BM_MENU_OPTION *) &LegacyFDMenu;\r
1108 LegacyDev = CallbackData->BmmFakeNvData.LegacyFD;\r
1109 CallbackData->BbsType = BBS_FLOPPY;\r
1110 } else {\r
1111 if (FORM_SET_HD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
1112 OptionMenu = (BM_MENU_OPTION *) &LegacyHDMenu;\r
1113 LegacyDev = CallbackData->BmmFakeNvData.LegacyHD;\r
1114 CallbackData->BbsType = BBS_HARDDISK;\r
1115 } else {\r
1116 if (FORM_SET_CD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
1117 OptionMenu = (BM_MENU_OPTION *) &LegacyCDMenu;\r
1118 LegacyDev = CallbackData->BmmFakeNvData.LegacyCD;\r
1119 CallbackData->BbsType = BBS_CDROM;\r
1120 } else {\r
1121 if (FORM_SET_NET_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
1122 OptionMenu = (BM_MENU_OPTION *) &LegacyNETMenu;\r
1123 LegacyDev = CallbackData->BmmFakeNvData.LegacyNET;\r
1124 CallbackData->BbsType = BBS_EMBED_NETWORK;\r
1125 } else {\r
1126 OptionMenu = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
1127 LegacyDev = CallbackData->BmmFakeNvData.LegacyBEV;\r
1128 CallbackData->BbsType = BBS_BEV_DEVICE;\r
1129 }\r
1130 }\r
1131 }\r
1132 }\r
1133\r
1134 DisMap = CallbackData->BmmOldFakeNVData.DisableMap;\r
1135 Status = EFI_SUCCESS;\r
1136\r
1137 //\r
1138 // Find the first device's context\r
1139 // If all devices are disabled( 0xFF == LegacyDev[0]), LegacyDeviceContext can be set to any VariableContext\r
1140 // because we just use it to fill the desc string, and user can not see the string in UI\r
1141 //\r
1142 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1143 NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
1144 LegacyDeviceContext = (BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext;\r
1145 if (0xFF != LegacyDev[0] && LegacyDev[0] == LegacyDeviceContext->Index) {\r
1146 DEBUG ((DEBUG_ERROR, "DescStr: %s\n", LegacyDeviceContext->Description));\r
1147 break;\r
1148 }\r
1149 }\r
1150 //\r
1151 // Update the Variable "LegacyDevOrder"\r
1152 //\r
1153 VarData = (UINT8 *) BdsLibGetVariableAndSize (\r
5f597758 1154 VAR_LEGACY_DEV_ORDER,\r
93e3992d 1155 &EfiLegacyDevOrderGuid,\r
1156 &VarSize\r
1157 );\r
1158\r
1159 if (NULL == VarData) {\r
1160 return EFI_NOT_FOUND;\r
1161 }\r
1162\r
1163 OriginalPtr = VarData;\r
1164 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
1165\r
1166 while (VarData < VarData + VarSize) {\r
1167 if (DevOrder->BbsType == CallbackData->BbsType) {\r
1168 break;\r
1169 }\r
1170\r
1171 VarData += sizeof (BBS_TYPE);\r
1172 VarData += *(UINT16 *) VarData;\r
1173 DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
1174 }\r
1175\r
1176 if (VarData >= VarData + VarSize) {\r
1177 SafeFreePool (OriginalPtr);\r
1178 return EFI_NOT_FOUND;\r
1179 }\r
1180\r
1181 NewOrder = (UINT16 *) EfiAllocateZeroPool (DevOrder->Length - sizeof (UINT16));\r
1182 if (NULL == NewOrder) {\r
1183 SafeFreePool (VarData);\r
1184 return EFI_OUT_OF_RESOURCES;\r
1185 }\r
1186\r
1187 for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
1188 if (0xFF == LegacyDev[Index]) {\r
1189 break;\r
1190 }\r
1191\r
1192 NewOrder[Index] = LegacyDev[Index];\r
1193 }\r
1194 //\r
1195 // Only the enable/disable state of each boot device with same device type can be changed,\r
1196 // so we can count on the index information in DevOrder.\r
1197 // DisMap bit array is the only reliable source to check a device's en/dis state,\r
1198 // so we use DisMap to set en/dis state of each item in NewOrder array\r
1199 //\r
1200 for (Index2 = 0; Index2 < OptionMenu->MenuNumber; Index2++) {\r
1201 Tmp = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index2 * sizeof (UINT16));\r
1202 Tmp &= 0xFF;\r
1203 Pos = Tmp / 8;\r
1204 Bit = 7 - (Tmp % 8);\r
a78b08d1 1205 if ((DisMap[Pos] & (1 << Bit)) != 0) {\r
93e3992d 1206 NewOrder[Index] = (UINT16) (0xFF00 | Tmp);\r
1207 Index++;\r
1208 }\r
1209 }\r
1210\r
1211 CopyMem (\r
1212 (UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16),\r
1213 NewOrder,\r
1214 DevOrder->Length - sizeof (UINT16)\r
1215 );\r
1216 SafeFreePool (NewOrder);\r
1217\r
1218 Status = gRT->SetVariable (\r
5f597758 1219 VAR_LEGACY_DEV_ORDER,\r
93e3992d 1220 &EfiLegacyDevOrderGuid,\r
1221 VAR_FLAG,\r
1222 VarSize,\r
1223 OriginalPtr\r
1224 );\r
1225\r
1226 SafeFreePool (OriginalPtr);\r
1227\r
1228 //\r
1229 // Update Optional Data of Boot####\r
1230 //\r
1231 BootOptionVar = GetLegacyBootOptionVar (CallbackData->BbsType, &Index, &OptionSize);\r
1232\r
1233 if (NULL != BootOptionVar) {\r
1234 CopyMem (\r
1235 DescString,\r
1236 LegacyDeviceContext->Description,\r
1237 StrSize (LegacyDeviceContext->Description)\r
1238 );\r
1239\r
1240 UnicodeToAscii (DescString, StrSize (DescString), DescAsciiString);\r
1241\r
1242 NewOptionSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescString) +\r
1243 sizeof (BBS_BBS_DEVICE_PATH);\r
1244 NewOptionSize += AsciiStrLen (DescAsciiString) +\r
1245 EFI_END_DEVICE_PATH_LENGTH + sizeof (BBS_TABLE) + sizeof (UINT16);\r
1246\r
1247 UnicodeSPrint (VarName, 100, L"Boot%04x", Index);\r
1248\r
1249 Ptr = BootOptionVar;\r
1250\r
1251 Attribute = (UINT32 *) Ptr;\r
1252 *Attribute |= LOAD_OPTION_ACTIVE;\r
1253 if (0xFF == LegacyDev[0]) {\r
1254 //\r
1255 // Disable this legacy boot option\r
1256 //\r
1257 *Attribute &= ~LOAD_OPTION_ACTIVE;\r
1258 }\r
1259\r
1260 Ptr += sizeof (UINT32);\r
1261\r
1262 Ptr += sizeof (UINT16);\r
1263 Ptr += StrSize ((CHAR16 *) Ptr);\r
1264\r
1265 NewOptionPtr = EfiAllocateZeroPool (NewOptionSize);\r
1266 if (NULL == NewOptionPtr) {\r
1267 return EFI_OUT_OF_RESOURCES;\r
1268 }\r
1269\r
1270 TempPtr = NewOptionPtr;\r
1271\r
1272 //\r
1273 // Attribute\r
1274 //\r
1275 CopyMem (\r
1276 TempPtr,\r
1277 BootOptionVar,\r
1278 sizeof (UINT32)\r
1279 );\r
1280\r
1281 TempPtr += sizeof (UINT32);\r
1282\r
1283 //\r
1284 // BBS device path Length\r
1285 //\r
1286 *((UINT16 *) TempPtr) = (UINT16) (sizeof (BBS_BBS_DEVICE_PATH) +\r
1287 AsciiStrLen (DescAsciiString) +\r
1288 EFI_END_DEVICE_PATH_LENGTH);\r
1289\r
1290 TempPtr += sizeof (UINT16);\r
1291\r
1292 //\r
1293 // Description string\r
1294 //\r
1295 CopyMem (\r
1296 TempPtr,\r
1297 DescString,\r
1298 StrSize (DescString)\r
1299 );\r
1300\r
1301 TempPtr += StrSize (DescString);\r
1302\r
1303 //\r
1304 // BBS device path\r
1305 //\r
1306 CopyMem (\r
1307 TempPtr,\r
1308 Ptr,\r
1309 sizeof (BBS_BBS_DEVICE_PATH)\r
1310 );\r
1311\r
1312 CopyMem (\r
1313 ((BBS_BBS_DEVICE_PATH*) TempPtr)->String,\r
1314 DescAsciiString,\r
1315 AsciiStrSize (DescAsciiString)\r
1316 );\r
1317\r
1318 SetDevicePathNodeLength (\r
1319 (EFI_DEVICE_PATH_PROTOCOL *) TempPtr,\r
1320 sizeof (BBS_BBS_DEVICE_PATH) + AsciiStrLen (DescAsciiString)\r
1321 );\r
1322\r
1323 TempPtr += sizeof (BBS_BBS_DEVICE_PATH) + AsciiStrLen (DescAsciiString);\r
1324\r
1325 //\r
1326 // End node\r
1327 //\r
1328 CopyMem (\r
1329 TempPtr,\r
1330 EndDevicePath,\r
1331 EFI_END_DEVICE_PATH_LENGTH\r
1332 );\r
1333 TempPtr += EFI_END_DEVICE_PATH_LENGTH;\r
1334\r
1335 //\r
1336 // Now TempPtr point to optional data, i.e. Bbs Table\r
1337 //\r
1338 CopyMem (\r
1339 TempPtr,\r
1340 LegacyDeviceContext->BbsTable,\r
1341 sizeof (BBS_TABLE)\r
1342 );\r
1343\r
1344 //\r
1345 // Now TempPtr point to BBS index\r
1346 //\r
1347 TempPtr += sizeof (BBS_TABLE);\r
1348 *((UINT16 *) TempPtr) = (UINT16) LegacyDeviceContext->Index;\r
1349\r
1350 Status = gRT->SetVariable (\r
1351 VarName,\r
1352 &gEfiGlobalVariableGuid,\r
1353 VAR_FLAG,\r
1354 NewOptionSize,\r
1355 NewOptionPtr\r
1356 );\r
1357\r
1358 SafeFreePool (NewOptionPtr);\r
1359 SafeFreePool (BootOptionVar);\r
1360 }\r
1361\r
1362 BOpt_GetBootOptions (CallbackData);\r
1363 return Status;\r
1364}\r
1365\r
b30312ba 1366/**\r
a78b08d1 1367 EDES_TODO: Add function description.\r
b30312ba 1368\r
1369 @param CallbackData EDES_TODO: Add parameter description\r
1370\r
1371 @return EDES_TODO: Add description for return value\r
1372\r
1373**/\r
93e3992d 1374EFI_STATUS\r
1375Var_UpdateConMode (\r
1376 IN BMM_CALLBACK_DATA *CallbackData\r
1377 )\r
1378{\r
1379 EFI_STATUS Status;\r
1380 UINTN Mode;\r
1381 CONSOLE_OUT_MODE ModeInfo;\r
1382\r
1383 Mode = CallbackData->BmmFakeNvData.ConsoleOutMode;\r
1384\r
1385 Status = gST->ConOut->QueryMode (gST->ConOut, Mode, &(ModeInfo.Column), &(ModeInfo.Row));\r
1386 if (EFI_ERROR(Status)) {\r
1387 ModeInfo.Column = 80;\r
1388 ModeInfo.Row = 25;\r
1389 }\r
1390\r
1391 Status = gRT->SetVariable (\r
1392 VarConOutMode,\r
1393 &gEfiGenericPlatformVariableGuid,\r
1394 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
1395 sizeof (CONSOLE_OUT_MODE),\r
1396 &ModeInfo\r
1397 );\r
1398\r
1399 return Status;\r
1400}\r