Add a lock to protect the critical region in Service APIs for gEfiSimpleTextOutProtoc...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Mar 2007 09:42:34 +0000 (09:42 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Mar 2007 09:42:34 +0000 (09:42 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2447 6f19259b-4bc3-4df7-8a09-765794883524

EdkModulePkg/Universal/Console/GraphicsConsole/Dxe/GraphicsConsole.c

index 4a2dd59..3f79991 100644 (file)
@@ -6,7 +6,7 @@ Remaining Tasks
   Solve palette issues for mixed graphics and text\r
   When does this protocol reset the palette?\r
     \r
   Solve palette issues for mixed graphics and text\r
   When does this protocol reset the palette?\r
     \r
-Copyright (c) 2006 Intel Corporation. <BR>\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
 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
@@ -720,8 +720,12 @@ GraphicsConsoleConOutOutputString (
   UINTN                 Count;\r
   UINTN                 Index;\r
   INT32                 OriginAttribute;\r
   UINTN                 Count;\r
   UINTN                 Index;\r
   INT32                 OriginAttribute;\r
+  EFI_TPL               OldTpl;\r
   CHAR16                         SpaceStr[] = { NARROW_CHAR, ' ', 0 };\r
 \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
   //\r
   // Current mode\r
   //\r
@@ -959,10 +963,12 @@ GraphicsConsoleConOutOutputString (
   EraseCursor (This);\r
 \r
   if (Warning) {\r
   EraseCursor (This);\r
 \r
   if (Warning) {\r
-    return EFI_WARN_UNKNOWN_GLYPH;\r
+    Status = EFI_WARN_UNKNOWN_GLYPH;\r
   }\r
 \r
   }\r
 \r
-  return EFI_SUCCESS;\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
+\r
 }\r
 \r
 EFI_STATUS\r
 }\r
 \r
 EFI_STATUS\r
@@ -1063,22 +1069,30 @@ GraphicsConsoleConOutQueryMode (
 --*/\r
 {\r
   GRAPHICS_CONSOLE_DEV  *Private;\r
 --*/\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
 \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
   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
 \r
   }\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
 }\r
 \r
 EFI_STATUS\r
@@ -1113,16 +1127,19 @@ GraphicsConsoleConOutSetMode (
                 \r
 --*/\r
 {\r
                 \r
 --*/\r
 {\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_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
 \r
   Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
   GraphicsOutput = Private->GraphicsOutput;\r
@@ -1130,18 +1147,21 @@ GraphicsConsoleConOutSetMode (
   ModeData  = &(Private->ModeData[ModeNumber]);\r
 \r
   if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
   ModeData  = &(Private->ModeData[ModeNumber]);\r
 \r
   if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
-    return EFI_UNSUPPORTED;\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
   }\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
   }\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
   //\r
   // Attempt to allocate a line buffer for the requested mode number\r
@@ -1156,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
     // 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
   }\r
   //\r
   // If the mode has been set at least one other time, then LineBuffer will not be NULL\r
@@ -1172,7 +1192,8 @@ GraphicsConsoleConOutSetMode (
     //\r
     if ((INT32) ModeNumber == This->Mode->Mode) {\r
       gBS->FreePool (NewLineBuffer);\r
     //\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
     }\r
     //\r
     // Otherwise, the size of the text console and/or the UGA mode will be changed,\r
@@ -1197,7 +1218,7 @@ GraphicsConsoleConOutSetMode (
         //\r
         // The mode set operation failed\r
         //\r
         //\r
         // The mode set operation failed\r
         //\r
-        return Status;\r
+        goto Done;\r
       }\r
     } else {\r
       //\r
       }\r
     } else {\r
       //\r
@@ -1242,7 +1263,7 @@ GraphicsConsoleConOutSetMode (
         //\r
         // The mode set operation failed\r
         //\r
         //\r
         // The mode set operation failed\r
         //\r
-        return Status;\r
+        goto Done;\r
       }\r
     } else {\r
       //\r
       }\r
     } else {\r
       //\r
@@ -1274,7 +1295,11 @@ GraphicsConsoleConOutSetMode (
   This->SetCursorPosition (This, 0, 0);\r
   This->EnableCursor (This, TRUE);\r
 \r
   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
 }\r
 \r
 EFI_STATUS\r
@@ -1308,6 +1333,8 @@ GraphicsConsoleConOutSetAttribute (
                 \r
 --*/\r
 {\r
                 \r
 --*/\r
 {\r
+  EFI_TPL               OldTpl;\r
+  \r
   if ((Attribute | 0xFF) != 0xFF) {\r
     return EFI_UNSUPPORTED;\r
   }\r
   if ((Attribute | 0xFF) != 0xFF) {\r
     return EFI_UNSUPPORTED;\r
   }\r
@@ -1316,12 +1343,16 @@ GraphicsConsoleConOutSetAttribute (
     return EFI_SUCCESS;\r
   }\r
 \r
     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
   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
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1355,13 +1386,16 @@ GraphicsConsoleConOutClearScreen (
                 \r
 --*/\r
 {\r
                 \r
 --*/\r
 {\r
-  EFI_STATUS                  Status;\r
-  GRAPHICS_CONSOLE_DEV        *Private;\r
-  GRAPHICS_CONSOLE_MODE_DATA  *ModeData;\r
+  EFI_STATUS                    Status;\r
+  GRAPHICS_CONSOLE_DEV          *Private;\r
+  GRAPHICS_CONSOLE_MODE_DATA    *ModeData;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL       *UgaDraw;\r
+  EFI_UGA_DRAW_PROTOCOL         *UgaDraw;\r
   EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
   EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\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
 \r
   Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
   GraphicsOutput = Private->GraphicsOutput;\r
@@ -1402,6 +1436,8 @@ GraphicsConsoleConOutClearScreen (
 \r
   EraseCursor (This);\r
 \r
 \r
   EraseCursor (This);\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -1441,16 +1477,24 @@ GraphicsConsoleConOutSetCursorPosition (
 {\r
   GRAPHICS_CONSOLE_DEV        *Private;\r
   GRAPHICS_CONSOLE_MODE_DATA  *ModeData;\r
 {\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
 \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
   }\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
   }\r
 \r
   EraseCursor (This);\r
@@ -1460,7 +1504,10 @@ GraphicsConsoleConOutSetCursorPosition (
 \r
   EraseCursor (This);\r
 \r
 \r
   EraseCursor (This);\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
 }\r
 \r
 EFI_STATUS\r
@@ -1492,12 +1539,17 @@ GraphicsConsoleConOutEnableCursor (
                 \r
 --*/\r
 {\r
                 \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
   EraseCursor (This);\r
 \r
   This->Mode->CursorVisible = Visible;\r
 \r
   EraseCursor (This);\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r