2 Variable operation that will be used by bootmaint
4 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include "BootMaintenanceManager.h"
12 Delete Boot Option that represent a Deleted state in BootOptionMenu.
14 @retval EFI_SUCCESS If all boot load option EFI Variables corresponding to
15 BM_LOAD_CONTEXT marked for deletion is deleted.
16 @retval EFI_NOT_FOUND If can not find the boot option want to be deleted.
17 @return Others If failed to update the "BootOrder" variable after deletion.
25 BM_MENU_ENTRY
*NewMenuEntry
;
26 BM_LOAD_CONTEXT
*NewLoadContext
;
32 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
33 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, (Index
- Index2
));
34 if (NULL
== NewMenuEntry
) {
38 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
39 if (!NewLoadContext
->Deleted
) {
43 Status
= EfiBootManagerDeleteLoadOptionVariable (NewMenuEntry
->OptionNumber
,LoadOptionTypeBoot
);
44 if (EFI_ERROR (Status
)) {
49 // If current Load Option is the same as BootNext,
50 // must delete BootNext in order to make sure
51 // there will be no panic on next boot
53 if (NewLoadContext
->IsBootNext
) {
54 EfiLibDeleteVariable (L
"BootNext", &gEfiGlobalVariableGuid
);
57 RemoveEntryList (&NewMenuEntry
->Link
);
58 BOpt_DestroyMenuEntry (NewMenuEntry
);
62 BootOptionMenu
.MenuNumber
-= Index2
;
68 Delete Load Option that represent a Deleted state in DriverOptionMenu.
70 @retval EFI_SUCCESS Load Option is successfully updated.
71 @retval EFI_NOT_FOUND Fail to find the driver option want to be deleted.
72 @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI
81 BM_MENU_ENTRY
*NewMenuEntry
;
82 BM_LOAD_CONTEXT
*NewLoadContext
;
88 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
89 NewMenuEntry
= BOpt_GetMenuEntry (&DriverOptionMenu
, (Index
- Index2
));
90 if (NULL
== NewMenuEntry
) {
94 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
95 if (!NewLoadContext
->Deleted
) {
98 Status
= EfiBootManagerDeleteLoadOptionVariable (NewMenuEntry
->OptionNumber
,LoadOptionTypeDriver
);
99 if (EFI_ERROR (Status
)) {
105 RemoveEntryList (&NewMenuEntry
->Link
);
106 BOpt_DestroyMenuEntry (NewMenuEntry
);
110 DriverOptionMenu
.MenuNumber
-= Index2
;
116 This function delete and build multi-instance device path for
117 specified type of console device.
119 This function clear the EFI variable defined by ConsoleName and
120 gEfiGlobalVariableGuid. It then build the multi-instance device
121 path by appending the device path of the Console (In/Out/Err) instance
122 in ConsoleMenu. Then it scan all corresponding console device by
123 scanning Terminal (built from device supporting Serial I/O instances)
124 devices in TerminalMenu. At last, it save a EFI variable specifed
125 by ConsoleName and gEfiGlobalVariableGuid.
127 @param ConsoleName The name for the console device type. They are
128 usually "ConIn", "ConOut" and "ErrOut".
129 @param ConsoleMenu The console memu which is a list of console devices.
130 @param UpdatePageId The flag specifying which type of console device
133 @retval EFI_SUCCESS The function complete successfully.
134 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
138 Var_UpdateConsoleOption (
139 IN UINT16
*ConsoleName
,
140 IN BM_MENU_OPTION
*ConsoleMenu
,
141 IN UINT16 UpdatePageId
144 EFI_DEVICE_PATH_PROTOCOL
*ConDevicePath
;
145 BM_MENU_ENTRY
*NewMenuEntry
;
146 BM_CONSOLE_CONTEXT
*NewConsoleContext
;
147 BM_TERMINAL_CONTEXT
*NewTerminalContext
;
149 VENDOR_DEVICE_PATH Vendor
;
150 EFI_DEVICE_PATH_PROTOCOL
*TerminalDevicePath
;
153 GetEfiGlobalVariable2 (ConsoleName
, (VOID
**)&ConDevicePath
, NULL
);
154 if (ConDevicePath
!= NULL
) {
155 EfiLibDeleteVariable (ConsoleName
, &gEfiGlobalVariableGuid
);
156 FreePool (ConDevicePath
);
157 ConDevicePath
= NULL
;
161 // First add all console input device from console input menu
163 for (Index
= 0; Index
< ConsoleMenu
->MenuNumber
; Index
++) {
164 NewMenuEntry
= BOpt_GetMenuEntry (ConsoleMenu
, Index
);
166 NewConsoleContext
= (BM_CONSOLE_CONTEXT
*) NewMenuEntry
->VariableContext
;
167 if (NewConsoleContext
->IsActive
) {
168 ConDevicePath
= AppendDevicePathInstance (
170 NewConsoleContext
->DevicePath
175 for (Index
= 0; Index
< TerminalMenu
.MenuNumber
; Index
++) {
176 NewMenuEntry
= BOpt_GetMenuEntry (&TerminalMenu
, Index
);
178 NewTerminalContext
= (BM_TERMINAL_CONTEXT
*) NewMenuEntry
->VariableContext
;
179 if (((NewTerminalContext
->IsConIn
!= 0) && (UpdatePageId
== FORM_CON_IN_ID
)) ||
180 ((NewTerminalContext
->IsConOut
!= 0) && (UpdatePageId
== FORM_CON_OUT_ID
)) ||
181 ((NewTerminalContext
->IsStdErr
!= 0) && (UpdatePageId
== FORM_CON_ERR_ID
))
183 Vendor
.Header
.Type
= MESSAGING_DEVICE_PATH
;
184 Vendor
.Header
.SubType
= MSG_VENDOR_DP
;
186 ASSERT (NewTerminalContext
->TerminalType
< (ARRAY_SIZE (TerminalTypeGuid
)));
189 &TerminalTypeGuid
[NewTerminalContext
->TerminalType
],
192 SetDevicePathNodeLength (&Vendor
.Header
, sizeof (VENDOR_DEVICE_PATH
));
193 TerminalDevicePath
= AppendDevicePathNode (
194 NewTerminalContext
->DevicePath
,
195 (EFI_DEVICE_PATH_PROTOCOL
*) &Vendor
197 ASSERT (TerminalDevicePath
!= NULL
);
198 ChangeTerminalDevicePath (TerminalDevicePath
, TRUE
);
199 ConDevicePath
= AppendDevicePathInstance (
206 if (ConDevicePath
!= NULL
) {
207 Status
= gRT
->SetVariable (
209 &gEfiGlobalVariableGuid
,
211 GetDevicePathSize (ConDevicePath
),
214 if (EFI_ERROR (Status
)) {
224 This function delete and build multi-instance device path ConIn
227 @retval EFI_SUCCESS The function complete successfully.
228 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
231 Var_UpdateConsoleInpOption (
235 return Var_UpdateConsoleOption (L
"ConIn", &ConsoleInpMenu
, FORM_CON_IN_ID
);
239 This function delete and build multi-instance device path ConOut
242 @retval EFI_SUCCESS The function complete successfully.
243 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
246 Var_UpdateConsoleOutOption (
250 return Var_UpdateConsoleOption (L
"ConOut", &ConsoleOutMenu
, FORM_CON_OUT_ID
);
254 This function delete and build multi-instance device path ErrOut
257 @retval EFI_SUCCESS The function complete successfully.
258 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
261 Var_UpdateErrorOutOption (
265 return Var_UpdateConsoleOption (L
"ErrOut", &ConsoleErrMenu
, FORM_CON_ERR_ID
);
269 This function create a currently loaded Drive Option from
270 the BMM. It then appends this Driver Option to the end of
271 the "DriverOrder" list. It append this Driver Opotion to the end
274 @param CallbackData The BMM context data.
275 @param HiiHandle The HII handle associated with the BMM formset.
276 @param DescriptionData The description of this driver option.
277 @param OptionalData The optional load option.
278 @param ForceReconnect If to force reconnect.
280 @retval other Contain some errors when excuting this function.See function
281 EfiBootManagerInitializeLoadOption/EfiBootManagerAddLoadOptionVariabl
282 for detail return information.
283 @retval EFI_SUCCESS If function completes successfully.
287 Var_UpdateDriverOption (
288 IN BMM_CALLBACK_DATA
*CallbackData
,
289 IN EFI_HII_HANDLE HiiHandle
,
290 IN UINT16
*DescriptionData
,
291 IN UINT16
*OptionalData
,
292 IN UINT8 ForceReconnect
296 UINT16 DriverString
[12];
297 BM_MENU_ENTRY
*NewMenuEntry
;
298 BM_LOAD_CONTEXT
*NewLoadContext
;
299 BOOLEAN OptionalDataExist
;
301 EFI_BOOT_MANAGER_LOAD_OPTION LoadOption
;
302 UINT8
*OptionalDesData
;
303 UINT32 OptionalDataSize
;
305 OptionalDataExist
= FALSE
;
306 OptionalDesData
= NULL
;
307 OptionalDataSize
= 0;
309 Index
= BOpt_GetDriverOptionNumber ();
312 sizeof (DriverString
),
317 if (*DescriptionData
== 0x0000) {
318 StrCpyS (DescriptionData
, MAX_MENU_NUMBER
, DriverString
);
321 if (*OptionalData
!= 0x0000) {
322 OptionalDataExist
= TRUE
;
323 OptionalDesData
= (UINT8
*)OptionalData
;
324 OptionalDataSize
= (UINT32
)StrSize (OptionalData
);
327 NewMenuEntry
= BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT
);
328 if (NULL
== NewMenuEntry
) {
329 return EFI_OUT_OF_RESOURCES
;
332 Status
= EfiBootManagerInitializeLoadOption (
335 LoadOptionTypeDriver
,
336 LOAD_OPTION_ACTIVE
| (ForceReconnect
<< 1),
338 CallbackData
->LoadContext
->FilePathList
,
342 if (EFI_ERROR (Status
)){
346 Status
= EfiBootManagerAddLoadOptionVariable (&LoadOption
,(UINTN
) -1 );
347 if (EFI_ERROR (Status
)) {
348 EfiBootManagerFreeLoadOption(&LoadOption
);
352 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
353 NewLoadContext
->Deleted
= FALSE
;
354 NewLoadContext
->Attributes
= LoadOption
.Attributes
;
355 NewLoadContext
->FilePathListLength
= (UINT16
)GetDevicePathSize (LoadOption
.FilePath
);
357 NewLoadContext
->Description
= AllocateZeroPool (StrSize (DescriptionData
));
358 ASSERT (NewLoadContext
->Description
!= NULL
);
359 NewMenuEntry
->DisplayString
= NewLoadContext
->Description
;
361 NewLoadContext
->Description
,
362 LoadOption
.Description
,
363 StrSize (DescriptionData
)
366 NewLoadContext
->FilePathList
= AllocateZeroPool (GetDevicePathSize (CallbackData
->LoadContext
->FilePathList
));
367 ASSERT (NewLoadContext
->FilePathList
!= NULL
);
369 NewLoadContext
->FilePathList
,
371 GetDevicePathSize (CallbackData
->LoadContext
->FilePathList
)
374 NewMenuEntry
->HelpString
= UiDevicePathToStr (NewLoadContext
->FilePathList
);
375 NewMenuEntry
->OptionNumber
= Index
;
376 NewMenuEntry
->DisplayStringToken
= HiiSetString (HiiHandle
, 0, NewMenuEntry
->DisplayString
, NULL
);
377 NewMenuEntry
->HelpStringToken
= HiiSetString (HiiHandle
, 0, NewMenuEntry
->HelpString
, NULL
);
379 if (OptionalDataExist
) {
380 NewLoadContext
->OptionalData
= AllocateZeroPool (LoadOption
.OptionalDataSize
);
381 ASSERT (NewLoadContext
->OptionalData
!= NULL
);
383 NewLoadContext
->OptionalData
,
384 LoadOption
.OptionalData
,
385 LoadOption
.OptionalDataSize
389 InsertTailList (&DriverOptionMenu
.Head
, &NewMenuEntry
->Link
);
390 DriverOptionMenu
.MenuNumber
++;
392 EfiBootManagerFreeLoadOption(&LoadOption
);
398 This function create a currently loaded Boot Option from
399 the BMM. It then appends this Boot Option to the end of
400 the "BootOrder" list. It also append this Boot Opotion to the end
403 @param CallbackData The BMM context data.
405 @retval other Contain some errors when excuting this function. See function
406 EfiBootManagerInitializeLoadOption/EfiBootManagerAddLoadOptionVariabl
407 for detail return information.
408 @retval EFI_SUCCESS If function completes successfully.
412 Var_UpdateBootOption (
413 IN BMM_CALLBACK_DATA
*CallbackData
416 UINT16 BootString
[10];
418 BM_MENU_ENTRY
*NewMenuEntry
;
419 BM_LOAD_CONTEXT
*NewLoadContext
;
420 BOOLEAN OptionalDataExist
;
422 BMM_FAKE_NV_DATA
*NvRamMap
;
423 EFI_BOOT_MANAGER_LOAD_OPTION LoadOption
;
425 UINT32 OptionalDataSize
;
427 OptionalDataExist
= FALSE
;
428 NvRamMap
= &CallbackData
->BmmFakeNvData
;
430 OptionalDataSize
= 0;
432 Index
= BOpt_GetBootOptionNumber () ;
433 UnicodeSPrint (BootString
, sizeof (BootString
), L
"Boot%04x", Index
);
435 if (NvRamMap
->BootDescriptionData
[0] == 0x0000) {
436 StrCpyS (NvRamMap
->BootDescriptionData
, sizeof (NvRamMap
->BootDescriptionData
) / sizeof (NvRamMap
->BootDescriptionData
[0]), BootString
);
439 if (NvRamMap
->BootOptionalData
[0] != 0x0000) {
440 OptionalDataExist
= TRUE
;
441 OptionalData
= (UINT8
*)NvRamMap
->BootOptionalData
;
442 OptionalDataSize
= (UINT32
)StrSize (NvRamMap
->BootOptionalData
);
445 NewMenuEntry
= BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT
);
446 if (NULL
== NewMenuEntry
) {
447 return EFI_OUT_OF_RESOURCES
;
450 Status
= EfiBootManagerInitializeLoadOption (
455 NvRamMap
->BootDescriptionData
,
456 CallbackData
->LoadContext
->FilePathList
,
460 if (EFI_ERROR (Status
)){
464 Status
= EfiBootManagerAddLoadOptionVariable (&LoadOption
,(UINTN
) -1 );
465 if (EFI_ERROR (Status
)) {
466 EfiBootManagerFreeLoadOption(&LoadOption
);
470 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
471 NewLoadContext
->Deleted
= FALSE
;
472 NewLoadContext
->Attributes
= LoadOption
.Attributes
;
473 NewLoadContext
->FilePathListLength
= (UINT16
) GetDevicePathSize (LoadOption
.FilePath
);
475 NewLoadContext
->Description
= AllocateZeroPool (StrSize (NvRamMap
->BootDescriptionData
));
476 ASSERT (NewLoadContext
->Description
!= NULL
);
478 NewMenuEntry
->DisplayString
= NewLoadContext
->Description
;
481 NewLoadContext
->Description
,
482 LoadOption
.Description
,
483 StrSize (NvRamMap
->BootDescriptionData
)
486 NewLoadContext
->FilePathList
= AllocateZeroPool (GetDevicePathSize (CallbackData
->LoadContext
->FilePathList
));
487 ASSERT (NewLoadContext
->FilePathList
!= NULL
);
489 NewLoadContext
->FilePathList
,
491 GetDevicePathSize (CallbackData
->LoadContext
->FilePathList
)
494 NewMenuEntry
->HelpString
= UiDevicePathToStr (NewLoadContext
->FilePathList
);
495 NewMenuEntry
->OptionNumber
= Index
;
496 NewMenuEntry
->DisplayStringToken
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, NewMenuEntry
->DisplayString
, NULL
);
497 NewMenuEntry
->HelpStringToken
= HiiSetString (CallbackData
->BmmHiiHandle
, 0, NewMenuEntry
->HelpString
, NULL
);
499 if (OptionalDataExist
) {
500 NewLoadContext
->OptionalData
= AllocateZeroPool (LoadOption
.OptionalDataSize
);
501 ASSERT (NewLoadContext
->OptionalData
!= NULL
);
503 NewLoadContext
->OptionalData
,
504 LoadOption
.OptionalData
,
505 LoadOption
.OptionalDataSize
509 InsertTailList (&BootOptionMenu
.Head
, &NewMenuEntry
->Link
);
510 BootOptionMenu
.MenuNumber
++;
512 EfiBootManagerFreeLoadOption(&LoadOption
);
518 This function update the "BootNext" EFI Variable. If there is
519 no "BootNext" specified in BMM, this EFI Variable is deleted.
520 It also update the BMM context data specified the "BootNext"
523 @param CallbackData The BMM context data.
525 @retval EFI_SUCCESS The function complete successfully.
526 @return The EFI variable can be saved. See gRT->SetVariable
527 for detail return information.
532 IN BMM_CALLBACK_DATA
*CallbackData
535 BM_MENU_ENTRY
*NewMenuEntry
;
536 BM_LOAD_CONTEXT
*NewLoadContext
;
537 BMM_FAKE_NV_DATA
*CurrentFakeNVMap
;
541 Status
= EFI_SUCCESS
;
542 CurrentFakeNVMap
= &CallbackData
->BmmFakeNvData
;
543 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
544 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
545 ASSERT (NULL
!= NewMenuEntry
);
547 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
548 NewLoadContext
->IsBootNext
= FALSE
;
551 if (CurrentFakeNVMap
->BootNext
== NONE_BOOTNEXT_VALUE
) {
552 EfiLibDeleteVariable (L
"BootNext", &gEfiGlobalVariableGuid
);
556 NewMenuEntry
= BOpt_GetMenuEntry (
558 CurrentFakeNVMap
->BootNext
560 ASSERT (NewMenuEntry
!= NULL
);
562 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
563 Status
= gRT
->SetVariable (
565 &gEfiGlobalVariableGuid
,
568 &NewMenuEntry
->OptionNumber
570 NewLoadContext
->IsBootNext
= TRUE
;
571 CallbackData
->BmmOldFakeNVData
.BootNext
= CurrentFakeNVMap
->BootNext
;
576 This function update the "BootOrder" EFI Variable based on
577 BMM Formset's NV map. It then refresh BootOptionMenu
578 with the new "BootOrder" list.
580 @param CallbackData The BMM context data.
582 @retval EFI_SUCCESS The function complete successfully.
583 @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.
584 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
588 Var_UpdateBootOrder (
589 IN BMM_CALLBACK_DATA
*CallbackData
600 // First check whether BootOrder is present in current configuration
602 GetEfiGlobalVariable2 (L
"BootOrder", (VOID
**) &BootOrder
, &BootOrderSize
);
603 if (BootOrder
== NULL
) {
604 return EFI_OUT_OF_RESOURCES
;
607 ASSERT (BootOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.BootOptionOrder
) / sizeof (CallbackData
->BmmFakeNvData
.BootOptionOrder
[0])));
610 // OptionOrder is subset of BootOrder
612 for (OrderIndex
= 0; (OrderIndex
< BootOptionMenu
.MenuNumber
) && (CallbackData
->BmmFakeNvData
.BootOptionOrder
[OrderIndex
] != 0); OrderIndex
++) {
613 for (Index
= OrderIndex
; Index
< BootOrderSize
/ sizeof (UINT16
); Index
++) {
614 if ((BootOrder
[Index
] == (UINT16
) (CallbackData
->BmmFakeNvData
.BootOptionOrder
[OrderIndex
] - 1)) && (OrderIndex
!= Index
)) {
615 OptionNumber
= BootOrder
[Index
];
616 CopyMem (&BootOrder
[OrderIndex
+ 1], &BootOrder
[OrderIndex
], (Index
- OrderIndex
) * sizeof (UINT16
));
617 BootOrder
[OrderIndex
] = OptionNumber
;
622 Status
= gRT
->SetVariable (
624 &gEfiGlobalVariableGuid
,
629 FreePool (BootOrder
);
631 BOpt_FreeMenu (&BootOptionMenu
);
632 BOpt_GetBootOptions (CallbackData
);
639 This function update the "DriverOrder" EFI Variable based on
640 BMM Formset's NV map. It then refresh DriverOptionMenu
641 with the new "DriverOrder" list.
643 @param CallbackData The BMM context data.
645 @retval EFI_SUCCESS The function complete successfully.
646 @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.
647 @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.
651 Var_UpdateDriverOrder (
652 IN BMM_CALLBACK_DATA
*CallbackData
657 UINT16
*DriverOrderList
;
658 UINT16
*NewDriverOrderList
;
659 UINTN DriverOrderListSize
;
661 DriverOrderList
= NULL
;
662 DriverOrderListSize
= 0;
665 // First check whether DriverOrder is present in current configuration
667 GetEfiGlobalVariable2 (L
"DriverOrder", (VOID
**) &DriverOrderList
, &DriverOrderListSize
);
668 NewDriverOrderList
= AllocateZeroPool (DriverOrderListSize
);
670 if (NewDriverOrderList
== NULL
) {
671 return EFI_OUT_OF_RESOURCES
;
674 // If exists, delete it to hold new DriverOrder
676 if (DriverOrderList
!= NULL
) {
677 EfiLibDeleteVariable (L
"DriverOrder", &gEfiGlobalVariableGuid
);
678 FreePool (DriverOrderList
);
681 ASSERT (DriverOptionMenu
.MenuNumber
<= (sizeof (CallbackData
->BmmFakeNvData
.DriverOptionOrder
) / sizeof (CallbackData
->BmmFakeNvData
.DriverOptionOrder
[0])));
682 for (Index
= 0; Index
< DriverOptionMenu
.MenuNumber
; Index
++) {
683 NewDriverOrderList
[Index
] = (UINT16
) (CallbackData
->BmmFakeNvData
.DriverOptionOrder
[Index
] - 1);
686 Status
= gRT
->SetVariable (
688 &gEfiGlobalVariableGuid
,
693 if (EFI_ERROR (Status
)) {
697 BOpt_FreeMenu (&DriverOptionMenu
);
698 BOpt_GetDriverOptions (CallbackData
);
703 Update the Text Mode of Console.
705 @param CallbackData The context data for BMM.
707 @retval EFI_SUCCSS If the Text Mode of Console is updated.
708 @return Other value if the Text Mode of Console is not updated.
713 IN BMM_CALLBACK_DATA
*CallbackData
718 CONSOLE_OUT_MODE ModeInfo
;
720 Mode
= CallbackData
->BmmFakeNvData
.ConsoleOutMode
;
722 Status
= gST
->ConOut
->QueryMode (gST
->ConOut
, Mode
, &(ModeInfo
.Column
), &(ModeInfo
.Row
));
723 if (!EFI_ERROR(Status
)) {
724 Status
= PcdSet32S (PcdSetupConOutColumn
, (UINT32
) ModeInfo
.Column
);
725 if (!EFI_ERROR (Status
)) {
726 Status
= PcdSet32S (PcdSetupConOutRow
, (UINT32
) ModeInfo
.Row
);