//\r
ConOutPrivate->TextOut.Mode = &ConOutPrivate->TextOutMode;\r
\r
+ //\r
+ // When new console device is added, the new mode will be set later,\r
+ // so put current mode back to init state.\r
+ // \r
+ ConOutPrivate->TextOutMode.Mode = 0xFF;\r
+\r
Status = ConSplitterGrowBuffer (\r
sizeof (TEXT_OUT_AND_GOP_DATA),\r
&ConOutPrivate->TextOutListCount,\r
if (EFI_ERROR (Status)) {\r
UgaDraw = NULL;\r
}\r
+\r
+ //\r
+ // When new console device is added, the new mode will be set later,\r
+ // so put current mode back to init state.\r
+ //\r
+ mConOut.TextOutMode.Mode = 0xFF;\r
+ \r
//\r
// If both ConOut and StdErr incorporate the same Text Out device,\r
// their MaxMode and QueryData should be the intersection of both.\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+ \r
+ //\r
+ // When new console device is added, the new mode will be set later,\r
+ // so put current mode back to init state.\r
+ //\r
+ mStdErr.TextOutMode.Mode = 0xFF;\r
+ \r
//\r
// If both ConOut and StdErr incorporate the same Text Out device,\r
// their MaxMode and QueryData should be the intersection of both.\r
return Status;\r
}\r
\r
+VOID\r
+ConsplitterSetConsoleOutMode (\r
+ IN TEXT_OUT_SPLITTER_PRIVATE_DATA *Private\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ This routine will get the current console mode information (column, row)\r
+ from ConsoleOutMode variable and set it; if the variable does not exist,\r
+ set to user defined console mode.\r
+\r
+Arguments:\r
+\r
+ None\r
+\r
+Returns:\r
+\r
+ None\r
+\r
+--*/ \r
+{\r
+ UINTN Col;\r
+ UINTN Row;\r
+ UINTN Mode;\r
+ UINTN PreferMode;\r
+ UINTN BaseMode;\r
+ UINTN ModeInfoSize;\r
+ UINTN MaxMode;\r
+ EFI_STATUS Status;\r
+ CONSOLE_OUT_MODE *ModeInfo;\r
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *TextOut;\r
+ \r
+ PreferMode = 0xFF;\r
+ BaseMode = 0xFF;\r
+ TextOut = &Private->TextOut;\r
+ MaxMode = (UINTN) (TextOut->Mode->MaxMode);\r
+ ModeInfoSize = sizeof (CONSOLE_OUT_MODE);\r
+\r
+ ModeInfo = AllocateZeroPool (sizeof(CONSOLE_OUT_MODE));\r
+ ASSERT(ModeInfo != NULL);\r
+\r
+ Status = gRT->GetVariable (\r
+ VarConOutMode,\r
+ &gEfiGenericPlatformVariableGuid,\r
+ NULL,\r
+ &ModeInfoSize,\r
+ ModeInfo\r
+ );\r
+\r
+ //\r
+ // Set to the default mode 80 x 25 required by EFI/UEFI spec; \r
+ // user can also define other valid default console mode here.\r
+ // \r
+ if (EFI_ERROR(Status)) {\r
+ ModeInfo->Column = 80;\r
+ ModeInfo->Row = 25;\r
+ Status = gRT->SetVariable (\r
+ VarConOutMode,\r
+ &gEfiGenericPlatformVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+ sizeof (CONSOLE_OUT_MODE),\r
+ ModeInfo\r
+ ); \r
+ }\r
+ \r
+ for (Mode = 0; Mode < MaxMode; Mode++) {\r
+ Status = TextOut->QueryMode (TextOut, Mode, &Col, &Row);\r
+ if (!EFI_ERROR(Status)) {\r
+ if (Col == ModeInfo->Column && Row == ModeInfo->Row) {\r
+ PreferMode = Mode;\r
+ }\r
+ if (Col == 80 && Row == 25) {\r
+ BaseMode = Mode;\r
+ }\r
+ }\r
+ }\r
+ \r
+ Status = TextOut->SetMode (TextOut, PreferMode);\r
+ \r
+ //\r
+ // if current mode setting is failed, default 80x25 mode will be set.\r
+ //\r
+ if (EFI_ERROR(Status)) {\r
+ Status = TextOut->SetMode (TextOut, BaseMode);\r
+ ASSERT(!EFI_ERROR(Status));\r
+ \r
+ ModeInfo->Column = 80;\r
+ ModeInfo->Row = 25;\r
+ \r
+ //\r
+ // Update ConOutMode variable\r
+ //\r
+ Status = gRT->SetVariable (\r
+ VarConOutMode,\r
+ &gEfiGenericPlatformVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+ sizeof (CONSOLE_OUT_MODE),\r
+ ModeInfo\r
+ ); \r
+ }\r
+\r
+ gBS->FreePool (ModeInfo);\r
+}\r
+\r
+\r
EFI_STATUS\r
ConSplitterTextOutAddDevice (\r
IN TEXT_OUT_SPLITTER_PRIVATE_DATA *Private,\r
Private->TextOut.SetMode (&Private->TextOut, 0);\r
}\r
\r
+ //\r
+ // After adding new console device, all existing console devices should be \r
+ // synced to the current shared mode.\r
+ //\r
+ ConsplitterSetConsoleOutMode (Private);\r
+\r
return Status;\r
}\r
\r