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