MdeModulePkg/TerminalDxe: Refine InitializeTerminalConsoleTextMode
authorRuiyu Ni <ruiyu.ni@intel.com>
Tue, 10 Jan 2017 05:11:25 +0000 (13:11 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Wed, 11 Jan 2017 09:25:25 +0000 (17:25 +0800)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c

index 1ffb6ff39588638b2ac4bc9dd1eb08398061424f..3b2e34fba0f6ced542c251aee28bd89fa86c4ca8 100644 (file)
@@ -113,6 +113,8 @@ TERMINAL_DEV  mTerminalDevTemplate = {
 };\r
 \r
 TERMINAL_CONSOLE_MODE_DATA mTerminalConsoleModeData[] = {\r
+  {80,  25},\r
+  {80,  50},\r
   {100, 31},\r
   //\r
   // New modes can be added here.\r
@@ -450,97 +452,39 @@ TerminalFreeNotifyList (
   It returns information for available text modes that the terminal can support.\r
 \r
   @param[out] TextModeCount      The total number of text modes that terminal console supports.\r
-  @param[out] TextModeData       The buffer to the text modes column and row information.\r
-                                 Caller is responsible to free it when it's non-NULL.\r
 \r
-  @retval EFI_SUCCESS            The supporting mode information is returned.\r
-  @retval EFI_INVALID_PARAMETER  The parameters are invalid.\r
+  @return   The buffer to the text modes column and row information.\r
+            Caller is responsible to free it when it's non-NULL.\r
 \r
 **/\r
-EFI_STATUS\r
+TERMINAL_CONSOLE_MODE_DATA *\r
 InitializeTerminalConsoleTextMode (\r
-  OUT UINTN                         *TextModeCount,\r
-  OUT TERMINAL_CONSOLE_MODE_DATA    **TextModeData\r
-  )\r
+  OUT INT32                         *TextModeCount\r
+)\r
 {\r
-  UINTN                       Index;\r
-  UINTN                       Count;\r
-  TERMINAL_CONSOLE_MODE_DATA  *ModeBuffer;\r
-  TERMINAL_CONSOLE_MODE_DATA  *NewModeBuffer;\r
-  UINTN                       ValidCount;\r
-  UINTN                       ValidIndex;\r
-  \r
-  if ((TextModeCount == NULL) || (TextModeData == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  \r
-  Count = sizeof (mTerminalConsoleModeData) / sizeof (TERMINAL_CONSOLE_MODE_DATA);\r
-  \r
-  //\r
-  // Get defined mode buffer pointer.\r
-  //\r
-  ModeBuffer = mTerminalConsoleModeData;\r
-    \r
+  TERMINAL_CONSOLE_MODE_DATA  *TextModeData;\r
+\r
+  ASSERT (TextModeCount != NULL);\r
+\r
   //\r
   // Here we make sure that the final mode exposed does not include the duplicated modes,\r
   // and does not include the invalid modes which exceed the max column and row.\r
   // Reserve 2 modes for 80x25, 80x50 of terminal console.\r
   //\r
-  NewModeBuffer = AllocateZeroPool (sizeof (TERMINAL_CONSOLE_MODE_DATA) * (Count + 2));\r
-  ASSERT (NewModeBuffer != NULL);\r
-\r
-  //\r
-  // Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec.\r
-  //\r
-  ValidCount = 0;  \r
-\r
-  NewModeBuffer[ValidCount].Columns = 80;\r
-  NewModeBuffer[ValidCount].Rows    = 25;\r
-  ValidCount++;\r
-\r
-  NewModeBuffer[ValidCount].Columns = 80;\r
-  NewModeBuffer[ValidCount].Rows    = 50;\r
-  ValidCount++;\r
-  \r
-  //\r
-  // Start from mode 2 to put the valid mode other than 80x25 and 80x50 in the output mode buffer.\r
-  //\r
-  for (Index = 0; Index < Count; Index++) {\r
-    if ((ModeBuffer[Index].Columns == 0) || (ModeBuffer[Index].Rows == 0)) {\r
-      //\r
-      // Skip the pre-defined mode which is invalid.\r
-      //\r
-      continue;\r
-    }\r
-    for (ValidIndex = 0; ValidIndex < ValidCount; ValidIndex++) {\r
-      if ((ModeBuffer[Index].Columns == NewModeBuffer[ValidIndex].Columns) &&\r
-          (ModeBuffer[Index].Rows == NewModeBuffer[ValidIndex].Rows)) {\r
-        //\r
-        // Skip the duplicated mode.\r
-        //\r
-        break;\r
-      }\r
-    }\r
-    if (ValidIndex == ValidCount) {\r
-      NewModeBuffer[ValidCount].Columns = ModeBuffer[Index].Columns;\r
-      NewModeBuffer[ValidCount].Rows    = ModeBuffer[Index].Rows;\r
-      ValidCount++;\r
-    }\r
+  TextModeData = AllocateCopyPool (sizeof (mTerminalConsoleModeData), mTerminalConsoleModeData);\r
+  if (TextModeData == NULL) {\r
+    return NULL;\r
   }\r
\r
+  *TextModeCount = ARRAY_SIZE (mTerminalConsoleModeData);\r
+\r
   DEBUG_CODE (\r
-    for (Index = 0; Index < ValidCount; Index++) {\r
-      DEBUG ((EFI_D_INFO, "Terminal - Mode %d, Column = %d, Row = %d\n", \r
-                           Index, NewModeBuffer[Index].Columns, NewModeBuffer[Index].Rows));  \r
+    INT32 Index;\r
+    for (Index = 0; Index < *TextModeCount; Index++) {\r
+      DEBUG ((DEBUG_INFO, "Terminal - Mode %d, Column = %d, Row = %d\n",\r
+              Index, TextModeData[Index].Columns, TextModeData[Index].Rows));\r
     }\r
   );\r
-  \r
-  //\r
-  // Return valid mode count and mode information buffer.\r
-  //\r
-  *TextModeCount = ValidCount;\r
-  *TextModeData  = NewModeBuffer;\r
-  return EFI_SUCCESS;\r
+  return TextModeData;\r
 }\r
 \r
 /**\r
@@ -632,7 +576,6 @@ TerminalDriverBindingStart (
   BOOLEAN                             SimTxtInInstalled;\r
   BOOLEAN                             SimTxtOutInstalled;\r
   BOOLEAN                             FirstEnter;\r
-  UINTN                               ModeCount;\r
 \r
   TerminalDevice     = NULL;\r
   ConInSelected      = FALSE;\r
@@ -896,12 +839,13 @@ TerminalDriverBindingStart (
                          );\r
     SimpleTextOutput->Mode = &TerminalDevice->SimpleTextOutputMode;\r
     \r
-    Status = InitializeTerminalConsoleTextMode (&ModeCount, &TerminalDevice->TerminalConsoleModeData);\r
-    if (EFI_ERROR (Status)) {\r
+    TerminalDevice->TerminalConsoleModeData = InitializeTerminalConsoleTextMode (\r
+                                                &SimpleTextOutput->Mode->MaxMode\r
+                                                );\r
+    if (TerminalDevice->TerminalConsoleModeData == NULL) {\r
       goto ReportError;\r
     }\r
-    TerminalDevice->SimpleTextOutputMode.MaxMode = (INT32) ModeCount;\r
-    \r
+\r
     //\r
     // For terminal devices, cursor is always visible\r
     //\r