On OUT, new console hanlde in system table.\r
@param ProtocolInterface On IN, console protocol on console handle in System Table to be checked. \r
On OUT, new console protocol on new console hanlde in system table.\r
+\r
+ @retval TRUE System Table has been updated.\r
+ @retval FALSE System Table hasn't been updated.\r
+\r
**/\r
-VOID \r
+BOOLEAN \r
UpdateSystemTableConsole (\r
IN CHAR16 *VarName,\r
IN EFI_GUID *ConsoleGuid,\r
// If ConsoleHandle is valid and console protocol on this handle also\r
// also matched, just return.\r
//\r
- return;\r
+ return FALSE;\r
}\r
}\r
\r
//\r
// If there is no any console device, just return.\r
//\r
- return ;\r
+ return FALSE;\r
}\r
\r
FullDevicePath = VarConsole;\r
//\r
*ConsoleHandle = NewHandle;\r
*ProtocolInterface = Interface;\r
- return ;\r
+ return TRUE;\r
}\r
}\r
\r
//\r
// No any available console devcie found.\r
//\r
- ASSERT (FALSE); \r
+ return FALSE;\r
}\r
\r
/**\r
)\r
{\r
EFI_STATUS Status;\r
+ BOOLEAN SystemTableUpdated;\r
\r
//\r
// Connect all default console variables\r
//\r
BdsLibConnectConsoleVariable (L"ErrOut");\r
\r
+ SystemTableUpdated = FALSE;\r
//\r
// Fill console handles in System Table if no console device assignd.\r
//\r
- UpdateSystemTableConsole (L"ConIn", &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **) &gST->ConIn);\r
- UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut);\r
- UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr);\r
+ if (UpdateSystemTableConsole (L"ConIn", &gEfiSimpleTextInProtocolGuid, &gST->ConsoleInHandle, (VOID **) &gST->ConIn)) {\r
+ SystemTableUpdated = TRUE;\r
+ }\r
+ if (UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut)) {\r
+ SystemTableUpdated = TRUE;\r
+ }\r
+ if (UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr)) {\r
+ SystemTableUpdated = TRUE;\r
+ }\r
+\r
+ if (SystemTableUpdated) {\r
+ //\r
+ // Update the CRC32 in the EFI System Table header\r
+ //\r
+ gST->Hdr.CRC32 = 0;\r
+ gBS->CalculateCrc32 (\r
+ (UINT8 *) &gST->Hdr,\r
+ gST->Hdr.HeaderSize,\r
+ &gST->Hdr.CRC32\r
+ );\r
+ }\r
\r
return EFI_SUCCESS;\r
\r
\r
if (mStdErr.CurrentNumberOfConsoles == 0) {\r
//\r
- // Create virtual device handle for StdErr Splitter\r
+ // Construct console output devices' private data\r
//\r
Status = ConSplitterTextOutConstructor (&mStdErr);\r
- if (!EFI_ERROR (Status)) {\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &mStdErr.VirtualHandle,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- &mStdErr.TextOut,\r
- NULL\r
- );\r
- }\r
- \r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
//\r
// Create virtual device handle for StdErr Splitter\r
//\r
- Status = ConSplitterTextOutConstructor (&mStdErr);\r
- if (!EFI_ERROR (Status)) {\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &mStdErr.VirtualHandle,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- &mStdErr.TextOut,\r
- NULL\r
- );\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &mStdErr.VirtualHandle,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ &mStdErr.TextOut,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
}\r
\r
gST->StandardErrorHandle = mStdErr.VirtualHandle;\r
**/\r
EFI_STATUS\r
ConSplitterGrowBuffer (\r
- IN UINTN SizeOfCount,\r
- IN UINTN *Count,\r
+ IN UINTN SizeOfCount,\r
+ IN OUT UINTN *Count,\r
IN OUT VOID **Buffer\r
)\r
{\r
// If the Text Out List is full, enlarge it by calling ConSplitterGrowBuffer().\r
//\r
while (CurrentNumOfConsoles >= Private->TextOutListCount) {\r
+ CpuBreakpoint ();\r
Status = ConSplitterGrowBuffer (\r
sizeof (TEXT_OUT_AND_GOP_DATA),\r
&Private->TextOutListCount,\r