]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/Console/GraphicsConsole/Dxe/GraphicsConsole.c
Add a lock to protect the critical region in Service APIs for gEfiSimpleTextOutProtoc...
[mirror_edk2.git] / EdkModulePkg / Universal / Console / GraphicsConsole / Dxe / GraphicsConsole.c
index d70c979b72964b569b2b2dd88c24ae25f8335cd6..3f79991f3c7bc4f9a143fccefdcd756d87d01450 100644 (file)
@@ -1,6 +1,12 @@
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation                                                         \r
+/**@file\r
+  This is the main routine for initializing the Graphics Console support routines.\r
+Remaining Tasks\r
+  Add all standard Glyphs from EFI 1.02 Specification\r
+  Implement optimal automatic Mode creation algorithm\r
+  Solve palette issues for mixed graphics and text\r
+  When does this protocol reset the palette?\r
+    \r
+Copyright (c) 2006 - 2007 Intel Corporation. <BR>\r
 All rights reserved. This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
 which accompanies this distribution.  The full text of the license may be found at        \r
@@ -9,67 +15,19 @@ http://opensource.org/licenses/bsd-license.php
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
 \r
-Module Name:\r
-\r
-  GraphicsConsole.c\r
-  \r
-Abstract:\r
-\r
-  This is the main routine for initializing the Graphics Console support routines.\r
-\r
-Revision History\r
-\r
-Remaining Tasks\r
-  Add all standard Glyphs from EFI 1.02 Specification\r
-  Implement optimal automatic Mode creation algorithm\r
-  Solve palette issues for mixed graphics and text\r
-  When does this protocol reset the palette?\r
-\r
---*/\r
+**/\r
 \r
 #include "GraphicsConsole.h"\r
 \r
-//\r
-// Function Prototypes\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleControllerDriverSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleControllerDriverStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleControllerDriverStop (\r
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN  EFI_HANDLE                     Controller,\r
-  IN  UINTN                          NumberOfChildren,\r
-  IN  EFI_HANDLE                     *ChildHandleBuffer\r
-  );\r
-\r
+STATIC\r
 EFI_STATUS\r
 GetTextColors (\r
   IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  OUT EFI_UGA_PIXEL                 *Foreground,\r
-  OUT EFI_UGA_PIXEL                 *Background\r
-  );\r
-\r
-EFI_STATUS\r
-DrawUnicodeWeightAtCursor (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  CHAR16                        UnicodeWeight\r
+  OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
+  OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
   );\r
 \r
+STATIC\r
 EFI_STATUS\r
 DrawUnicodeWeightAtCursorN (\r
   IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
@@ -77,6 +35,7 @@ DrawUnicodeWeightAtCursorN (
   IN  UINTN                         Count\r
   );\r
 \r
+STATIC\r
 EFI_STATUS\r
 EraseCursor (\r
   IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This\r
@@ -87,6 +46,7 @@ EraseCursor (
 //\r
 GRAPHICS_CONSOLE_DEV        mGraphicsConsoleDevTemplate = {\r
   GRAPHICS_CONSOLE_DEV_SIGNATURE,\r
+  (EFI_GRAPHICS_OUTPUT_PROTOCOL *) NULL,\r
   (EFI_UGA_DRAW_PROTOCOL *) NULL,\r
   {\r
     GraphicsConsoleConOutReset,\r
@@ -110,10 +70,10 @@ GRAPHICS_CONSOLE_DEV        mGraphicsConsoleDevTemplate = {
   },\r
   {\r
     { 80, 25, 0, 0, 0, 0 },  // Mode 0\r
-    {  0,  0, 0, 0, 0, 0 },  // Mode 1\r
+    { 80, 50, 0, 0, 0, 0 },  // Mode 1 \r
     {  0,  0, 0, 0, 0, 0 }   // Mode 2\r
   },\r
-  (EFI_UGA_PIXEL *) NULL,\r
+  (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL,\r
   (EFI_HII_HANDLE) 0\r
 };\r
 \r
@@ -121,26 +81,26 @@ EFI_HII_PROTOCOL            *mHii;
 \r
 static CHAR16               mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
 \r
-static EFI_UGA_PIXEL        mEfiColors[16] = {\r
+static EFI_GRAPHICS_OUTPUT_BLT_PIXEL        mEfiColors[16] = {\r
   //\r
   // B     G     R\r
   //\r
-  { 0x00, 0x00, 0x00, 0x00 },  // BLACK\r
-  { 0x98, 0x00, 0x00, 0x00 },  // BLUE\r
-  { 0x00, 0x98, 0x00, 0x00 },  // GREEN\r
-  { 0x98, 0x98, 0x00, 0x00 },  // CYAN\r
-  { 0x00, 0x00, 0x98, 0x00 },  // RED\r
-  { 0x98, 0x00, 0x98, 0x00 },  // MAGENTA\r
-  { 0x00, 0x98, 0x98, 0x00 },  // BROWN\r
-  { 0x98, 0x98, 0x98, 0x00 },  // LIGHTGRAY\r
-  { 0x30, 0x30, 0x30, 0x00 },  // DARKGRAY - BRIGHT BLACK\r
-  { 0xff, 0x00, 0x00, 0x00 },  // LIGHTBLUE - ?\r
-  { 0x00, 0xff, 0x00, 0x00 },  // LIGHTGREEN - ?\r
-  { 0xff, 0xff, 0x00, 0x00 },  // LIGHTCYAN\r
-  { 0x00, 0x00, 0xff, 0x00 },  // LIGHTRED\r
-  { 0xff, 0x00, 0xff, 0x00 },  // LIGHTMAGENTA\r
-  { 0x00, 0xff, 0xff, 0x00 },  // LIGHTBROWN\r
-  { 0xff, 0xff, 0xff, 0x00 }   // WHITE\r
+  {0x00, 0x00, 0x00, 0x00},  // BLACK\r
+  {0x98, 0x00, 0x00, 0x00},  // BLUE\r
+  {0x00, 0x98, 0x00, 0x00},  // GREEN\r
+  {0x98, 0x98, 0x00, 0x00},  // CYAN\r
+  {0x00, 0x00, 0x98, 0x00},  // RED\r
+  {0x98, 0x00, 0x98, 0x00},  // MAGENTA\r
+  {0x00, 0x98, 0x98, 0x00},  // BROWN\r
+  {0x98, 0x98, 0x98, 0x00},  // LIGHTGRAY\r
+  {0x30, 0x30, 0x30, 0x00},  // DARKGRAY - BRIGHT BLACK\r
+  {0xff, 0x00, 0x00, 0x00},  // LIGHTBLUE - ?\r
+  {0x00, 0xff, 0x00, 0x00},  // LIGHTGREEN - ?\r
+  {0xff, 0xff, 0x00, 0x00},  // LIGHTCYAN\r
+  {0x00, 0x00, 0xff, 0x00},  // LIGHTRED\r
+  {0xff, 0x00, 0xff, 0x00},  // LIGHTMAGENTA\r
+  {0x00, 0xff, 0xff, 0x00},  // LIGHTBROWN\r
+  {0xff, 0xff, 0xff, 0x00}  // WHITE\r
 };\r
 \r
 static EFI_NARROW_GLYPH     mCursorGlyph = {\r
@@ -149,14 +109,11 @@ static EFI_NARROW_GLYPH     mCursorGlyph = {
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF }\r
 };\r
 \r
-static CHAR16  SpaceStr[] = { (CHAR16)NARROW_CHAR, ' ', 0 };\r
-\r
-\r
 EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = {\r
   GraphicsConsoleControllerDriverSupported,\r
   GraphicsConsoleControllerDriverStart,\r
   GraphicsConsoleControllerDriverStop,\r
-  0x10,\r
+  0xa,\r
   NULL,\r
   NULL\r
 };\r
@@ -170,23 +127,41 @@ GraphicsConsoleControllerDriverSupported (
   )\r
 {\r
   EFI_STATUS                Status;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
   EFI_UGA_DRAW_PROTOCOL     *UgaDraw;\r
   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
 \r
+  UgaDraw = NULL;\r
   //\r
   // Open the IO Abstraction(s) needed to perform the supported test\r
   //\r
   Status = gBS->OpenProtocol (\r
                   Controller,\r
-                  &gEfiUgaDrawProtocolGuid,\r
-                  (VOID **) &UgaDraw,\r
+                  &gEfiGraphicsOutputProtocolGuid,\r
+                  (VOID **) &GraphicsOutput,\r
                   This->DriverBindingHandle,\r
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
+  \r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    GraphicsOutput = NULL;\r
+    //\r
+    // Open Graphics Output Protocol failed, try to open UGA Draw Protocol\r
+    //\r
+    Status = gBS->OpenProtocol (\r
+                    Controller,\r
+                    &gEfiUgaDrawProtocolGuid,\r
+                    (VOID **) &UgaDraw,\r
+                    This->DriverBindingHandle,\r
+                    Controller,\r
+                    EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
   }\r
+\r
   //\r
   // We need to ensure that we do not layer on top of a virtual handle.\r
   // We need to ensure that the handles produced by the conspliter do not\r
@@ -219,13 +194,21 @@ GraphicsConsoleControllerDriverSupported (
   // Close the I/O Abstraction(s) used to perform the supported test\r
   //\r
 Error:\r
-  gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiUgaDrawProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
-\r
+  if (GraphicsOutput != NULL) {\r
+    gBS->CloseProtocol (\r
+          Controller,\r
+          &gEfiGraphicsOutputProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          Controller\r
+          );\r
+  } else {\r
+    gBS->CloseProtocol (\r
+          Controller,\r
+          &gEfiUgaDrawProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          Controller\r
+          );\r
+  }\r
   return Status;\r
 }\r
 \r
@@ -268,6 +251,12 @@ GraphicsConsoleControllerDriverStart (
   UINTN                 Columns;\r
   UINTN                 Rows;\r
   UINT8                 *Location;\r
+  UINT32                               ModeNumber;\r
+  UINTN                                SizeOfInfo;\r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
+  \r
+  ModeNumber = 0;\r
+\r
   //\r
   // Initialize the Graphics Console device instance\r
   //\r
@@ -283,15 +272,28 @@ GraphicsConsoleControllerDriverStart (
 \r
   Status = gBS->OpenProtocol (\r
                   Controller,\r
-                  &gEfiUgaDrawProtocolGuid,\r
-                  (VOID **) &Private->UgaDraw,\r
+                  &gEfiGraphicsOutputProtocolGuid,\r
+                  (VOID **) &Private->GraphicsOutput,\r
                   This->DriverBindingHandle,\r
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
-  if (EFI_ERROR (Status)) {\r
-    goto Error;\r
+  if (EFI_ERROR(Status)) {\r
+    Private->GraphicsOutput = NULL;\r
+\r
+    Status = gBS->OpenProtocol (\r
+                    Controller,\r
+                    &gEfiUgaDrawProtocolGuid,\r
+                    (VOID **) &Private->UgaDraw,\r
+                    This->DriverBindingHandle,\r
+                    Controller,\r
+                    EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      goto Error;\r
+    }\r
   }\r
+\r
   //\r
   // Get the HII protocol. If Supported() succeeds, do we really\r
   // need to get HII protocol again?\r
@@ -331,30 +333,69 @@ GraphicsConsoleControllerDriverStart (
   //\r
   HorizontalResolution  = 800;\r
   VerticalResolution    = 600;\r
-  ColorDepth            = 32;\r
-  RefreshRate           = 60;\r
-  Status = Private->UgaDraw->SetMode (\r
-                              Private->UgaDraw,\r
-                              HorizontalResolution,\r
-                              VerticalResolution,\r
-                              ColorDepth,\r
-                              RefreshRate\r
-                              );\r
-  if (EFI_ERROR (Status)) {\r
+\r
+  if (Private->GraphicsOutput != NULL) {\r
+    //\r
+    // The console is build on top of Graphics Output Protocol, find the mode number for 800x600\r
     //\r
-    // Get the current mode information from the UGA Draw Protocol\r
+    for (ModeNumber = 0; ModeNumber < Private->GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
+      Status = Private->GraphicsOutput->QueryMode (\r
+                         Private->GraphicsOutput,\r
+                         ModeNumber,\r
+                         &SizeOfInfo,\r
+                         &Info\r
+                         );\r
+      if (!EFI_ERROR (Status)) {\r
+        if ((Info->HorizontalResolution == 800) &&\r
+            (Info->VerticalResolution == 600)) {\r
+          Status = Private->GraphicsOutput->SetMode (Private->GraphicsOutput, ModeNumber);\r
+          if (!EFI_ERROR (Status)) {\r
+            gBS->FreePool (Info);\r
+            break;\r
+          }\r
+        }\r
+        gBS->FreePool (Info);\r
+      }\r
+    }\r
+\r
+    if (EFI_ERROR (Status) || (ModeNumber == Private->GraphicsOutput->Mode->MaxMode)) {\r
+      //\r
+      // Set default mode failed or device don't support default mode, then get the current mode information\r
+      //\r
+      HorizontalResolution = Private->GraphicsOutput->Mode->Info->HorizontalResolution;\r
+      VerticalResolution = Private->GraphicsOutput->Mode->Info->VerticalResolution;\r
+      ModeNumber = Private->GraphicsOutput->Mode->Mode;\r
+    }\r
+  } else {\r
     //\r
-    Status = Private->UgaDraw->GetMode (\r
+    // The console is build on top of UGA Draw Protocol\r
+    //\r
+    ColorDepth            = 32;\r
+    RefreshRate           = 60;\r
+    Status = Private->UgaDraw->SetMode (\r
                                 Private->UgaDraw,\r
-                                &HorizontalResolution,\r
-                                &VerticalResolution,\r
-                                &ColorDepth,\r
-                                &RefreshRate\r
+                                HorizontalResolution,\r
+                                VerticalResolution,\r
+                                ColorDepth,\r
+                                RefreshRate\r
                                 );\r
     if (EFI_ERROR (Status)) {\r
-      goto Error;\r
+      //\r
+      // Get the current mode information from the UGA Draw Protocol\r
+      //\r
+      Status = Private->UgaDraw->GetMode (\r
+                                  Private->UgaDraw,\r
+                                  &HorizontalResolution,\r
+                                  &VerticalResolution,\r
+                                  &ColorDepth,\r
+                                  &RefreshRate\r
+                                  );\r
+      if (EFI_ERROR (Status)) {\r
+        goto Error;\r
+      }\r
     }\r
   }\r
+\r
   //\r
   // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
   //\r
@@ -371,8 +412,9 @@ GraphicsConsoleControllerDriverStart (
   // Add Mode #0 that must be 80x25\r
   //\r
   MaxMode = 0;\r
-  Private->ModeData[MaxMode].UgaWidth   = HorizontalResolution;\r
-  Private->ModeData[MaxMode].UgaHeight  = VerticalResolution;\r
+  Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
+  Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
+  Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
   Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
   Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (25 * GLYPH_HEIGHT)) >> 1;\r
   MaxMode++;\r
@@ -381,8 +423,9 @@ GraphicsConsoleControllerDriverStart (
   // If it is possible to support Mode #1 - 80x50, than add it as an active mode\r
   //\r
   if (Rows >= 50) {\r
-    Private->ModeData[MaxMode].UgaWidth   = HorizontalResolution;\r
-    Private->ModeData[MaxMode].UgaHeight  = VerticalResolution;\r
+    Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
+    Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
+    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
     Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
     Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (50 * GLYPH_HEIGHT)) >> 1;\r
     MaxMode++;\r
@@ -395,8 +438,9 @@ GraphicsConsoleControllerDriverStart (
     if (MaxMode < 2) {\r
       Private->ModeData[MaxMode].Columns    = 0;\r
       Private->ModeData[MaxMode].Rows       = 0;\r
-      Private->ModeData[MaxMode].UgaWidth   = 800;\r
-      Private->ModeData[MaxMode].UgaHeight  = 600;\r
+      Private->ModeData[MaxMode].GopWidth   = 800;\r
+      Private->ModeData[MaxMode].GopHeight  = 600;\r
+      Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
       Private->ModeData[MaxMode].DeltaX     = 0;\r
       Private->ModeData[MaxMode].DeltaY     = 0;\r
       MaxMode++;\r
@@ -404,8 +448,9 @@ GraphicsConsoleControllerDriverStart (
 \r
     Private->ModeData[MaxMode].Columns    = 800 / GLYPH_WIDTH;\r
     Private->ModeData[MaxMode].Rows       = 600 / GLYPH_HEIGHT;\r
-    Private->ModeData[MaxMode].UgaWidth   = 800;\r
-    Private->ModeData[MaxMode].UgaHeight  = 600;\r
+    Private->ModeData[MaxMode].GopWidth   = 800;\r
+    Private->ModeData[MaxMode].GopHeight  = 600;\r
+    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
     Private->ModeData[MaxMode].DeltaX     = (800 % GLYPH_WIDTH) >> 1;\r
     Private->ModeData[MaxMode].DeltaY     = (600 % GLYPH_HEIGHT) >> 1;\r
     MaxMode++;\r
@@ -440,14 +485,23 @@ GraphicsConsoleControllerDriverStart (
 Error:\r
   if (EFI_ERROR (Status)) {\r
     //\r
-    // Close the UGA IO Protocol\r
+    // Close the GOP or UGA IO Protocol\r
     //\r
-    gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiUgaDrawProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
+    if (Private->GraphicsOutput != NULL) {\r
+      gBS->CloseProtocol (\r
+            Controller,\r
+            &gEfiGraphicsOutputProtocolGuid,\r
+            This->DriverBindingHandle,\r
+            Controller\r
+            );\r
+    } else {\r
+      gBS->CloseProtocol (\r
+            Controller,\r
+            &gEfiUgaDrawProtocolGuid,\r
+            This->DriverBindingHandle,\r
+            Controller\r
+            );\r
+    }\r
 \r
     //\r
     // Free private data\r
@@ -496,14 +550,23 @@ GraphicsConsoleControllerDriverStop (
 \r
   if (!EFI_ERROR (Status)) {\r
     //\r
-    // Close the UGA IO Protocol\r
+    // Close the GOP or UGA IO Protocol\r
     //\r
-    gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiUgaDrawProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
+    if (Private->GraphicsOutput != NULL) {\r
+      gBS->CloseProtocol (\r
+            Controller,\r
+            &gEfiGraphicsOutputProtocolGuid,\r
+            This->DriverBindingHandle,\r
+            Controller\r
+            );\r
+    } else {\r
+      gBS->CloseProtocol (\r
+            Controller,\r
+            &gEfiUgaDrawProtocolGuid,\r
+            This->DriverBindingHandle,\r
+            Controller\r
+            );\r
+    }\r
 \r
     //\r
     // Remove the font pack\r
@@ -640,6 +703,7 @@ GraphicsConsoleConOutOutputString (
 --*/\r
 {\r
   GRAPHICS_CONSOLE_DEV  *Private;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL   *GraphicsOutput;\r
   EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
   INTN                  Mode;\r
   UINTN                 MaxColumn;\r
@@ -649,19 +713,25 @@ GraphicsConsoleConOutOutputString (
   UINTN                 Delta;\r
   EFI_STATUS            Status;\r
   BOOLEAN               Warning;\r
-  EFI_UGA_PIXEL         Foreground;\r
-  EFI_UGA_PIXEL         Background;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL  Foreground;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL  Background;\r
   UINTN                 DeltaX;\r
   UINTN                 DeltaY;\r
   UINTN                 Count;\r
   UINTN                 Index;\r
   INT32                 OriginAttribute;\r
+  EFI_TPL               OldTpl;\r
+  CHAR16                         SpaceStr[] = { NARROW_CHAR, ' ', 0 };\r
+\r
+  Status = EFI_SUCCESS;\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
   //\r
   // Current mode\r
   //\r
   Mode      = This->Mode->Mode;\r
   Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+  GraphicsOutput = Private->GraphicsOutput;\r
   UgaDraw   = Private->UgaDraw;\r
 \r
   MaxColumn = Private->ModeData[Mode].Columns;\r
@@ -670,7 +740,7 @@ GraphicsConsoleConOutOutputString (
   DeltaY    = Private->ModeData[Mode].DeltaY;\r
   Width     = MaxColumn * GLYPH_WIDTH;\r
   Height    = (MaxRow - 1) * GLYPH_HEIGHT;\r
-  Delta     = Width * sizeof (EFI_UGA_PIXEL);\r
+  Delta     = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
 \r
   //\r
   // The Attributes won't change when during the time OutputString is called\r
@@ -720,38 +790,71 @@ GraphicsConsoleConOutOutputString (
       // down one row.\r
       //\r
       if (This->Mode->CursorRow == (INT32) (MaxRow - 1)) {\r
-        //\r
-        // Scroll Screen Up One Row\r
-        //\r
-        UgaDraw->Blt (\r
-                  UgaDraw,\r
-                  NULL,\r
-                  EfiUgaVideoToVideo,\r
-                  DeltaX,\r
-                  DeltaY + GLYPH_HEIGHT,\r
-                  DeltaX,\r
-                  DeltaY,\r
-                  Width,\r
-                  Height,\r
-                  Delta\r
-                  );\r
+        if (GraphicsOutput != NULL) {\r
+          //\r
+          // Scroll Screen Up One Row\r
+          //\r
+          GraphicsOutput->Blt (\r
+                    GraphicsOutput,\r
+                    NULL,\r
+                    EfiBltVideoToVideo,\r
+                    DeltaX,\r
+                    DeltaY + GLYPH_HEIGHT,\r
+                    DeltaX,\r
+                    DeltaY,\r
+                    Width,\r
+                    Height,\r
+                    Delta\r
+                    );\r
 \r
-        //\r
-        // Print Blank Line at last line\r
-        //\r
-        UgaDraw->Blt (\r
-                  UgaDraw,\r
-                  &Background,\r
-                  EfiUgaVideoFill,\r
-                  0,\r
-                  0,\r
-                  DeltaX,\r
-                  DeltaY + Height,\r
-                  Width,\r
-                  GLYPH_HEIGHT,\r
-                  Delta\r
-                  );\r
+          //\r
+          // Print Blank Line at last line\r
+          //\r
+          GraphicsOutput->Blt (\r
+                    GraphicsOutput,\r
+                    &Background,\r
+                    EfiBltVideoFill,\r
+                    0,\r
+                    0,\r
+                    DeltaX,\r
+                    DeltaY + Height,\r
+                    Width,\r
+                    GLYPH_HEIGHT,\r
+                    Delta\r
+                    );\r
+        } else {\r
+          //\r
+          // Scroll Screen Up One Row\r
+          //\r
+          UgaDraw->Blt (\r
+                    UgaDraw,\r
+                    NULL,\r
+                    EfiUgaVideoToVideo,\r
+                    DeltaX,\r
+                    DeltaY + GLYPH_HEIGHT,\r
+                    DeltaX,\r
+                    DeltaY,\r
+                    Width,\r
+                    Height,\r
+                    Delta\r
+                    );\r
 \r
+          //\r
+          // Print Blank Line at last line\r
+          //\r
+          UgaDraw->Blt (\r
+                    UgaDraw,\r
+                    (EFI_UGA_PIXEL *) (UINTN) &Background,\r
+                    EfiUgaVideoFill,\r
+                    0,\r
+                    0,\r
+                    DeltaX,\r
+                    DeltaY + Height,\r
+                    Width,\r
+                    GLYPH_HEIGHT,\r
+                    Delta\r
+                    );\r
+        }\r
       } else {\r
         This->Mode->CursorRow++;\r
       }\r
@@ -860,10 +963,12 @@ GraphicsConsoleConOutOutputString (
   EraseCursor (This);\r
 \r
   if (Warning) {\r
-    return EFI_WARN_UNKNOWN_GLYPH;\r
+    Status = EFI_WARN_UNKNOWN_GLYPH;\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
+\r
 }\r
 \r
 EFI_STATUS\r
@@ -902,10 +1007,8 @@ GraphicsConsoleConOutTestString (
   UINT16                GlyphWidth;\r
   UINT32                GlyphStatus;\r
   UINT16                Count;\r
-  GRAPHICS_CONSOLE_DEV  *Private;\r
   GLYPH_UNION           *Glyph;\r
 \r
-  Private     = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
   GlyphStatus = 0;\r
   Count       = 0;\r
 \r
@@ -966,22 +1069,30 @@ GraphicsConsoleConOutQueryMode (
 --*/\r
 {\r
   GRAPHICS_CONSOLE_DEV  *Private;\r
+  EFI_STATUS            Status;\r
+  EFI_TPL               OldTpl;\r
 \r
   if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
+  Status = EFI_SUCCESS;\r
+  \r
   Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
 \r
   *Columns  = Private->ModeData[ModeNumber].Columns;\r
   *Rows     = Private->ModeData[ModeNumber].Rows;\r
 \r
   if (*Columns <= 0 && *Rows <= 0) {\r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
 \r
   }\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -1016,36 +1127,48 @@ GraphicsConsoleConOutSetMode (
                 \r
 --*/\r
 {\r
-  EFI_STATUS                  Status;\r
-  GRAPHICS_CONSOLE_DEV        *Private;\r
-  EFI_UGA_DRAW_PROTOCOL       *UgaDraw;\r
-  GRAPHICS_CONSOLE_MODE_DATA  *ModeData;\r
-  EFI_UGA_PIXEL               *NewLineBuffer;\r
-  UINT32                      HorizontalResolution;\r
-  UINT32                      VerticalResolution;\r
-  UINT32                      ColorDepth;\r
-  UINT32                      RefreshRate;\r
+  EFI_STATUS                      Status;\r
+  GRAPHICS_CONSOLE_DEV            *Private;\r
+  GRAPHICS_CONSOLE_MODE_DATA      *ModeData;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL   *NewLineBuffer;\r
+  UINT32                          HorizontalResolution;\r
+  UINT32                          VerticalResolution;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL    *GraphicsOutput;\r
+  EFI_UGA_DRAW_PROTOCOL           *UgaDraw;\r
+  UINT32                          ColorDepth;\r
+  UINT32                          RefreshRate;\r
+  EFI_TPL                         OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
 \r
   Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+  GraphicsOutput = Private->GraphicsOutput;\r
   UgaDraw   = Private->UgaDraw;\r
   ModeData  = &(Private->ModeData[ModeNumber]);\r
 \r
+  if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
+  }\r
+\r
   //\r
   // Make sure the requested mode number is supported\r
   //\r
   if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
   }\r
 \r
   if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
   }\r
   //\r
   // Attempt to allocate a line buffer for the requested mode number\r
   //\r
   Status = gBS->AllocatePool (\r
                   EfiBootServicesData,\r
-                  sizeof (EFI_UGA_PIXEL) * ModeData->Columns * GLYPH_WIDTH * GLYPH_HEIGHT,\r
+                  sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * ModeData->Columns * GLYPH_WIDTH * GLYPH_HEIGHT,\r
                   (VOID **) &NewLineBuffer\r
                   );\r
   if (EFI_ERROR (Status)) {\r
@@ -1053,7 +1176,7 @@ GraphicsConsoleConOutSetMode (
     // The new line buffer could not be allocated, so return an error.\r
     // No changes to the state of the current console have been made, so the current console is still valid\r
     //\r
-    return Status;\r
+    goto Done;\r
   }\r
   //\r
   // If the mode has been set at least one other time, then LineBuffer will not be NULL\r
@@ -1069,7 +1192,8 @@ GraphicsConsoleConOutSetMode (
     //\r
     if ((INT32) ModeNumber == This->Mode->Mode) {\r
       gBS->FreePool (NewLineBuffer);\r
-      return EFI_SUCCESS;\r
+      Status = EFI_SUCCESS;\r
+      goto Done;\r
     }\r
     //\r
     // Otherwise, the size of the text console and/or the UGA mode will be changed,\r
@@ -1084,50 +1208,82 @@ GraphicsConsoleConOutSetMode (
   //\r
   Private->LineBuffer = NewLineBuffer;\r
 \r
-  //\r
-  // Get the current UGA Draw mode information\r
-  //\r
-  Status = UgaDraw->GetMode (\r
-                      UgaDraw,\r
-                      &HorizontalResolution,\r
-                      &VerticalResolution,\r
-                      &ColorDepth,\r
-                      &RefreshRate\r
-                      );\r
-  if (EFI_ERROR (Status) || HorizontalResolution != ModeData->UgaWidth || VerticalResolution != ModeData->UgaHeight) {\r
-    //\r
-    // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
-    //\r
-    Status = UgaDraw->SetMode (\r
-                        UgaDraw,\r
-                        ModeData->UgaWidth,\r
-                        ModeData->UgaHeight,\r
-                        32,\r
-                        60\r
-                        );\r
-    if (EFI_ERROR (Status)) {\r
+  if (GraphicsOutput != NULL) {\r
+    if (ModeData->GopModeNumber != GraphicsOutput->Mode->Mode) {\r
       //\r
-      // The mode set operation failed\r
+      // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
       //\r
-      return Status;\r
+      Status = GraphicsOutput->SetMode (GraphicsOutput, ModeData->GopModeNumber);\r
+      if (EFI_ERROR (Status)) {\r
+        //\r
+        // The mode set operation failed\r
+        //\r
+        goto Done;\r
+      }\r
+    } else {\r
+      //\r
+      // The current graphics mode is correct, so simply clear the entire display\r
+      //\r
+      Status = GraphicsOutput->Blt (\r
+                          GraphicsOutput,\r
+                          &mEfiColors[0],\r
+                          EfiBltVideoFill,\r
+                          0,\r
+                          0,\r
+                          0,\r
+                          0,\r
+                          ModeData->GopWidth,\r
+                          ModeData->GopHeight,\r
+                          0\r
+                          );\r
     }\r
   } else {\r
     //\r
-    // The current graphics mode is correct, so simply clear the entire display\r
+    // Get the current UGA Draw mode information\r
     //\r
-    Status = UgaDraw->Blt (\r
+    Status = UgaDraw->GetMode (\r
                         UgaDraw,\r
-                        &mEfiColors[0],\r
-                        EfiUgaVideoFill,\r
-                        0,\r
-                        0,\r
-                        0,\r
-                        0,\r
-                        ModeData->UgaWidth,\r
-                        ModeData->UgaHeight,\r
-                        0\r
+                        &HorizontalResolution,\r
+                        &VerticalResolution,\r
+                        &ColorDepth,\r
+                        &RefreshRate\r
                         );\r
+    if (EFI_ERROR (Status) || HorizontalResolution != ModeData->GopWidth || VerticalResolution != ModeData->GopHeight) {\r
+      //\r
+      // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
+      //\r
+      Status = UgaDraw->SetMode (\r
+                          UgaDraw,\r
+                          ModeData->GopWidth,\r
+                          ModeData->GopHeight,\r
+                          32,\r
+                          60\r
+                          );\r
+      if (EFI_ERROR (Status)) {\r
+        //\r
+        // The mode set operation failed\r
+        //\r
+        goto Done;\r
+      }\r
+    } else {\r
+      //\r
+      // The current graphics mode is correct, so simply clear the entire display\r
+      //\r
+      Status = UgaDraw->Blt (\r
+                          UgaDraw,\r
+                          (EFI_UGA_PIXEL *) (UINTN) &mEfiColors[0],\r
+                          EfiUgaVideoFill,\r
+                          0,\r
+                          0,\r
+                          0,\r
+                          0,\r
+                          ModeData->GopWidth,\r
+                          ModeData->GopHeight,\r
+                          0\r
+                          );\r
+    }\r
   }\r
+\r
   //\r
   // The new mode is valid, so commit the mode change\r
   //\r
@@ -1139,7 +1295,11 @@ GraphicsConsoleConOutSetMode (
   This->SetCursorPosition (This, 0, 0);\r
   This->EnableCursor (This, TRUE);\r
 \r
-  return EFI_SUCCESS;\r
+  Status = EFI_SUCCESS;\r
+\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -1173,6 +1333,8 @@ GraphicsConsoleConOutSetAttribute (
                 \r
 --*/\r
 {\r
+  EFI_TPL               OldTpl;\r
+  \r
   if ((Attribute | 0xFF) != 0xFF) {\r
     return EFI_UNSUPPORTED;\r
   }\r
@@ -1181,12 +1343,16 @@ GraphicsConsoleConOutSetAttribute (
     return EFI_SUCCESS;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
+\r
   EraseCursor (This);\r
 \r
   This->Mode->Attribute = (INT32) Attribute;\r
 \r
   EraseCursor (This);\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1220,37 +1386,58 @@ GraphicsConsoleConOutClearScreen (
                 \r
 --*/\r
 {\r
-  EFI_STATUS                  Status;\r
-  GRAPHICS_CONSOLE_DEV        *Private;\r
-  GRAPHICS_CONSOLE_MODE_DATA  *ModeData;\r
-  EFI_UGA_DRAW_PROTOCOL       *UgaDraw;\r
-  EFI_UGA_PIXEL               Foreground;\r
-  EFI_UGA_PIXEL               Background;\r
+  EFI_STATUS                    Status;\r
+  GRAPHICS_CONSOLE_DEV          *Private;\r
+  GRAPHICS_CONSOLE_MODE_DATA    *ModeData;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
+  EFI_UGA_DRAW_PROTOCOL         *UgaDraw;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
+  EFI_TPL                       OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
 \r
   Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+  GraphicsOutput = Private->GraphicsOutput;\r
   UgaDraw   = Private->UgaDraw;\r
   ModeData  = &(Private->ModeData[This->Mode->Mode]);\r
 \r
   GetTextColors (This, &Foreground, &Background);\r
-\r
-  Status = UgaDraw->Blt (\r
-                      UgaDraw,\r
-                      &Background,\r
-                      EfiUgaVideoFill,\r
-                      0,\r
-                      0,\r
-                      0,\r
-                      0,\r
-                      ModeData->UgaWidth,\r
-                      ModeData->UgaHeight,\r
-                      0\r
-                      );\r
+  if (GraphicsOutput != NULL) {\r
+    Status = GraphicsOutput->Blt (\r
+                        GraphicsOutput,\r
+                        &Background,\r
+                        EfiBltVideoFill,\r
+                        0,\r
+                        0,\r
+                        0,\r
+                        0,\r
+                        ModeData->GopWidth,\r
+                        ModeData->GopHeight,\r
+                        0\r
+                        );\r
+  } else {\r
+    Status = UgaDraw->Blt (\r
+                        UgaDraw,\r
+                        (EFI_UGA_PIXEL *) (UINTN) &Background,\r
+                        EfiUgaVideoFill,\r
+                        0,\r
+                        0,\r
+                        0,\r
+                        0,\r
+                        ModeData->GopWidth,\r
+                        ModeData->GopHeight,\r
+                        0\r
+                        );\r
+  }\r
 \r
   This->Mode->CursorColumn  = 0;\r
   This->Mode->CursorRow     = 0;\r
 \r
   EraseCursor (This);\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
@@ -1290,16 +1477,24 @@ GraphicsConsoleConOutSetCursorPosition (
 {\r
   GRAPHICS_CONSOLE_DEV        *Private;\r
   GRAPHICS_CONSOLE_MODE_DATA  *ModeData;\r
+  EFI_STATUS                  Status;\r
+  EFI_TPL                     OldTpl;\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
 \r
   Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
   ModeData  = &(Private->ModeData[This->Mode->Mode]);\r
 \r
   if ((Column >= ModeData->Columns) || (Row >= ModeData->Rows)) {\r
-    return EFI_UNSUPPORTED;\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
   }\r
 \r
   if (((INT32) Column == This->Mode->CursorColumn) && ((INT32) Row == This->Mode->CursorRow)) {\r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
   }\r
 \r
   EraseCursor (This);\r
@@ -1309,7 +1504,10 @@ GraphicsConsoleConOutSetCursorPosition (
 \r
   EraseCursor (This);\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -1341,20 +1539,26 @@ GraphicsConsoleConOutEnableCursor (
                 \r
 --*/\r
 {\r
+  EFI_TPL               OldTpl;\r
+  \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
+    \r
   EraseCursor (This);\r
 \r
   This->Mode->CursorVisible = Visible;\r
 \r
   EraseCursor (This);\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
   return EFI_SUCCESS;\r
 }\r
 \r
+STATIC\r
 EFI_STATUS\r
 GetTextColors (\r
   IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  OUT EFI_UGA_PIXEL                 *Foreground,\r
-  OUT EFI_UGA_PIXEL                 *Background\r
+  OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
+  OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
   )\r
 {\r
   INTN  Attribute;\r
@@ -1367,6 +1571,7 @@ GetTextColors (
   return EFI_SUCCESS;\r
 }\r
 \r
+STATIC\r
 EFI_STATUS\r
 DrawUnicodeWeightAtCursorN (\r
   IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
@@ -1381,9 +1586,10 @@ DrawUnicodeWeightAtCursorN (
   GLYPH_UNION           GlyphData;\r
   INTN                  GlyphX;\r
   INTN                  GlyphY;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
   EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
-  EFI_UGA_PIXEL         Foreground;\r
-  EFI_UGA_PIXEL         Background;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
   UINTN                 Index;\r
   UINTN                 ArrayIndex;\r
   UINTN                 Counts;\r
@@ -1473,23 +1679,40 @@ DrawUnicodeWeightAtCursorN (
   //\r
   GlyphX  = This->Mode->CursorColumn * GLYPH_WIDTH;\r
   GlyphY  = This->Mode->CursorRow * GLYPH_HEIGHT;\r
+  GraphicsOutput = Private->GraphicsOutput;\r
   UgaDraw = Private->UgaDraw;\r
-  UgaDraw->Blt (\r
-            UgaDraw,\r
-            Private->LineBuffer,\r
-            EfiUgaBltBufferToVideo,\r
-            0,\r
-            0,\r
-            GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
-            GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
-            GLYPH_WIDTH * Count,\r
-            GLYPH_HEIGHT,\r
-            GLYPH_WIDTH * Count * sizeof (EFI_UGA_PIXEL)\r
-            );\r
+  if (GraphicsOutput != NULL) {\r
+    GraphicsOutput->Blt (\r
+              GraphicsOutput,\r
+              Private->LineBuffer,\r
+              EfiBltBufferToVideo,\r
+              0,\r
+              0,\r
+              GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
+              GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
+              GLYPH_WIDTH * Count,\r
+              GLYPH_HEIGHT,\r
+              GLYPH_WIDTH * Count * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+              );\r
+  } else {\r
+    UgaDraw->Blt (\r
+              UgaDraw,\r
+              (EFI_UGA_PIXEL *) (UINTN) Private->LineBuffer,\r
+              EfiUgaBltBufferToVideo,\r
+              0,\r
+              0,\r
+              GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
+              GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
+              GLYPH_WIDTH * Count,\r
+              GLYPH_HEIGHT,\r
+              GLYPH_WIDTH * Count * sizeof (EFI_UGA_PIXEL)\r
+              );\r
+  }\r
 \r
   return ReturnStatus;\r
 }\r
 \r
+STATIC\r
 EFI_STATUS\r
 EraseCursor (\r
   IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This\r
@@ -1499,10 +1722,11 @@ EraseCursor (
   EFI_SIMPLE_TEXT_OUTPUT_MODE *CurrentMode;\r
   INTN                        GlyphX;\r
   INTN                        GlyphY;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL        *GraphicsOutput;\r
   EFI_UGA_DRAW_PROTOCOL       *UgaDraw;\r
-  EFI_UGA_PIXEL_UNION         Foreground;\r
-  EFI_UGA_PIXEL_UNION         Background;\r
-  EFI_UGA_PIXEL_UNION         BltChar[GLYPH_HEIGHT][GLYPH_WIDTH];\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Foreground;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Background;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[GLYPH_HEIGHT][GLYPH_WIDTH];\r
   UINTN                       X;\r
   UINTN                       Y;\r
 \r
@@ -1513,6 +1737,7 @@ EraseCursor (
   }\r
 \r
   Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+  GraphicsOutput = Private->GraphicsOutput;\r
   UgaDraw = Private->UgaDraw;\r
 \r
   //\r
@@ -1523,18 +1748,33 @@ EraseCursor (
   //\r
   GlyphX  = (CurrentMode->CursorColumn * GLYPH_WIDTH) + Private->ModeData[CurrentMode->Mode].DeltaX;\r
   GlyphY  = (CurrentMode->CursorRow * GLYPH_HEIGHT) + Private->ModeData[CurrentMode->Mode].DeltaY;\r
-  UgaDraw->Blt (\r
-            UgaDraw,\r
-            (EFI_UGA_PIXEL *) BltChar,\r
-            EfiUgaVideoToBltBuffer,\r
-            GlyphX,\r
-            GlyphY,\r
-            0,\r
-            0,\r
-            GLYPH_WIDTH,\r
-            GLYPH_HEIGHT,\r
-            GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
-            );\r
+  if (GraphicsOutput != NULL) {\r
+    GraphicsOutput->Blt (\r
+              GraphicsOutput,\r
+              (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar,\r
+              EfiBltVideoToBltBuffer,\r
+              GlyphX,\r
+              GlyphY,\r
+              0,\r
+              0,\r
+              GLYPH_WIDTH,\r
+              GLYPH_HEIGHT,\r
+              GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+              );\r
+  } else {\r
+    UgaDraw->Blt (\r
+              UgaDraw,\r
+              (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
+              EfiUgaVideoToBltBuffer,\r
+              GlyphX,\r
+              GlyphY,\r
+              0,\r
+              0,\r
+              GLYPH_WIDTH,\r
+              GLYPH_HEIGHT,\r
+              GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
+              );\r
+  }\r
 \r
   GetTextColors (This, &Foreground.Pixel, &Background.Pixel);\r
 \r
@@ -1549,18 +1789,33 @@ EraseCursor (
     }\r
   }\r
 \r
-  UgaDraw->Blt (\r
-            UgaDraw,\r
-            (EFI_UGA_PIXEL *) BltChar,\r
-            EfiUgaBltBufferToVideo,\r
-            0,\r
-            0,\r
-            GlyphX,\r
-            GlyphY,\r
-            GLYPH_WIDTH,\r
-            GLYPH_HEIGHT,\r
-            GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
-            );\r
+  if (GraphicsOutput != NULL) {\r
+    GraphicsOutput->Blt (\r
+              GraphicsOutput,\r
+              (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar,\r
+              EfiBltBufferToVideo,\r
+              0,\r
+              0,\r
+              GlyphX,\r
+              GlyphY,\r
+              GLYPH_WIDTH,\r
+              GLYPH_HEIGHT,\r
+              GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+              );\r
+  } else {\r
+    UgaDraw->Blt (\r
+              UgaDraw,\r
+              (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
+              EfiUgaBltBufferToVideo,\r
+              0,\r
+              0,\r
+              GlyphX,\r
+              GlyphY,\r
+              GLYPH_WIDTH,\r
+              GLYPH_HEIGHT,\r
+              GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
+              );\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r