From 620f289162b08d319fe1e73b3c7e2baff6b388e4 Mon Sep 17 00:00:00 2001 From: Tim He Date: Thu, 11 Jun 2015 02:50:20 +0000 Subject: Sync the branch changes to trunk. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update the FCE tool to remove “runtime access” . and recovery "Setup" variable in case of “Setup” variable size is incorrect somehow. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Tim He Reviewed-by: David Wei git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17620 6f19259b-4bc3-4df7-8a09-765794883524 --- Vlv2TbltDevicePkg/PlatformDxe/Platform.c | 134 +++++++++++++++++++++++++++---- 1 file changed, 117 insertions(+), 17 deletions(-) (limited to 'Vlv2TbltDevicePkg/PlatformDxe/Platform.c') diff --git a/Vlv2TbltDevicePkg/PlatformDxe/Platform.c b/Vlv2TbltDevicePkg/PlatformDxe/Platform.c index dba84fb659..a1cd072c8f 100644 --- a/Vlv2TbltDevicePkg/PlatformDxe/Platform.c +++ b/Vlv2TbltDevicePkg/PlatformDxe/Platform.c @@ -49,6 +49,8 @@ Abstract: #include #include #include +#include + // // VLV2 GPIO GROUP OFFSET @@ -200,6 +202,82 @@ InitRC6Policy( ); +EFI_STATUS +EFIAPI +SaveSetupRecoveryVar( + VOID + ) +{ + EFI_STATUS Status = EFI_SUCCESS; + UINTN SizeOfNvStore = 0; + UINTN SizeOfSetupVar = 0; + SYSTEM_CONFIGURATION *SetupData = NULL; + SYSTEM_CONFIGURATION *RecoveryNvData = NULL; + EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock = NULL; + + + DEBUG ((EFI_D_INFO, "SaveSetupRecoveryVar() Entry \n")); + SizeOfNvStore = sizeof(SYSTEM_CONFIGURATION); + RecoveryNvData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION)); + if (NULL == RecoveryNvData) { + Status = EFI_OUT_OF_RESOURCES; + goto Exit; + } + + Status = gRT->GetVariable( + L"SetupRecovery", + &gEfiNormalSetupGuid, + NULL, + &SizeOfNvStore, + RecoveryNvData + ); + + if (EFI_ERROR (Status)) { + // Don't find the "SetupRecovery" variable. + // have to copy "Setup" variable to "SetupRecovery" variable. + SetupData = AllocateZeroPool (sizeof(SYSTEM_CONFIGURATION)); + if (NULL == SetupData) { + Status = EFI_OUT_OF_RESOURCES; + goto Exit; + } + SizeOfSetupVar = sizeof(SYSTEM_CONFIGURATION); + Status = gRT->GetVariable( + NORMAL_SETUP_NAME, + &gEfiNormalSetupGuid, + NULL, + &SizeOfSetupVar, + SetupData + ); + ASSERT_EFI_ERROR (Status); + + Status = gRT->SetVariable ( + L"SetupRecovery", + &gEfiNormalSetupGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof(SYSTEM_CONFIGURATION), + SetupData + ); + ASSERT_EFI_ERROR (Status); + + Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **) &VariableLock); + if (!EFI_ERROR (Status)) { + Status = VariableLock->RequestToLock (VariableLock, L"SetupRecovery", &gEfiNormalSetupGuid); + ASSERT_EFI_ERROR (Status); + } + + } + +Exit: + if (RecoveryNvData) + FreePool (RecoveryNvData); + if (SetupData) + FreePool (SetupData); + + return Status; + +} + + VOID TristateLpcGpioConfig ( IN UINT32 Gpio_Mmio_Offset, @@ -692,6 +770,10 @@ InitializePlatform ( // InitializeObservableProtocol(); + Status = SaveSetupRecoveryVar(); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "InitializePlatform() Save SetupRecovery variable failed \n")); + } VarSize = sizeof(SYSTEM_CONFIGURATION); Status = gRT->GetVariable( @@ -701,8 +783,26 @@ InitializePlatform ( &VarSize, &mSystemConfiguration ); - - + if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) { + //The setup variable is corrupted + VarSize = sizeof(SYSTEM_CONFIGURATION); + Status = gRT->GetVariable( + L"SetupRecovery", + &gEfiNormalSetupGuid, + NULL, + &VarSize, + &mSystemConfiguration + ); + ASSERT_EFI_ERROR (Status); + Status = gRT->SetVariable ( + NORMAL_SETUP_NAME, + &gEfiNormalSetupGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof(SYSTEM_CONFIGURATION), + &mSystemConfiguration + ); + } + Status = EfiCreateEventReadyToBootEx ( TPL_CALLBACK, ReadyToBootFunction, @@ -1394,12 +1494,7 @@ InitMfgAndConfigModeStateVar() { EFI_PLATFORM_SETUP_ID *BootModeBuffer; VOID *HobList; - UINT16 State; - // - // Variable initialization - // - State = FALSE; HobList = GetFirstGuidHob(&gEfiPlatformBootModeGuid); if (HobList != NULL) { @@ -1416,16 +1511,8 @@ InitMfgAndConfigModeStateVar() mMfgMode = TRUE; } - // - // Check if in safe mode - // - if ( !CompareMem ( - &BootModeBuffer->SetupName, - SAFE_SETUP_NAME, - StrSize (SAFE_SETUP_NAME) - ) ) { - State = TRUE; - } + + } } @@ -1588,6 +1675,19 @@ UpdateDVMTSetup( &SystemConfiguration ); + if (EFI_ERROR (Status) || VarSize != sizeof(SYSTEM_CONFIGURATION)) { + //The setup variable is corrupted + VarSize = sizeof(SYSTEM_CONFIGURATION); + Status = gRT->GetVariable( + L"SetupRecovery", + &gEfiNormalSetupGuid, + NULL, + &VarSize, + &SystemConfiguration + ); + ASSERT_EFI_ERROR (Status); + } + if((SystemConfiguration.GraphicsDriverMemorySize < 4) && !EFI_ERROR(Status) ) { switch (SystemConfiguration.GraphicsDriverMemorySize){ case 1: -- cgit v1.2.3