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
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
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
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
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