]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c
1. Sync the tracker for supporting the ModeNumber larger than 2.
[mirror_edk2.git] / MdeModulePkg / Universal / Console / ConSplitterDxe / ConSplitter.c
index 63be0b1d8b467a139545e0a3db3a7f531611f387..abf359542a2072b08e55624583cf214a0635597d 100644 (file)
@@ -2152,12 +2152,20 @@ Returns:
   Mode  = 0;\r
   Index = 0;\r
   while (Mode < MaxMode) {\r
-    TextOut->QueryMode (\r
-              TextOut,\r
-              Mode,\r
-              &Private->TextOutQueryData[Mode].Columns,\r
-              &Private->TextOutQueryData[Mode].Rows\r
-              );\r
+    Status = TextOut->QueryMode (\r
+                  TextOut,\r
+                  Mode,\r
+                  &Private->TextOutQueryData[Mode].Columns,\r
+                  &Private->TextOutQueryData[Mode].Rows\r
+                  );\r
+    //\r
+    // If mode 1 (80x50) is not supported, make sure mode 1 in TextOutQueryData\r
+    // is clear to 0x0.\r
+    //\r
+    if ((EFI_ERROR(Status)) && (Mode == 1)) {\r
+      Private->TextOutQueryData[Mode].Columns = 0;\r
+      Private->TextOutQueryData[Mode].Rows = 0;\r
+    }\r
     Private->TextOutModeMap[Index] = Mode;\r
     Mode++;\r
     Index += Private->TextOutListCount;\r
@@ -2166,6 +2174,24 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Reconstruct TextOutModeMap to get intersection of modes\r
+\r
+  This routine reconstruct TextOutModeMap to get the intersection\r
+  of modes for all console out devices. Because EFI/UEFI spec require\r
+  mode 0 is 80x25, mode 1 is 80x50, this routine will not check the\r
+  intersection for mode 0 and mode 1.\r
+\r
+  @parm TextOutModeMap  Current text out mode map, begin with the mode 80x25\r
+  @parm NewlyAddedMap   New text out mode map, begin with the mode 80x25\r
+  @parm MapStepSize     Mode step size for one console device\r
+  @parm NewMapStepSize  Mode step size for one console device\r
+  @parm MaxMode         Current max text mode\r
+  @parm CurrentMode     Current text mode\r
+\r
+  @retval None\r
+\r
+**/\r
 STATIC\r
 VOID\r
 ConSplitterGetIntersection (\r
@@ -2183,9 +2209,16 @@ ConSplitterGetIntersection (
   INT32 CurrentMaxMode;\r
   INT32 Mode;\r
 \r
-  Index           = 0;\r
-  CurrentMapEntry = TextOutModeMap;\r
-  NextMapEntry    = TextOutModeMap;\r
+  //\r
+  // According to EFI/UEFI spec, mode 0 and mode 1 have been reserved\r
+  // for 80x25 and 80x50 in Simple Text Out protocol, so don't make intersection\r
+  // for mode 0 and mode 1, mode number starts from 2.\r
+  //\r
+  Index           = 2;\r
+  CurrentMapEntry = &TextOutModeMap[MapStepSize * 2];\r
+  NextMapEntry    = &TextOutModeMap[MapStepSize * 2];\r
+  NewlyAddedMap   = &NewlyAddedMap[NewMapStepSize * 2];\r
+\r
   CurrentMaxMode  = *MaxMode;\r
   Mode            = *CurrentMode;\r
 \r
@@ -2248,6 +2281,7 @@ Returns:
   UINTN                         Rows;\r
   UINTN                         Columns;\r
   UINTN                         StepSize;\r
+  EFI_STATUS                    Status;\r
 \r
   //\r
   // Must make sure that current mode won't change even if mode number changes\r
@@ -2263,9 +2297,16 @@ Returns:
   Mode      = 0;\r
   MapTable  = TextOutModeMap + Private->CurrentNumberOfConsoles;\r
   while (Mode < TextOut->Mode->MaxMode) {\r
-    TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);\r
+    Status = TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);\r
+    if (EFI_ERROR(Status)) {\r
+      if (Mode == 1) {\r
         MapTable[StepSize] = Mode;\r
-\r
+        TextOutQueryData[Mode].Columns = 0;\r
+        TextOutQueryData[Mode].Rows = 0;\r
+      }\r
+      Mode++;\r
+      continue;\r
+    }\r
     //\r
     // Search the intersection map and QueryData database to see if they intersects\r
     //\r