/** @file\r
\r
- Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
- \r\r
- This program and the accompanying materials are licensed and made available under\r\r
- the terms and conditions of the BSD License that accompanies this distribution. \r\r
- The full text of the license may be found at \r\r
- http://opensource.org/licenses/bsd-license.php. \r\r
- \r\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r\r
- \r\r
+ Copyright (c) 2004 - 2019, Intel Corporation. All rights reserved.<BR>\r
+ \r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+ \r
\r
\r
Module Name:\r
#include "SetupMode.h"\r
#include <Guid/SetupVariable.h>\r
#include <Library/TcgPhysicalPresenceLib.h>\r
-#include <Library/TrEEPhysicalPresenceLib.h>\r
+#include <Library/Tcg2PhysicalPresenceLib.h>\r
#include <Protocol/I2cMasterMcg.h>\r
#include <TianoApi.h>\r
#include <PlatformBaseAddresses.h>\r
#include <Library/GenericBdsLib/String.h>\r
#include <Library/NetLib.h>\r
\r
+#include <Library/CapsuleLib.h>\r
+#include <Protocol/EsrtManagement.h>\r
+\r
EFI_GUID *ConnectDriverTable[] = {\r
&gEfiMmioDeviceProtocolGuid,\r
&gEfiI2cMasterProtocolGuid,\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
+ //\r
+ // Signal EndOfDxe PI Event\r
+ //\r
+ EfiEventGroupSignal (&gEfiEndOfDxeEventGroupGuid);\r
+\r
Handle = NULL;\r
Status = gBS->InstallProtocolInterface (\r
&Handle,\r
// BDS Platform Functions\r
//\r
/**\r
- Platform Bds init. Incude the platform firmware vendor, revision\r
+ Platform Bds init. Include the platform firmware vendor, revision\r
and so crc check.\r
\r
@param VOID\r
}\r
\r
//\r
- // Try to connect this handle, so that GOP dirver could start on this\r
+ // Try to connect this handle, so that GOP driver could start on this\r
// device and create child handles with GraphicsOutput Protocol installed\r
// on them, then we get device paths of these child handles and select\r
// them as possible console device.\r
&VarSize,\r
&mSystemConfiguration\r
);\r
- ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+ //The setup variable is corrupted\r
+ VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+ Status = gRT->GetVariable(\r
+ L"SetupRecovery",\r
+ &gEfiNormalSetupGuid,\r
+ NULL,\r
+ &VarSize,\r
+ &mSystemConfiguration\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ } \r
\r
if(mSystemConfiguration.BootDisplayDevice != 0x0)\r
{\r
// In current implementation, we only enable one of the child handles\r
// as console device, i.e. sotre one of the child handle's device\r
// path to variable "ConOut"\r
- // In futhure, we could select all child handles to be console device\r
+ // In future, we could select all child handles to be console device\r
//\r
*GopDevicePath = TempDevicePath;\r
}\r
&VarSize,\r
&mSystemConfiguration\r
);\r
- ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+ //The setup variable is corrupted\r
+ VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+ Status = gRT->GetVariable(\r
+ L"SetupRecovery",\r
+ &gEfiNormalSetupGuid,\r
+ NULL,\r
+ &VarSize,\r
+ &mSystemConfiguration\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ } \r
\r
\r
if ((PlugInPciVgaDevicePath == NULL && OnboardPciVgaDevicePath != NULL) ) {\r
&VarSize,\r
&SystemConfiguration\r
);\r
- ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+ //The setup variable is corrupted\r
+ VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+ Status = gRT->GetVariable(\r
+ L"SetupRecovery",\r
+ &gEfiNormalSetupGuid,\r
+ NULL,\r
+ &VarSize,\r
+ &SystemConfiguration\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ } \r
\r
switch (SystemConfiguration.IgdFlatPanel) {\r
\r
Connect the predefined platform default console device. Always try to find\r
and enable the vga device if have.\r
\r
- @param PlatformConsole Predfined platform default console device array.\r
+ @param PlatformConsole Predefined platform default console device array.\r
\r
@retval EFI_SUCCESS Success connect at least one ConIn and ConOut\r
device, there must have one ConOut device is\r
if (VarConout == NULL || VarConin == NULL) {\r
//\r
// Have chance to connect the platform default console,\r
- // the platform default console is the minimue device group\r
+ // the platform default console is the minimum device group\r
// the platform should support\r
//\r
while (PlatformConsole[Index].DevicePath != NULL) {\r
}\r
\r
/**\r
- Connect with predeined platform connect sequence,\r
+ Connect with predefined platform connect sequence,\r
the OEM/IBV can customize with their own connect sequence.\r
\r
@param None.\r
\r
Status = Fv->ReadFile (\r
Fv,\r
- PcdGetPtr(PcdShellFile),\r
+ &gUefiShellFileGuid,\r
NULL,\r
&Size,\r
&Type,\r
\r
Status = Fv->ReadFile (\r
Fv,\r
- PcdGetPtr(PcdShellFile),\r
+ &gUefiShellFileGuid,\r
NULL,\r
&Size,\r
&Type,\r
\r
/**\r
\r
- The function will excute with as the platform policy, current policy\r
+ The function will execute with as the platform policy, current policy\r
is driven by boot mode. IBV/OEM can customize this code for their specific\r
policy action.\r
\r
PlatformBdsPolicyBehavior (\r
IN OUT LIST_ENTRY *DriverOptionList,\r
IN OUT LIST_ENTRY *BootOptionList,\r
- IN PROCESS_CAPSULES ProcessCapsules,\r
+ IN PROCESS_CAPSULES BdsProcessCapsules,\r
IN BASEM_MEMORY_TEST BaseMemoryTest\r
)\r
{\r
EFI_BOOT_MODE BootMode;\r
BOOLEAN DeferredImageExist;\r
UINTN Index;\r
- CHAR16 CapsuleVarName[36];\r
- CHAR16 *TempVarName;\r
SYSTEM_CONFIGURATION SystemConfiguration;\r
UINTN VarSize;\r
- BOOLEAN SetVariableFlag;\r
PLATFORM_PCI_DEVICE_PATH *EmmcBootDevPath;\r
EFI_GLOBAL_NVS_AREA_PROTOCOL *GlobalNvsArea;\r
EFI_HANDLE FvProtocolHandle;\r
BOOLEAN IsFirstBoot;\r
UINT16 *BootOrder;\r
UINTN BootOrderSize;\r
+ ESRT_MANAGEMENT_PROTOCOL *EsrtManagement;\r
\r
Timeout = PcdGet16 (PcdPlatformBootTimeOut);\r
+ if (Timeout > 10 ) {\r
+ //we think the Timeout variable is corrupted\r
+ Timeout = 10;\r
+ }\r
+\r
VarSize = sizeof(SYSTEM_CONFIGURATION);\r
Status = gRT->GetVariable(\r
NORMAL_SETUP_NAME,\r
&VarSize,\r
&SystemConfiguration\r
);\r
- if (EFI_ERROR (Status)) {\r
- return;\r
+\r
+ if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) {\r
+ //The setup variable is corrupted\r
+ VarSize = sizeof(SYSTEM_CONFIGURATION);\r
+ Status = gRT->GetVariable(\r
+ L"SetupRecovery",\r
+ &gEfiNormalSetupGuid,\r
+ NULL,\r
+ &VarSize,\r
+ &SystemConfiguration\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
}\r
\r
//\r
//\r
BootMode = GetBootModeHob();\r
\r
- //\r
- // Clear all the capsule variables CapsuleUpdateData, CapsuleUpdateData1, CapsuleUpdateData2...\r
- // as early as possible which will avoid the next time boot after the capsule update\r
- // will still into the capsule loop\r
- //\r
- StrCpy (CapsuleVarName, EFI_CAPSULE_VARIABLE_NAME);\r
- TempVarName = CapsuleVarName + StrLen (CapsuleVarName);\r
- Index = 0;\r
- SetVariableFlag = TRUE;\r
- while (SetVariableFlag) {\r
- if (Index > 0) {\r
- UnicodeValueToString (TempVarName, 0, Index, 0);\r
- }\r
- Status = gRT->SetVariable (\r
- CapsuleVarName,\r
- &gEfiCapsuleVendorGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS |\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- 0,\r
- (VOID *)NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // There is no capsule variables, quit\r
- //\r
- SetVariableFlag = FALSE;\r
- continue;\r
- }\r
- Index++;\r
- }\r
-\r
//\r
// No deferred images exist by default\r
//\r
}\r
}\r
\r
+ Status = gBS->LocateProtocol(&gEsrtManagementProtocolGuid, NULL, (VOID **)&EsrtManagement);\r
+ if (EFI_ERROR(Status)) {\r
+ EsrtManagement = NULL;\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO, "BDS: BootMode=%02x\n", BootMode));\r
+\r
switch (BootMode) {\r
\r
case BOOT_WITH_MINIMAL_CONFIGURATION:\r
goto FULL_CONFIGURATION;\r
}\r
\r
- if (SystemConfiguration.QuietBoot) {\r
- EnableQuietBoot (PcdGetPtr(PcdLogoFile));\r
- } else {\r
+ EnableQuietBoot (PcdGetPtr(PcdLogoFile));\r
+ if (!SystemConfiguration.QuietBoot) {\r
PlatformBdsDiagnostics (IGNORE, FALSE, BaseMemoryTest);\r
}\r
\r
TcgPhysicalPresenceLibProcessRequest();\r
#endif\r
#ifdef FTPM_ENABLE\r
- TrEEPhysicalPresenceLibProcessRequest(NULL);\r
+ Tcg2PhysicalPresenceLibProcessRequest(NULL);\r
#endif\r
+\r
+ if (EsrtManagement != NULL) {\r
+ EsrtManagement->LockEsrtRepository();\r
+ }\r
+\r
//\r
// Close boot script and install ready to lock\r
//\r
InstallReadyToLock ();\r
\r
//\r
- // Give one chance to enter the setup if we \r
+ // Give one chance to enter the setup if we\r
// select Gummiboot "Reboot Into Firmware Interface" and Fast Boot is enabled.\r
//\r
BootIntoFirmwareInterface();\r
}\r
}\r
\r
+ if (EsrtManagement != NULL) {\r
+ EsrtManagement->LockEsrtRepository();\r
+ }\r
+\r
//\r
// Close boot script and install ready to lock\r
//\r
// Boot with the specific configuration\r
//\r
PlatformBdsConnectConsole (gPlatformConsole);\r
- PlatformBdsDiagnostics (EXTENSIVE, FALSE, BaseMemoryTest);\r
+ PlatformBdsDiagnostics (EXTENSIVE, TRUE, BaseMemoryTest);\r
+\r
+ DEBUG((DEBUG_INFO, "ProcessCapsules Before EndOfDxe......\n"));\r
+ ProcessCapsules ();\r
+ DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));\r
+\r
+ //\r
+ // Close boot script and install ready to lock\r
+ //\r
+ InstallReadyToLock ();\r
+\r
BdsLibConnectAll ();\r
\r
//\r
}\r
}\r
\r
- //\r
- // Close boot script and install ready to lock\r
- //\r
- InstallReadyToLock ();\r
+ if (EsrtManagement != NULL) {\r
+ EsrtManagement->SyncEsrtFmp();\r
+ }\r
\r
- ProcessCapsules (BOOT_ON_FLASH_UPDATE);\r
+ DEBUG((DEBUG_INFO, "ProcessCapsules After ConnectAll......\n"));\r
+ ProcessCapsules();\r
+ DEBUG((DEBUG_INFO, "ProcessCapsules Done\n"));\r
break;\r
\r
case BOOT_IN_RECOVERY_MODE:\r
// Perform some platform specific connect sequence\r
//\r
PlatformBdsConnectSequence ();\r
- if (SystemConfiguration.QuietBoot) {\r
- EnableQuietBoot (PcdGetPtr(PcdLogoFile));\r
- } else {\r
- PlatformBdsDiagnostics (IGNORE, FALSE, BaseMemoryTest);\r
+ EnableQuietBoot (PcdGetPtr(PcdLogoFile));\r
+ if (!SystemConfiguration.QuietBoot) {\r
+ PlatformBdsDiagnostics (IGNORE, FALSE, BaseMemoryTest);\r
}\r
\r
//\r
TcgPhysicalPresenceLibProcessRequest();\r
#endif\r
#ifdef FTPM_ENABLE\r
- TrEEPhysicalPresenceLibProcessRequest(NULL);\r
+ Tcg2PhysicalPresenceLibProcessRequest(NULL);\r
#endif\r
+\r
+ if (EsrtManagement != NULL) {\r
+ EsrtManagement->SyncEsrtFmp();\r
+ }\r
//\r
// Close boot script and install ready to lock\r
//\r
PlatformBdsEnterFrontPageWithHotKey (Timeout, FALSE);\r
\r
//\r
- // Give one chance to enter the setup if we \r
+ // Give one chance to enter the setup if we\r
// select Gummiboot "Reboot Into Firmware Interface"\r
//\r
BootIntoFirmwareInterface();\r
return;\r
}\r
\r
- \r
+\r
break;\r
}\r
\r
EFI_FV_BLOCK_MAP_ENTRY *BlockMap;\r
EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
EFI_PHYSICAL_ADDRESS BaseAddress;\r
- UINT8 Data;\r
UINT32 BlockLength;\r
UINTN Index;\r
\r
while ((BlockMap->NumBlocks != 0) && (BlockMap->Length != 0)) {\r
BlockLength = BlockMap->Length;\r
for (Index = 0; Index < BlockMap->NumBlocks; Index++) {\r
- Data = MmioOr8 ((UINTN) BaseAddress, 0x03);\r
+ MmioOr8 ((UINTN) BaseAddress, 0x03);\r
BaseAddress += BlockLength;\r
}\r
BlockMap++;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
UINT32 GpioValue;\r
+ CHAR16 *TmpStr1;\r
+ CHAR16 *TmpStr2;\r
+ CHAR16 *TmpStr3;\r
+ UINTN TmpStrSize;\r
+ VOID *Buffer;\r
+ UINTN Size;\r
\r
if (TimeoutDefault == 0) {\r
return EFI_TIMEOUT;\r
SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0);\r
SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff);\r
\r
+ TmpStr2 = NULL;\r
+ TmpStr3 = NULL;\r
+\r
+ //\r
+ // Check if the platform is using test key.\r
+ //\r
+ Status = GetSectionFromAnyFv(\r
+ PcdGetPtr(PcdEdkiiRsa2048Sha256TestPublicKeyFileGuid),\r
+ EFI_SECTION_RAW,\r
+ 0,\r
+ &Buffer,\r
+ &Size\r
+ );\r
+ if (!EFI_ERROR(Status)) {\r
+ if ((Size == PcdGetSize(PcdRsa2048Sha256PublicKeyBuffer)) &&\r
+ (CompareMem(Buffer, PcdGetPtr(PcdRsa2048Sha256PublicKeyBuffer), Size) == 0)) {\r
+ TmpStr2 = L"WARNING: Recovery Test Key is used.\r\n";\r
+ if (DebugAssertEnabled()) {\r
+ DEBUG ((DEBUG_INFO, "\n\nWARNING: Recovery Test Key is used.\n"));\r
+ } else {\r
+ SerialPortWrite((UINT8 *)"\n\nWARNING: Recovery Test Key is used.", sizeof("\n\nWARNING: Recovery Test Key is used."));\r
+ }\r
+ PcdSetBoolS(PcdTestKeyUsed, TRUE);\r
+ }\r
+ FreePool(Buffer);\r
+ }\r
+ Status = GetSectionFromAnyFv(\r
+ PcdGetPtr(PcdEdkiiPkcs7TestPublicKeyFileGuid),\r
+ EFI_SECTION_RAW,\r
+ 0,\r
+ &Buffer,\r
+ &Size\r
+ );\r
+ if (!EFI_ERROR(Status)) {\r
+ if ((Size == PcdGetSize(PcdPkcs7CertBuffer)) &&\r
+ (CompareMem(Buffer, PcdGetPtr(PcdPkcs7CertBuffer), Size) == 0)) {\r
+ TmpStr3 = L"WARNING: Capsule Test Key is used.\r\n";\r
+ if (DebugAssertEnabled()) {\r
+ DEBUG ((DEBUG_INFO, "\n\nWARNING: Capsule Test Key is used.\r\n"));\r
+ } else {\r
+ SerialPortWrite((UINT8 *)"\n\nWARNING: Capsule Test Key is used.", sizeof("\n\nWARNING: Capsule Test Key is used."));\r
+ }\r
+ PcdSetBoolS(PcdTestKeyUsed, TRUE);\r
+ }\r
+ FreePool(Buffer);\r
+ }\r
+\r
//\r
// Clear the progress status bar first\r
//\r
- TmpStr = L"Start boot option, Press <F2> or <DEL> to enter setup page.";\r
+ TmpStr1 = L"Start boot option, Press <F2> or <DEL> to enter setup page.\r\n";\r
+ TmpStrSize = StrSize(TmpStr1);\r
+ if (TmpStr2 != NULL) {\r
+ TmpStrSize += StrSize(TmpStr2);\r
+ }\r
+ if (TmpStr3 != NULL) {\r
+ TmpStrSize += StrSize(TmpStr3);\r
+ }\r
+ TmpStr = AllocatePool (TmpStrSize);\r
+ if (TmpStr == NULL) {\r
+ TmpStr = TmpStr1;\r
+ } else {\r
+ StrCpyS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr1);\r
+ if (TmpStr2 != NULL) {\r
+ StrCatS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr2);\r
+ }\r
+ if (TmpStr3 != NULL) {\r
+ StrCatS(TmpStr, TmpStrSize/sizeof(CHAR16), TmpStr3);\r
+ }\r
+ }\r
PlatformBdsShowProgress (Foreground, Background, TmpStr, Color, 0, 0);\r
\r
TimeoutRemain = TimeoutDefault;\r
{\r
EFI_STATUS Status;\r
\r
+ EFI_STATUS LogoStatus;\r
+ EFI_BOOT_LOGO_PROTOCOL *BootLogo;\r
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
UINTN BootTextColumn;\r
gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
gST->ConOut->ClearScreen (gST->ConOut);\r
\r
+ //\r
+ // Boot Logo is corrupted, report it using Boot Logo protocol.\r
+ //\r
+ LogoStatus = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);\r
+ if (!EFI_ERROR (LogoStatus) && (BootLogo != NULL)) {\r
+ BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);\r
+ }\r
+\r
if (EFI_ERROR (Status)) {\r
//\r
// Timeout or user press enter to continue\r
goto Exit;\r
}\r
}\r
+\r
//\r
// Install BM HiiPackages. \r
// Keep BootMaint HiiPackage, so that it can be covered by global setting. \r
if (VarConout == NULL || VarConin == NULL) {\r
//\r
// Have chance to connect the platform default console,\r
- // the platform default console is the minimue device group\r
+ // the platform default console is the minimum device group\r
// the platform should support\r
//\r
while (PlatformConsole[Index].DevicePath != NULL) {\r