From 18cf3950226cb7e279f19978ea441ce6639f7bb3 Mon Sep 17 00:00:00 2001 From: czhang46 Date: Mon, 30 Jul 2012 05:56:33 +0000 Subject: [PATCH] Add 2 new Bds features 1. Lazy ConIn 2. OsIndicationsSupported & OsIndications Signed-off-by: Chao Zhang Reviewed-by: Hot Tian git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13566 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Include/Library/GenericBdsLib.h | 19 ++- .../Library/GenericBdsLib/BdsConsole.c | 69 +++++++++++ .../Universal/BdsDxe/BdsDxe.inf | 1 + .../Universal/BdsDxe/BdsEntry.c | 64 ++++++++++- .../Universal/BdsDxe/FrontPage.c | 108 +++++++++++++----- .../Universal/BdsDxe/MemoryTest.c | 44 +++---- 6 files changed, 251 insertions(+), 54 deletions(-) diff --git a/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h b/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h index 64732e5180..422666abe0 100644 --- a/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h +++ b/IntelFrameworkModulePkg/Include/Library/GenericBdsLib.h @@ -4,7 +4,7 @@ 2) BDS boot device connect interface. 3) BDS Misc interfaces for mainting boot variable, ouput string. -Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.
+Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License that accompanies this distribution. The full text of the license may be found at @@ -465,6 +465,23 @@ BdsLibConnectAllDefaultConsoles ( VOID ); + +/** + This function will connect console device except ConIn base on the console + device variable ConOut and ErrOut. + + @retval EFI_SUCCESS At least one of the ConOut device have + been connected success. + @retval EFI_STATUS Return the status of BdsLibConnectConsoleVariable (). + +**/ +EFI_STATUS +EFIAPI +BdsLibConnectAllDefaultConsolesWithOutConIn ( + VOID + ); + + /** This function updates the console variable based on ConVarName. It can add or remove one specific console device path from the variable diff --git a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c index 1ded13637d..280b1697b6 100644 --- a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c +++ b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c @@ -561,6 +561,75 @@ BdsLibConnectAllDefaultConsoles ( } +/** + This function will connect console device except ConIn base on the console + device variable ConOut and ErrOut. + + @retval EFI_SUCCESS At least one of the ConOut device have + been connected success. + @retval EFI_STATUS Return the status of BdsLibConnectConsoleVariable (). + +**/ +EFI_STATUS +EFIAPI +BdsLibConnectAllDefaultConsolesWithOutConIn ( + VOID + ) +{ + EFI_STATUS Status; + BOOLEAN SystemTableUpdated; + + // + // Connect all default console variables except ConIn + // + + // + // It seems impossible not to have any ConOut device on platform, + // so we check the status here. + // + Status = BdsLibConnectConsoleVariable (L"ConOut"); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Insert the performance probe for Console Out + // + PERF_START (NULL, "ConOut", "BDS", 1); + PERF_END (NULL, "ConOut", "BDS", 0); + + // + // The _ModuleEntryPoint err out var is legal. + // + BdsLibConnectConsoleVariable (L"ErrOut"); + + SystemTableUpdated = FALSE; + // + // Fill console handles in System Table if no console device assignd. + // + if (UpdateSystemTableConsole (L"ConOut", &gEfiSimpleTextOutProtocolGuid, &gST->ConsoleOutHandle, (VOID **) &gST->ConOut)) { + SystemTableUpdated = TRUE; + } + if (UpdateSystemTableConsole (L"ErrOut", &gEfiSimpleTextOutProtocolGuid, &gST->StandardErrorHandle, (VOID **) &gST->StdErr)) { + SystemTableUpdated = TRUE; + } + + if (SystemTableUpdated) { + // + // Update the CRC32 in the EFI System Table header + // + gST->Hdr.CRC32 = 0; + gBS->CalculateCrc32 ( + (UINT8 *) &gST->Hdr, + gST->Hdr.HeaderSize, + &gST->Hdr.CRC32 + ); + } + + return EFI_SUCCESS; + +} + /** Convert a *.BMP graphics image to a GOP blt buffer. If a NULL Blt buffer is passed in a GopBlt buffer will be allocated by this routine. If a GopBlt diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf index c3f8c734ea..0134f9b7d1 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf @@ -180,6 +180,7 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareRevision gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution + gEfiMdeModulePkgTokenSpaceGuid.PcdConInConnectOnDemand gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdSetupConOutColumn gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdSetupConOutRow gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c index ecccc0648e..def572d2d5 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c @@ -361,22 +361,80 @@ BdsFormalizeConsoleVariable ( /** - Validate variables. - - If found the device path is not a valid device path, remove the variable. + Formalize Bds global variables. + 1. For ConIn/ConOut/ConErr, if found the device path is not a valid device path, remove the variable. + 2. For OsIndicationsSupported, Create a BS/RT/UINT64 variable to report caps + 3. Delete OsIndications variable if it is not NV/BS/RT UINT64 + Item 3 is used to solve case when OS corrupts OsIndications. Here simply delete this NV variable. + **/ VOID BdsFormalizeEfiGlobalVariable ( VOID ) { + EFI_STATUS Status; + UINT64 OsIndicationSupport; + UINT64 OsIndication; + UINTN DataSize; + UINT32 Attributes; + // // Validate Console variable. // BdsFormalizeConsoleVariable (L"ConIn"); BdsFormalizeConsoleVariable (L"ConOut"); BdsFormalizeConsoleVariable (L"ErrOut"); + + // + // OS indicater support variable + // + OsIndicationSupport = EFI_OS_INDICATIONS_BOOT_TO_FW_UI; + Status = gRT->SetVariable ( + L"OsIndicationsSupported", + &gEfiGlobalVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(UINT64), + &OsIndicationSupport + ); + ASSERT_EFI_ERROR (Status); + + // + // If OsIndications is invalid, remove it. + // Invalid case + // 1. Data size != UINT64 + // 2. OsIndication value inconsistence + // 3. OsIndication attribute inconsistence + // + OsIndication = 0; + Attributes = 0; + DataSize = sizeof(UINT64); + Status = gRT->GetVariable ( + L"OsIndications", + &gEfiGlobalVariableGuid, + &Attributes, + &DataSize, + &OsIndication + ); + + if (!EFI_ERROR(Status)) { + if (DataSize != sizeof(UINT64) || + (OsIndication & ~OsIndicationSupport) != 0 || + Attributes != (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE)){ + + DEBUG ((EFI_D_ERROR, "Unformalized OsIndications variable exists. Delete it\n")); + Status = gRT->SetVariable ( + L"OsIndications", + &gEfiGlobalVariableGuid, + Attributes, + 0, + &OsIndication + ); + ASSERT_EFI_ERROR (Status); + } + } + } /** diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c index 752a815770..103737c6b3 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c @@ -902,7 +902,7 @@ ShowProgress ( if (TimeoutDefault == 0) { return EFI_TIMEOUT; } - + DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it! ...Zzz....\n")); SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff); @@ -962,16 +962,18 @@ ShowProgress ( // // User pressed some key // - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); - if (EFI_ERROR (Status)) { - return Status; - } + if (!PcdGetBool (PcdConInConnectOnDemand)) { + Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); + if (EFI_ERROR (Status)) { + return Status; + } - if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) { - // - // User pressed enter, equivalent to select "continue" - // - return EFI_TIMEOUT; + if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) { + // + // User pressed enter, equivalent to select "continue" + // + return EFI_TIMEOUT; + } } return EFI_SUCCESS; @@ -1002,7 +1004,10 @@ PlatformBdsEnterFrontPage ( EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; UINTN BootTextColumn; UINTN BootTextRow; - + UINT64 OsIndication; + UINTN DataSize; + EFI_INPUT_KEY Key; + GraphicsOutput = NULL; SimpleTextOut = NULL; @@ -1013,7 +1018,7 @@ PlatformBdsEnterFrontPage ( if (ConnectAllHappened) { gConnectAllHappened = TRUE; } - + if (!mModeInitialized) { // // After the console is ready, get current video resolution @@ -1067,27 +1072,72 @@ PlatformBdsEnterFrontPage ( mModeInitialized = TRUE; } - - HotkeyBoot (); - if (TimeoutDefault != 0xffff) { - Status = ShowProgress (TimeoutDefault); - StatusHotkey = HotkeyBoot (); + // + // goto FrontPage directly when EFI_OS_INDICATIONS_BOOT_TO_FW_UI is set + // + OsIndication = 0; + DataSize = sizeof(UINT64); + Status = gRT->GetVariable ( + L"OsIndications", + &gEfiGlobalVariableGuid, + NULL, + &DataSize, + &OsIndication + ); + + // + // goto FrontPage directly when EFI_OS_INDICATIONS_BOOT_TO_FW_UI is set. Skip HotkeyBoot + // + if (!EFI_ERROR(Status) && (OsIndication & EFI_OS_INDICATIONS_BOOT_TO_FW_UI)) { + // + // Clear EFI_OS_INDICATIONS_BOOT_TO_FW_UI to acknowledge OS + // + OsIndication &= ~EFI_OS_INDICATIONS_BOOT_TO_FW_UI; + Status = gRT->SetVariable ( + L"OsIndications", + &gEfiGlobalVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, + sizeof(UINT64), + &OsIndication + ); + ASSERT_EFI_ERROR (Status); - if (!FeaturePcdGet(PcdBootlogoOnlyEnable) || !EFI_ERROR(Status) || !EFI_ERROR(StatusHotkey)){ - // - // Ensure screen is clear when switch Console from Graphics mode to Text mode - // Skip it in normal boot - // - gST->ConOut->EnableCursor (gST->ConOut, TRUE); - gST->ConOut->ClearScreen (gST->ConOut); + // + // Follow generic rule, Call ReadKeyStroke to connect ConIn before enter UI + // + if (PcdGetBool (PcdConInConnectOnDemand)) { + gST->ConIn->ReadKeyStroke(gST->ConIn, &Key); } - if (EFI_ERROR (Status)) { - // - // Timeout or user press enter to continue - // - goto Exit; + // + // Ensure screen is clear when switch Console from Graphics mode to Text mode + // + gST->ConOut->EnableCursor (gST->ConOut, TRUE); + gST->ConOut->ClearScreen (gST->ConOut); + + } else { + + HotkeyBoot (); + if (TimeoutDefault != 0xffff) { + Status = ShowProgress (TimeoutDefault); + StatusHotkey = HotkeyBoot (); + + if (!FeaturePcdGet(PcdBootlogoOnlyEnable) || !EFI_ERROR(Status) || !EFI_ERROR(StatusHotkey)){ + // + // Ensure screen is clear when switch Console from Graphics mode to Text mode + // Skip it in normal boot + // + gST->ConOut->EnableCursor (gST->ConOut, TRUE); + gST->ConOut->ClearScreen (gST->ConOut); + } + + if (EFI_ERROR (Status)) { + // + // Timeout or user press enter to continue + // + goto Exit; + } } } diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/MemoryTest.c b/IntelFrameworkModulePkg/Universal/BdsDxe/MemoryTest.c index 09d1bc1ea5..410d4f1db6 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/MemoryTest.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/MemoryTest.c @@ -346,30 +346,32 @@ BdsMemoryTest ( DEBUG ((EFI_D_INFO, "Perform memory test (ESC to skip).\n")); } - KeyStatus = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); - if (!EFI_ERROR (KeyStatus) && (Key.ScanCode == SCAN_ESC)) { - if (!RequireSoftECCInit) { - if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) { - TmpStr = GetStringById (STRING_TOKEN (STR_PERFORM_MEM_TEST)); - if (TmpStr != NULL) { - PlatformBdsShowProgress ( - Foreground, - Background, - TmpStr, - Color, - 100, - (UINTN) PreviousValue - ); - FreePool (TmpStr); + if (!PcdGetBool (PcdConInConnectOnDemand)) { + KeyStatus = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); + if (!EFI_ERROR (KeyStatus) && (Key.ScanCode == SCAN_ESC)) { + if (!RequireSoftECCInit) { + if (!FeaturePcdGet(PcdBootlogoOnlyEnable)) { + TmpStr = GetStringById (STRING_TOKEN (STR_PERFORM_MEM_TEST)); + if (TmpStr != NULL) { + PlatformBdsShowProgress ( + Foreground, + Background, + TmpStr, + Color, + 100, + (UINTN) PreviousValue + ); + FreePool (TmpStr); + } + + PrintXY (10, 10, NULL, NULL, L"100"); } - - PrintXY (10, 10, NULL, NULL, L"100"); + Status = GenMemoryTest->Finished (GenMemoryTest); + goto Done; } - Status = GenMemoryTest->Finished (GenMemoryTest); - goto Done; - } - TestAbort = TRUE; + TestAbort = TRUE; + } } } while (Status != EFI_NOT_FOUND); -- 2.39.2