2 BDS Lib functions which contain all the code to connect console device
4 Copyright (c) 2004 - 2009, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "InternalBdsLib.h"
19 Check if we need to save the EFI variable with "ConVarName" as name
21 If ConVarName is NULL, then ASSERT().
23 @param ConVarName The name of the EFI variable.
25 @retval TRUE Set the EFI variable as NV type.
26 @retval FALSE EFI variable as NV type can be set NonNV.
35 ASSERT (ConVarName
!= NULL
);
40 // If the variable includes "Dev" at last, we consider
41 // it does not support NV attribute.
43 while (*Ptr
!= L
'\0') {
47 if (((INTN
)((UINTN
)Ptr
- (UINTN
)ConVarName
) / sizeof (CHAR16
)) <= 3) {
51 if ((*(Ptr
- 3) == 'D') && (*(Ptr
- 2) == 'e') && (*(Ptr
- 1) == 'v')) {
59 Fill console handle in System Table if there are no valid console handle in.
61 Firstly, check the validation of console handle in System Table. If it is invalid,
62 update it by the first console device handle from EFI console variable.
64 @param VarName The name of the EFI console variable.
65 @param ConsoleGuid Specified Console protocol GUID.
66 @param ConsoleHandle On IN, console handle in System Table to be checked.
67 On OUT, new console hanlde in system table.
68 @param ProtocolInterface On IN, console protocol on console handle in System Table to be checked.
69 On OUT, new console protocol on new console hanlde in system table.
71 @retval TRUE System Table has been updated.
72 @retval FALSE System Table hasn't been updated.
76 UpdateSystemTableConsole (
78 IN EFI_GUID
*ConsoleGuid
,
79 IN OUT EFI_HANDLE
*ConsoleHandle
,
80 IN OUT VOID
**ProtocolInterface
85 EFI_DEVICE_PATH_PROTOCOL
*FullDevicePath
;
86 EFI_DEVICE_PATH_PROTOCOL
*VarConsole
;
87 EFI_DEVICE_PATH_PROTOCOL
*Instance
;
91 ASSERT (VarName
!= NULL
);
92 ASSERT (ConsoleHandle
!= NULL
);
93 ASSERT (ConsoleGuid
!= NULL
);
94 ASSERT (ProtocolInterface
!= NULL
);
96 if (*ConsoleHandle
!= NULL
) {
97 Status
= gBS
->HandleProtocol (
102 if (Status
== EFI_SUCCESS
&& Interface
== *ProtocolInterface
) {
104 // If ConsoleHandle is valid and console protocol on this handle also
105 // also matched, just return.
112 // Get all possible consoles device path from EFI variable
114 VarConsole
= BdsLibGetVariableAndSize (
116 &gEfiGlobalVariableGuid
,
119 if (VarConsole
== NULL
) {
121 // If there is no any console device, just return.
126 FullDevicePath
= VarConsole
;
130 // Check every instance of the console variable
132 Instance
= GetNextDevicePathInstance (&VarConsole
, &DevicePathSize
);
133 if (Instance
== NULL
) {
134 FreePool (FullDevicePath
);
139 // Find console device handle by device path instance
141 Status
= gBS
->LocateDevicePath (
146 if (!EFI_ERROR (Status
)) {
148 // Get the console protocol on this console device handle
150 Status
= gBS
->HandleProtocol (
155 if (!EFI_ERROR (Status
)) {
157 // Update new console handle in System Table.
159 *ConsoleHandle
= NewHandle
;
160 *ProtocolInterface
= Interface
;
165 } while (Instance
!= NULL
);
168 // No any available console devcie found.
174 This function update console variable based on ConVarName, it can
175 add or remove one specific console device path from the variable
177 @param ConVarName Console related variable name, ConIn, ConOut,
179 @param CustomizedConDevicePath The console device path which will be added to
180 the console variable ConVarName, this parameter
181 can not be multi-instance.
182 @param ExclusiveDevicePath The console device path which will be removed
183 from the console variable ConVarName, this
184 parameter can not be multi-instance.
186 @retval EFI_UNSUPPORTED The added device path is same to the removed one.
187 @retval EFI_SUCCESS Success add or remove the device path from the
193 BdsLibUpdateConsoleVariable (
194 IN CHAR16
*ConVarName
,
195 IN EFI_DEVICE_PATH_PROTOCOL
*CustomizedConDevicePath
,
196 IN EFI_DEVICE_PATH_PROTOCOL
*ExclusiveDevicePath
199 EFI_DEVICE_PATH_PROTOCOL
*VarConsole
;
200 UINTN DevicePathSize
;
201 EFI_DEVICE_PATH_PROTOCOL
*NewDevicePath
;
202 EFI_DEVICE_PATH_PROTOCOL
*TempNewDevicePath
;
209 // Notes: check the device path point, here should check
210 // with compare memory
212 if (CustomizedConDevicePath
== ExclusiveDevicePath
) {
213 return EFI_UNSUPPORTED
;
216 // Delete the ExclusiveDevicePath from current default console
218 VarConsole
= BdsLibGetVariableAndSize (
220 &gEfiGlobalVariableGuid
,
225 // Initialize NewDevicePath
227 NewDevicePath
= VarConsole
;
230 // If ExclusiveDevicePath is even the part of the instance in VarConsole, delete it.
231 // In the end, NewDevicePath is the final device path.
233 if (ExclusiveDevicePath
!= NULL
&& VarConsole
!= NULL
) {
234 NewDevicePath
= BdsLibDelPartMatchInstance (VarConsole
, ExclusiveDevicePath
);
237 // Try to append customized device path to NewDevicePath.
239 if (CustomizedConDevicePath
!= NULL
) {
240 if (!BdsLibMatchDevicePaths (NewDevicePath
, CustomizedConDevicePath
)) {
242 // Check if there is part of CustomizedConDevicePath in NewDevicePath, delete it.
244 NewDevicePath
= BdsLibDelPartMatchInstance (NewDevicePath
, CustomizedConDevicePath
);
246 // In the first check, the default console variable will be _ModuleEntryPoint,
247 // just append current customized device path
249 TempNewDevicePath
= NewDevicePath
;
250 NewDevicePath
= AppendDevicePathInstance (NewDevicePath
, CustomizedConDevicePath
);
251 if (TempNewDevicePath
!= NULL
) {
252 FreePool(TempNewDevicePath
);
258 // The attribute for ConInDev, ConOutDev and ErrOutDev does not include NV.
260 if (IsNvNeed(ConVarName
)) {
262 // ConVarName has NV attribute.
264 Attributes
= EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
| EFI_VARIABLE_NON_VOLATILE
;
267 // ConVarName does not have NV attribute.
269 Attributes
= EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
;
273 // Finally, Update the variable of the default console by NewDevicePath
277 &gEfiGlobalVariableGuid
,
279 GetDevicePathSize (NewDevicePath
),
283 if (VarConsole
== NewDevicePath
) {
284 if (VarConsole
!= NULL
) {
285 FreePool(VarConsole
);
288 if (VarConsole
!= NULL
) {
289 FreePool(VarConsole
);
291 if (NewDevicePath
!= NULL
) {
292 FreePool(NewDevicePath
);
302 Connect the console device base on the variable ConVarName, if
303 device path of the ConVarName is multi-instance device path, if
304 anyone of the instances is connected success, then this function
307 @param ConVarName Console related variable name, ConIn, ConOut,
310 @retval EFI_NOT_FOUND There is not any console devices connected
312 @retval EFI_SUCCESS Success connect any one instance of the console
313 device path base on the variable ConVarName.
318 BdsLibConnectConsoleVariable (
319 IN CHAR16
*ConVarName
323 EFI_DEVICE_PATH_PROTOCOL
*StartDevicePath
;
325 EFI_DEVICE_PATH_PROTOCOL
*Instance
;
326 EFI_DEVICE_PATH_PROTOCOL
*Next
;
327 EFI_DEVICE_PATH_PROTOCOL
*CopyOfDevicePath
;
331 Status
= EFI_SUCCESS
;
335 // Check if the console variable exist
337 StartDevicePath
= BdsLibGetVariableAndSize (
339 &gEfiGlobalVariableGuid
,
342 if (StartDevicePath
== NULL
) {
343 return EFI_UNSUPPORTED
;
346 CopyOfDevicePath
= StartDevicePath
;
349 // Check every instance of the console variable
351 Instance
= GetNextDevicePathInstance (&CopyOfDevicePath
, &Size
);
352 if (Instance
== NULL
) {
353 FreePool (StartDevicePath
);
354 return EFI_UNSUPPORTED
;
358 while (!IsDevicePathEndType (Next
)) {
359 Next
= NextDevicePathNode (Next
);
362 SetDevicePathEndNode (Next
);
364 // Check USB1.1 console
366 if ((DevicePathType (Instance
) == MESSAGING_DEVICE_PATH
) &&
367 ((DevicePathSubType (Instance
) == MSG_USB_CLASS_DP
)
368 || (DevicePathSubType (Instance
) == MSG_USB_WWID_DP
)
371 // Check the Usb console in Usb2.0 bus firstly, then Usb1.1 bus
373 Status
= BdsLibConnectUsbDevByShortFormDP (PCI_CLASSC_PI_EHCI
, Instance
);
374 if (!EFI_ERROR (Status
)) {
378 Status
= BdsLibConnectUsbDevByShortFormDP (PCI_CLASSC_PI_UHCI
, Instance
);
379 if (!EFI_ERROR (Status
)) {
384 // Connect the instance device path
386 Status
= BdsLibConnectDevicePath (Instance
);
387 if (EFI_ERROR (Status
)) {
389 // Delete the instance from the console varialbe
391 BdsLibUpdateConsoleVariable (ConVarName
, NULL
, Instance
);
397 } while (CopyOfDevicePath
!= NULL
);
399 FreePool (StartDevicePath
);
402 return EFI_NOT_FOUND
;
410 This function will search every simpletext device in current system,
411 and make every simpletext device as pertantial console device.
416 BdsLibConnectAllConsoles (
421 EFI_DEVICE_PATH_PROTOCOL
*ConDevicePath
;
423 EFI_HANDLE
*HandleBuffer
;
428 ConDevicePath
= NULL
;
431 // Update all the console variables
433 gBS
->LocateHandleBuffer (
435 &gEfiSimpleTextInProtocolGuid
,
441 for (Index
= 0; Index
< HandleCount
; Index
++) {
442 gBS
->HandleProtocol (
444 &gEfiDevicePathProtocolGuid
,
445 (VOID
**) &ConDevicePath
447 BdsLibUpdateConsoleVariable (L
"ConIn", ConDevicePath
, NULL
);
450 if (HandleBuffer
!= NULL
) {
451 FreePool(HandleBuffer
);
455 gBS
->LocateHandleBuffer (
457 &gEfiSimpleTextOutProtocolGuid
,
462 for (Index
= 0; Index
< HandleCount
; Index
++) {
463 gBS
->HandleProtocol (
465 &gEfiDevicePathProtocolGuid
,
466 (VOID
**) &ConDevicePath
468 BdsLibUpdateConsoleVariable (L
"ConOut", ConDevicePath
, NULL
);
469 BdsLibUpdateConsoleVariable (L
"ErrOut", ConDevicePath
, NULL
);
472 if (HandleBuffer
!= NULL
) {
473 FreePool(HandleBuffer
);
477 // Connect all console variables
479 BdsLibConnectAllDefaultConsoles ();
484 This function will connect console device base on the console
485 device variable ConIn, ConOut and ErrOut.
487 @retval EFI_SUCCESS At least one of the ConIn and ConOut device have
488 been connected success.
489 @retval EFI_STATUS Return the status of BdsLibConnectConsoleVariable ().
494 BdsLibConnectAllDefaultConsoles (
499 BOOLEAN SystemTableUpdated
;
502 // Connect all default console variables
506 // It seems impossible not to have any ConOut device on platform,
507 // so we check the status here.
509 Status
= BdsLibConnectConsoleVariable (L
"ConOut");
510 if (EFI_ERROR (Status
)) {
515 // Insert the performance probe for Console Out
517 PERF_START (NULL
, "ConOut", "BDS", 1);
518 PERF_END (NULL
, "ConOut", "BDS", 0);
521 // Because possibly the platform is legacy free, in such case,
522 // ConIn devices (Serial Port and PS2 Keyboard ) does not exist,
523 // so we need not check the status.
525 BdsLibConnectConsoleVariable (L
"ConIn");
528 // The _ModuleEntryPoint err out var is legal.
530 BdsLibConnectConsoleVariable (L
"ErrOut");
532 SystemTableUpdated
= FALSE
;
534 // Fill console handles in System Table if no console device assignd.
536 if (UpdateSystemTableConsole (L
"ConIn", &gEfiSimpleTextInProtocolGuid
, &gST
->ConsoleInHandle
, (VOID
**) &gST
->ConIn
)) {
537 SystemTableUpdated
= TRUE
;
539 if (UpdateSystemTableConsole (L
"ConOut", &gEfiSimpleTextOutProtocolGuid
, &gST
->ConsoleOutHandle
, (VOID
**) &gST
->ConOut
)) {
540 SystemTableUpdated
= TRUE
;
542 if (UpdateSystemTableConsole (L
"ErrOut", &gEfiSimpleTextOutProtocolGuid
, &gST
->StandardErrorHandle
, (VOID
**) &gST
->StdErr
)) {
543 SystemTableUpdated
= TRUE
;
546 if (SystemTableUpdated
) {
548 // Update the CRC32 in the EFI System Table header
551 gBS
->CalculateCrc32 (
563 Convert a *.BMP graphics image to a GOP blt buffer. If a NULL Blt buffer
564 is passed in a GopBlt buffer will be allocated by this routine. If a GopBlt
565 buffer is passed in it will be used if it is big enough.
567 @param BmpImage Pointer to BMP file
568 @param BmpImageSize Number of bytes in BmpImage
569 @param GopBlt Buffer containing GOP version of BmpImage.
570 @param GopBltSize Size of GopBlt in bytes.
571 @param PixelHeight Height of GopBlt/BmpImage in pixels
572 @param PixelWidth Width of GopBlt/BmpImage in pixels
574 @retval EFI_SUCCESS GopBlt and GopBltSize are returned.
575 @retval EFI_UNSUPPORTED BmpImage is not a valid *.BMP image
576 @retval EFI_BUFFER_TOO_SMALL The passed in GopBlt buffer is not big enough.
577 GopBltSize will contain the required size.
578 @retval EFI_OUT_OF_RESOURCES No enough buffer to allocate.
584 IN UINTN BmpImageSize
,
585 IN OUT VOID
**GopBlt
,
586 IN OUT UINTN
*GopBltSize
,
587 OUT UINTN
*PixelHeight
,
588 OUT UINTN
*PixelWidth
593 BMP_IMAGE_HEADER
*BmpHeader
;
594 BMP_COLOR_MAP
*BmpColorMap
;
595 EFI_GRAPHICS_OUTPUT_BLT_PIXEL
*BltBuffer
;
596 EFI_GRAPHICS_OUTPUT_BLT_PIXEL
*Blt
;
597 UINT64 BltBufferSize
;
604 BmpHeader
= (BMP_IMAGE_HEADER
*) BmpImage
;
606 if (BmpHeader
->CharB
!= 'B' || BmpHeader
->CharM
!= 'M') {
607 return EFI_UNSUPPORTED
;
611 // Doesn't support compress.
613 if (BmpHeader
->CompressionType
!= 0) {
614 return EFI_UNSUPPORTED
;
618 // Calculate Color Map offset in the image.
621 BmpColorMap
= (BMP_COLOR_MAP
*) (Image
+ sizeof (BMP_IMAGE_HEADER
));
624 // Calculate graphics image data address in the image
626 Image
= ((UINT8
*) BmpImage
) + BmpHeader
->ImageOffset
;
630 // Calculate the BltBuffer needed size.
632 BltBufferSize
= MultU64x32 ((UINT64
) BmpHeader
->PixelWidth
, BmpHeader
->PixelHeight
);
634 // Ensure the BltBufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow
636 if (BltBufferSize
> DivU64x32 ((UINTN
) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
))) {
637 return EFI_UNSUPPORTED
;
639 BltBufferSize
= MultU64x32 (BltBufferSize
, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
));
642 if (*GopBlt
== NULL
) {
644 // GopBlt is not allocated by caller.
646 *GopBltSize
= (UINTN
) BltBufferSize
;
647 *GopBlt
= AllocatePool (*GopBltSize
);
649 if (*GopBlt
== NULL
) {
650 return EFI_OUT_OF_RESOURCES
;
654 // GopBlt has been allocated by caller.
656 if (*GopBltSize
< (UINTN
) BltBufferSize
) {
657 *GopBltSize
= (UINTN
) BltBufferSize
;
658 return EFI_BUFFER_TOO_SMALL
;
662 *PixelWidth
= BmpHeader
->PixelWidth
;
663 *PixelHeight
= BmpHeader
->PixelHeight
;
666 // Convert image from BMP to Blt buffer format
669 for (Height
= 0; Height
< BmpHeader
->PixelHeight
; Height
++) {
670 Blt
= &BltBuffer
[(BmpHeader
->PixelHeight
- Height
- 1) * BmpHeader
->PixelWidth
];
671 for (Width
= 0; Width
< BmpHeader
->PixelWidth
; Width
++, Image
++, Blt
++) {
672 switch (BmpHeader
->BitPerPixel
) {
675 // Convert 1-bit (2 colors) BMP to 24-bit color
677 for (Index
= 0; Index
< 8 && Width
< BmpHeader
->PixelWidth
; Index
++) {
678 Blt
->Red
= BmpColorMap
[((*Image
) >> (7 - Index
)) & 0x1].Red
;
679 Blt
->Green
= BmpColorMap
[((*Image
) >> (7 - Index
)) & 0x1].Green
;
680 Blt
->Blue
= BmpColorMap
[((*Image
) >> (7 - Index
)) & 0x1].Blue
;
691 // Convert 4-bit (16 colors) BMP Palette to 24-bit color
693 Index
= (*Image
) >> 4;
694 Blt
->Red
= BmpColorMap
[Index
].Red
;
695 Blt
->Green
= BmpColorMap
[Index
].Green
;
696 Blt
->Blue
= BmpColorMap
[Index
].Blue
;
697 if (Width
< (BmpHeader
->PixelWidth
- 1)) {
700 Index
= (*Image
) & 0x0f;
701 Blt
->Red
= BmpColorMap
[Index
].Red
;
702 Blt
->Green
= BmpColorMap
[Index
].Green
;
703 Blt
->Blue
= BmpColorMap
[Index
].Blue
;
709 // Convert 8-bit (256 colors) BMP Palette to 24-bit color
711 Blt
->Red
= BmpColorMap
[*Image
].Red
;
712 Blt
->Green
= BmpColorMap
[*Image
].Green
;
713 Blt
->Blue
= BmpColorMap
[*Image
].Blue
;
720 Blt
->Blue
= *Image
++;
721 Blt
->Green
= *Image
++;
727 // Other bit format BMP is not supported.
733 return EFI_UNSUPPORTED
;
739 ImageIndex
= (UINTN
) (Image
- ImageHeader
);
740 if ((ImageIndex
% 4) != 0) {
742 // Bmp Image starts each row on a 32-bit boundary!
744 Image
= Image
+ (4 - (ImageIndex
% 4));
752 Use SystemTable Conout to stop video based Simple Text Out consoles from going
753 to the video device. Put up LogoFile on every video device that is a console.
755 @param[in] LogoFile File name of logo to display on the center of the screen.
757 @retval EFI_SUCCESS ConsoleControl has been flipped to graphics and logo displayed.
758 @retval EFI_UNSUPPORTED Logo not found
764 IN EFI_GUID
*LogoFile
768 EFI_OEM_BADGING_PROTOCOL
*Badging
;
777 EFI_BADGING_FORMAT Format
;
778 EFI_BADGING_DISPLAY_ATTRIBUTE Attribute
;
783 EFI_GRAPHICS_OUTPUT_BLT_PIXEL
*Blt
;
784 EFI_UGA_DRAW_PROTOCOL
*UgaDraw
;
787 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
791 // Try to open GOP first
793 Status
= gBS
->HandleProtocol (gST
->ConsoleOutHandle
, &gEfiGraphicsOutputProtocolGuid
, (VOID
**) &GraphicsOutput
);
794 if (EFI_ERROR (Status
) && FeaturePcdGet (PcdUgaConsumeSupport
)) {
795 GraphicsOutput
= NULL
;
797 // Open GOP failed, try to open UGA
799 Status
= gBS
->HandleProtocol (gST
->ConsoleOutHandle
, &gEfiUgaDrawProtocolGuid
, (VOID
**) &UgaDraw
);
801 if (EFI_ERROR (Status
)) {
802 return EFI_UNSUPPORTED
;
806 // Erase Cursor from screen
808 gST
->ConOut
->EnableCursor (gST
->ConOut
, FALSE
);
811 Status
= gBS
->LocateProtocol (&gEfiOEMBadgingProtocolGuid
, NULL
, (VOID
**) &Badging
);
813 if (GraphicsOutput
!= NULL
) {
814 SizeOfX
= GraphicsOutput
->Mode
->Info
->HorizontalResolution
;
815 SizeOfY
= GraphicsOutput
->Mode
->Info
->VerticalResolution
;
817 } else if (UgaDraw
!= NULL
&& FeaturePcdGet (PcdUgaConsumeSupport
)) {
818 Status
= UgaDraw
->GetMode (UgaDraw
, &SizeOfX
, &SizeOfY
, &ColorDepth
, &RefreshRate
);
819 if (EFI_ERROR (Status
)) {
820 return EFI_UNSUPPORTED
;
823 return EFI_UNSUPPORTED
;
831 if (Badging
!= NULL
) {
833 // Get image from OEMBadging protocol.
835 Status
= Badging
->GetImage (
845 if (EFI_ERROR (Status
)) {
850 // Currently only support BMP format.
852 if (Format
!= EfiBadgingFormatBMP
) {
853 if (ImageData
!= NULL
) {
854 FreePool (ImageData
);
860 // Get the specified image from FV.
862 Status
= GetSectionFromAnyFv (LogoFile
, EFI_SECTION_RAW
, 0, (VOID
**) &ImageData
, &ImageSize
);
863 if (EFI_ERROR (Status
)) {
864 return EFI_UNSUPPORTED
;
869 Attribute
= EfiBadgingDisplayAttributeCenter
;
873 Status
= ConvertBmpToGopBlt (
881 if (EFI_ERROR (Status
)) {
882 FreePool (ImageData
);
884 if (Badging
== NULL
) {
892 // Calculate the display position according to Attribute.
895 case EfiBadgingDisplayAttributeLeftTop
:
900 case EfiBadgingDisplayAttributeCenterTop
:
901 DestX
= (SizeOfX
- Width
) / 2;
905 case EfiBadgingDisplayAttributeRightTop
:
906 DestX
= (SizeOfX
- Width
- CoordinateX
);
907 DestY
= CoordinateY
;;
910 case EfiBadgingDisplayAttributeCenterRight
:
911 DestX
= (SizeOfX
- Width
- CoordinateX
);
912 DestY
= (SizeOfY
- Height
) / 2;
915 case EfiBadgingDisplayAttributeRightBottom
:
916 DestX
= (SizeOfX
- Width
- CoordinateX
);
917 DestY
= (SizeOfY
- Height
- CoordinateY
);
920 case EfiBadgingDisplayAttributeCenterBottom
:
921 DestX
= (SizeOfX
- Width
) / 2;
922 DestY
= (SizeOfY
- Height
- CoordinateY
);
925 case EfiBadgingDisplayAttributeLeftBottom
:
927 DestY
= (SizeOfY
- Height
- CoordinateY
);
930 case EfiBadgingDisplayAttributeCenterLeft
:
932 DestY
= (SizeOfY
- Height
) / 2;
935 case EfiBadgingDisplayAttributeCenter
:
936 DestX
= (SizeOfX
- Width
) / 2;
937 DestY
= (SizeOfY
- Height
) / 2;
946 if ((DestX
>= 0) && (DestY
>= 0)) {
947 if (GraphicsOutput
!= NULL
) {
948 Status
= GraphicsOutput
->Blt (
958 Width
* sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL
)
960 } else if (UgaDraw
!= NULL
&& FeaturePcdGet (PcdUgaConsumeSupport
)) {
961 Status
= UgaDraw
->Blt (
963 (EFI_UGA_PIXEL
*) Blt
,
964 EfiUgaBltBufferToVideo
,
971 Width
* sizeof (EFI_UGA_PIXEL
)
974 Status
= EFI_UNSUPPORTED
;
978 FreePool (ImageData
);
984 if (Badging
== NULL
) {
993 Use SystemTable Conout to turn on video based Simple Text Out consoles. The
994 Simple Text Out screens will now be synced up with all non video output devices
996 @retval EFI_SUCCESS UGA devices are back in text mode and synced up.
1007 // Enable Cursor on Screen
1009 gST
->ConOut
->EnableCursor (gST
->ConOut
, TRUE
);