mirror of
https://github.com/tianocore/edk2
synced 2026-08-27 00:23:19 -04:00
Sync patches r15388, r15404, r15405, and r15409 from main trunk.
1. MdeModulePkg/SecurityPkg Variable: Calculate enough space for PlatformLang and Lang variables and use PcdUefiVariableDefaultLangDeprecate to turn off auto update between PlatformLang and Lang variables. 2. Calculate enough space for 2 variables (public key and variable data) instead of directly setting them 1 by 1. Fixed a bug in public key reclaim(). 3. Remove hide TPM support. 4. SecurityPkg Variable: Add NULL pointer check. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan <jeff.fan@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1@15414 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
4a4f0b640c
commit
36a5713325
24 changed files with 738 additions and 269 deletions
|
|
@ -461,7 +461,7 @@ InitializeLanguage (
|
|||
if (LangCodesSettingRequired) {
|
||||
if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {
|
||||
//
|
||||
// UEFI 2.1 depricated this variable so we support turning it off
|
||||
// UEFI 2.0 depricated this variable so we support turning it off
|
||||
//
|
||||
Status = gRT->SetVariable (
|
||||
L"LangCodes",
|
||||
|
|
@ -491,7 +491,7 @@ InitializeLanguage (
|
|||
|
||||
if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {
|
||||
//
|
||||
// UEFI 2.1 depricated this variable so we support turning it off
|
||||
// UEFI 2.0 depricated this variable so we support turning it off
|
||||
//
|
||||
InitializeLangVariable (L"Lang", LangCodes, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultLang), TRUE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1197,6 +1197,134 @@ VariableGetBestLanguage (
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
This function is to check if the remaining variable space is enough to set
|
||||
all Variables from argument list successfully. The purpose of the check
|
||||
is to keep the consistency of the Variables to be in variable storage.
|
||||
|
||||
Note: Variables are assumed to be in same storage.
|
||||
The set sequence of Variables will be same with the sequence of VariableEntry from argument list,
|
||||
so follow the argument sequence to check the Variables.
|
||||
|
||||
@param[in] Attributes Variable attributes for Variable entries.
|
||||
@param ... The variable argument list with type VARIABLE_ENTRY_CONSISTENCY *.
|
||||
A NULL terminates the list. The VariableSize of
|
||||
VARIABLE_ENTRY_CONSISTENCY is the variable data size as input.
|
||||
It will be changed to variable total size as output.
|
||||
|
||||
@retval TRUE Have enough variable space to set the Variables successfully.
|
||||
@retval FALSE No enough variable space to set the Variables successfully.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
CheckRemainingSpaceForConsistency (
|
||||
IN UINT32 Attributes,
|
||||
...
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
VA_LIST Args;
|
||||
VARIABLE_ENTRY_CONSISTENCY *VariableEntry;
|
||||
UINT64 MaximumVariableStorageSize;
|
||||
UINT64 RemainingVariableStorageSize;
|
||||
UINT64 MaximumVariableSize;
|
||||
UINTN TotalNeededSize;
|
||||
UINTN OriginalVarSize;
|
||||
VARIABLE_STORE_HEADER *VariableStoreHeader;
|
||||
VARIABLE_POINTER_TRACK VariablePtrTrack;
|
||||
VARIABLE_HEADER *NextVariable;
|
||||
UINTN VarNameSize;
|
||||
UINTN VarDataSize;
|
||||
|
||||
//
|
||||
// Non-Volatile related.
|
||||
//
|
||||
VariableStoreHeader = mNvVariableCache;
|
||||
|
||||
Status = VariableServiceQueryVariableInfoInternal (
|
||||
Attributes,
|
||||
&MaximumVariableStorageSize,
|
||||
&RemainingVariableStorageSize,
|
||||
&MaximumVariableSize
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
TotalNeededSize = 0;
|
||||
VA_START (Args, Attributes);
|
||||
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
|
||||
while (VariableEntry != NULL) {
|
||||
//
|
||||
// Calculate variable total size.
|
||||
//
|
||||
VarNameSize = StrSize (VariableEntry->Name);
|
||||
VarNameSize += GET_PAD_SIZE (VarNameSize);
|
||||
VarDataSize = VariableEntry->VariableSize;
|
||||
VarDataSize += GET_PAD_SIZE (VarDataSize);
|
||||
VariableEntry->VariableSize = HEADER_ALIGN (sizeof (VARIABLE_HEADER) + VarNameSize + VarDataSize);
|
||||
|
||||
TotalNeededSize += VariableEntry->VariableSize;
|
||||
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
|
||||
}
|
||||
VA_END (Args);
|
||||
|
||||
if (RemainingVariableStorageSize >= TotalNeededSize) {
|
||||
//
|
||||
// Already have enough space.
|
||||
//
|
||||
return TRUE;
|
||||
} else if (AtRuntime ()) {
|
||||
//
|
||||
// At runtime, no reclaim.
|
||||
// The original variable space of Variables can't be reused.
|
||||
//
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VA_START (Args, Attributes);
|
||||
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
|
||||
while (VariableEntry != NULL) {
|
||||
//
|
||||
// Check if Variable[Index] has been present and get its size.
|
||||
//
|
||||
OriginalVarSize = 0;
|
||||
VariablePtrTrack.StartPtr = GetStartPointer (VariableStoreHeader);
|
||||
VariablePtrTrack.EndPtr = GetEndPointer (VariableStoreHeader);
|
||||
Status = FindVariableEx (
|
||||
VariableEntry->Name,
|
||||
VariableEntry->Guid,
|
||||
FALSE,
|
||||
&VariablePtrTrack
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
// Get size of Variable[Index].
|
||||
//
|
||||
NextVariable = GetNextVariablePtr (VariablePtrTrack.CurrPtr);
|
||||
OriginalVarSize = (UINTN) NextVariable - (UINTN) VariablePtrTrack.CurrPtr;
|
||||
//
|
||||
// Add the original size of Variable[Index] to remaining variable storage size.
|
||||
//
|
||||
RemainingVariableStorageSize += OriginalVarSize;
|
||||
}
|
||||
if (VariableEntry->VariableSize > RemainingVariableStorageSize) {
|
||||
//
|
||||
// No enough space for Variable[Index].
|
||||
//
|
||||
VA_END (Args);
|
||||
return FALSE;
|
||||
}
|
||||
//
|
||||
// Sub the (new) size of Variable[Index] from remaining variable storage size.
|
||||
//
|
||||
RemainingVariableStorageSize -= VariableEntry->VariableSize;
|
||||
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
|
||||
}
|
||||
VA_END (Args);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
Hook the operations in PlatformLangCodes, LangCodes, PlatformLang and Lang.
|
||||
|
||||
|
|
@ -1231,6 +1359,7 @@ AutoUpdateLangVariable (
|
|||
UINT32 Attributes;
|
||||
VARIABLE_POINTER_TRACK Variable;
|
||||
BOOLEAN SetLanguageCodes;
|
||||
VARIABLE_ENTRY_CONSISTENCY VariableEntry[2];
|
||||
|
||||
//
|
||||
// Don't do updates for delete operation
|
||||
|
|
@ -1353,14 +1482,31 @@ AutoUpdateLangVariable (
|
|||
BestLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->LangCodes, Index, TRUE);
|
||||
|
||||
//
|
||||
// Successfully convert PlatformLang to Lang, and set the BestLang value into Lang variable simultaneously.
|
||||
// Check the variable space for both Lang and PlatformLang variable.
|
||||
//
|
||||
FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||
VariableEntry[0].VariableSize = ISO_639_2_ENTRY_SIZE + 1;
|
||||
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;
|
||||
VariableEntry[0].Name = L"Lang";
|
||||
|
||||
VariableEntry[1].VariableSize = AsciiStrSize (BestPlatformLang);
|
||||
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;
|
||||
VariableEntry[1].Name = L"PlatformLang";
|
||||
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) {
|
||||
//
|
||||
// No enough variable space to set both Lang and PlatformLang successfully.
|
||||
//
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
} else {
|
||||
//
|
||||
// Successfully convert PlatformLang to Lang, and set the BestLang value into Lang variable simultaneously.
|
||||
//
|
||||
FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||
|
||||
Status = UpdateVariable (L"Lang", &gEfiGlobalVariableGuid, BestLang,
|
||||
ISO_639_2_ENTRY_SIZE + 1, Attributes, &Variable);
|
||||
Status = UpdateVariable (L"Lang", &gEfiGlobalVariableGuid, BestLang,
|
||||
ISO_639_2_ENTRY_SIZE + 1, Attributes, &Variable);
|
||||
}
|
||||
|
||||
DEBUG ((EFI_D_INFO, "Variable Driver Auto Update PlatformLang, PlatformLang:%a, Lang:%a: Status: %r\n", BestPlatformLang, BestLang, Status));
|
||||
DEBUG ((EFI_D_INFO, "Variable Driver Auto Update PlatformLang, PlatformLang:%a, Lang:%a Status: %r\n", BestPlatformLang, BestLang, Status));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1385,19 +1531,43 @@ AutoUpdateLangVariable (
|
|||
BestPlatformLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->PlatformLangCodes, Index, FALSE);
|
||||
|
||||
//
|
||||
// Successfully convert Lang to PlatformLang, and set the BestPlatformLang value into PlatformLang variable simultaneously.
|
||||
// Check the variable space for both PlatformLang and Lang variable.
|
||||
//
|
||||
FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||
VariableEntry[0].VariableSize = AsciiStrSize (BestPlatformLang);
|
||||
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;
|
||||
VariableEntry[0].Name = L"PlatformLang";
|
||||
|
||||
Status = UpdateVariable (L"PlatformLang", &gEfiGlobalVariableGuid, BestPlatformLang,
|
||||
AsciiStrSize (BestPlatformLang), Attributes, &Variable);
|
||||
VariableEntry[1].VariableSize = ISO_639_2_ENTRY_SIZE + 1;
|
||||
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;
|
||||
VariableEntry[1].Name = L"Lang";
|
||||
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) {
|
||||
//
|
||||
// No enough variable space to set both PlatformLang and Lang successfully.
|
||||
//
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
} else {
|
||||
//
|
||||
// Successfully convert Lang to PlatformLang, and set the BestPlatformLang value into PlatformLang variable simultaneously.
|
||||
//
|
||||
FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||
|
||||
Status = UpdateVariable (L"PlatformLang", &gEfiGlobalVariableGuid, BestPlatformLang,
|
||||
AsciiStrSize (BestPlatformLang), Attributes, &Variable);
|
||||
}
|
||||
|
||||
DEBUG ((EFI_D_INFO, "Variable Driver Auto Update Lang, Lang:%a, PlatformLang:%a Status: %r\n", BestLang, BestPlatformLang, Status));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
if (SetLanguageCodes) {
|
||||
//
|
||||
// Continue to set PlatformLangCodes or LangCodes.
|
||||
//
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2369,15 +2539,17 @@ VariableServiceSetVariable (
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Hook the operation of setting PlatformLangCodes/PlatformLang and LangCodes/Lang.
|
||||
//
|
||||
Status = AutoUpdateLangVariable (VariableName, Data, DataSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {
|
||||
//
|
||||
// The auto update operation failed, directly return to avoid inconsistency between PlatformLang and Lang.
|
||||
// Hook the operation of setting PlatformLangCodes/PlatformLang and LangCodes/Lang.
|
||||
//
|
||||
goto Done;
|
||||
Status = AutoUpdateLangVariable (VariableName, Data, DataSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// The auto update operation failed, directly return to avoid inconsistency between PlatformLang and Lang.
|
||||
//
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
|
||||
Status = UpdateVariable (VariableName, VendorGuid, Data, DataSize, Attributes, &Variable);
|
||||
|
|
@ -2402,14 +2574,12 @@ Done:
|
|||
@param MaximumVariableSize Pointer to the maximum size of an individual EFI variables
|
||||
associated with the attributes specified.
|
||||
|
||||
@return EFI_INVALID_PARAMETER An invalid combination of attribute bits was supplied.
|
||||
@return EFI_SUCCESS Query successfully.
|
||||
@return EFI_UNSUPPORTED The attribute is not supported on this platform.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VariableServiceQueryVariableInfo (
|
||||
VariableServiceQueryVariableInfoInternal (
|
||||
IN UINT32 Attributes,
|
||||
OUT UINT64 *MaximumVariableStorageSize,
|
||||
OUT UINT64 *RemainingVariableStorageSize,
|
||||
|
|
@ -2422,43 +2592,12 @@ VariableServiceQueryVariableInfo (
|
|||
VARIABLE_STORE_HEADER *VariableStoreHeader;
|
||||
UINT64 CommonVariableTotalSize;
|
||||
UINT64 HwErrVariableTotalSize;
|
||||
EFI_STATUS Status;
|
||||
VARIABLE_POINTER_TRACK VariablePtrTrack;
|
||||
|
||||
CommonVariableTotalSize = 0;
|
||||
HwErrVariableTotalSize = 0;
|
||||
|
||||
if(MaximumVariableStorageSize == NULL || RemainingVariableStorageSize == NULL || MaximumVariableSize == NULL || Attributes == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == 0) {
|
||||
//
|
||||
// Make sure the Attributes combination is supported by the platform.
|
||||
//
|
||||
return EFI_UNSUPPORTED;
|
||||
} else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS) {
|
||||
//
|
||||
// Make sure if runtime bit is set, boot service bit is set also.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if (AtRuntime () && ((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0)) {
|
||||
//
|
||||
// Make sure RT Attribute is set if we are in Runtime phase.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
|
||||
//
|
||||
// Make sure Hw Attribute is set with NV.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0) {
|
||||
//
|
||||
// Not support authentiated variable write yet.
|
||||
//
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);
|
||||
|
||||
if((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) {
|
||||
//
|
||||
// Query is Volatile related.
|
||||
|
|
@ -2530,6 +2669,27 @@ VariableServiceQueryVariableInfo (
|
|||
} else {
|
||||
CommonVariableTotalSize += VariableSize;
|
||||
}
|
||||
} else if (Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {
|
||||
//
|
||||
// If it is a IN_DELETED_TRANSITION variable,
|
||||
// and there is not also a same ADDED one at the same time,
|
||||
// this IN_DELETED_TRANSITION variable is valid.
|
||||
//
|
||||
VariablePtrTrack.StartPtr = GetStartPointer (VariableStoreHeader);
|
||||
VariablePtrTrack.EndPtr = GetEndPointer (VariableStoreHeader);
|
||||
Status = FindVariableEx (
|
||||
GetVariableNamePtr (Variable),
|
||||
&Variable->VendorGuid,
|
||||
FALSE,
|
||||
&VariablePtrTrack
|
||||
);
|
||||
if (!EFI_ERROR (Status) && VariablePtrTrack.CurrPtr->State != VAR_ADDED) {
|
||||
if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
|
||||
HwErrVariableTotalSize += VariableSize;
|
||||
} else {
|
||||
CommonVariableTotalSize += VariableSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2551,10 +2711,81 @@ VariableServiceQueryVariableInfo (
|
|||
*MaximumVariableSize = *RemainingVariableStorageSize - sizeof (VARIABLE_HEADER);
|
||||
}
|
||||
|
||||
ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
This code returns information about the EFI variables.
|
||||
|
||||
@param Attributes Attributes bitmask to specify the type of variables
|
||||
on which to return information.
|
||||
@param MaximumVariableStorageSize Pointer to the maximum size of the storage space available
|
||||
for the EFI variables associated with the attributes specified.
|
||||
@param RemainingVariableStorageSize Pointer to the remaining size of the storage space available
|
||||
for EFI variables associated with the attributes specified.
|
||||
@param MaximumVariableSize Pointer to the maximum size of an individual EFI variables
|
||||
associated with the attributes specified.
|
||||
|
||||
@return EFI_INVALID_PARAMETER An invalid combination of attribute bits was supplied.
|
||||
@return EFI_SUCCESS Query successfully.
|
||||
@return EFI_UNSUPPORTED The attribute is not supported on this platform.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VariableServiceQueryVariableInfo (
|
||||
IN UINT32 Attributes,
|
||||
OUT UINT64 *MaximumVariableStorageSize,
|
||||
OUT UINT64 *RemainingVariableStorageSize,
|
||||
OUT UINT64 *MaximumVariableSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
if(MaximumVariableStorageSize == NULL || RemainingVariableStorageSize == NULL || MaximumVariableSize == NULL || Attributes == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == 0) {
|
||||
//
|
||||
// Make sure the Attributes combination is supported by the platform.
|
||||
//
|
||||
return EFI_UNSUPPORTED;
|
||||
} else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS) {
|
||||
//
|
||||
// Make sure if runtime bit is set, boot service bit is set also.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if (AtRuntime () && ((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0)) {
|
||||
//
|
||||
// Make sure RT Attribute is set if we are in Runtime phase.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
|
||||
//
|
||||
// Make sure Hw Attribute is set with NV.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if ((Attributes & (EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_APPEND_WRITE)) != 0) {
|
||||
//
|
||||
// Not support authenticated or append variable write yet.
|
||||
//
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);
|
||||
|
||||
Status = VariableServiceQueryVariableInfoInternal (
|
||||
Attributes,
|
||||
MaximumVariableStorageSize,
|
||||
RemainingVariableStorageSize,
|
||||
MaximumVariableSize
|
||||
);
|
||||
|
||||
ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
This function reclaims variable storage if free size is below the threshold.
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
The internal header file includes the common header files, defines
|
||||
internal structure and functions used by Variable modules.
|
||||
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -42,6 +42,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
#include <Guid/FaultTolerantWrite.h>
|
||||
#include <Guid/HardwareErrorVariable.h>
|
||||
|
||||
#define VARIABLE_ATTRIBUTE_BS_RT (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
|
||||
#define VARIABLE_ATTRIBUTE_NV_BS_RT (VARIABLE_ATTRIBUTE_BS_RT | EFI_VARIABLE_NON_VOLATILE)
|
||||
|
||||
#define VARIABLE_RECLAIM_THRESHOLD (1024)
|
||||
|
||||
///
|
||||
|
|
@ -94,10 +97,8 @@ typedef struct {
|
|||
typedef struct {
|
||||
EFI_GUID *Guid;
|
||||
CHAR16 *Name;
|
||||
UINT32 Attributes;
|
||||
UINTN DataSize;
|
||||
VOID *Data;
|
||||
} VARIABLE_CACHE_ENTRY;
|
||||
UINTN VariableSize;
|
||||
} VARIABLE_ENTRY_CONSISTENCY;
|
||||
|
||||
typedef struct {
|
||||
EFI_GUID Guid;
|
||||
|
|
@ -438,6 +439,31 @@ VariableServiceSetVariable (
|
|||
IN VOID *Data
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
This code returns information about the EFI variables.
|
||||
|
||||
@param Attributes Attributes bitmask to specify the type of variables
|
||||
on which to return information.
|
||||
@param MaximumVariableStorageSize Pointer to the maximum size of the storage space available
|
||||
for the EFI variables associated with the attributes specified.
|
||||
@param RemainingVariableStorageSize Pointer to the remaining size of the storage space available
|
||||
for EFI variables associated with the attributes specified.
|
||||
@param MaximumVariableSize Pointer to the maximum size of an individual EFI variables
|
||||
associated with the attributes specified.
|
||||
|
||||
@return EFI_SUCCESS Query successfully.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VariableServiceQueryVariableInfoInternal (
|
||||
IN UINT32 Attributes,
|
||||
OUT UINT64 *MaximumVariableStorageSize,
|
||||
OUT UINT64 *RemainingVariableStorageSize,
|
||||
OUT UINT64 *MaximumVariableSize
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
This code returns information about the EFI variables.
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
# Component description file for Variable module.
|
||||
#
|
||||
# This module installs three EFI_RUNTIME_SERVICES: SetVariable, GetVariable, GetNextVariableName.
|
||||
# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
|
|
@ -80,7 +80,8 @@
|
|||
gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize
|
||||
|
||||
[FeaturePcd]
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## SOMETIME_CONSUMES (statistic the information of variable.)
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## CONSUMES # statistic the information of variable.
|
||||
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate ## CONSUMES
|
||||
|
||||
[Depex]
|
||||
TRUE
|
||||
|
|
|
|||
|
|
@ -11,13 +11,13 @@
|
|||
#
|
||||
# Caution: This module requires additional review when modified.
|
||||
# This driver will have external input - variable data and communicate buffer in SMM mode.
|
||||
# This external input must be validated carefully to avoid security issue like
|
||||
# buffer overflow, integer overflow.
|
||||
#
|
||||
# Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# This external input must be validated carefully to avoid security issue like
|
||||
# buffer overflow, integer overflow.
|
||||
#
|
||||
# Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
|
@ -86,12 +86,13 @@
|
|||
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize
|
||||
|
||||
[FeaturePcd]
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## SOMETIME_CONSUMES (statistic the information of variable.)
|
||||
|
||||
[Depex]
|
||||
TRUE
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize
|
||||
|
||||
[FeaturePcd]
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## CONSUMES # statistic the information of variable.
|
||||
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate ## CONSUMES
|
||||
|
||||
[Depex]
|
||||
TRUE
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1308,7 +1308,8 @@
|
|||
## If TRUE, the driver diagnostics2 protocol will not be installed.
|
||||
gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|FALSE|BOOLEAN|0x00000011
|
||||
|
||||
## Indicates whether EFI 1.1 ISO 639-2 language supports are obsolete
|
||||
## Indicates whether EFI 1.1 ISO 639-2 language supports are obsolete.
|
||||
# If TRUE, Variable driver will be also not to auto update between PlatformLang and Lang variables.
|
||||
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate|FALSE|BOOLEAN|0x00000012
|
||||
|
||||
## If TRUE, UGA Draw Protocol is still consumed.
|
||||
|
|
|
|||
|
|
@ -162,15 +162,7 @@
|
|||
# If 1, TCG platform type is server.
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmPlatformClass|0|UINT8|0x00000006
|
||||
|
||||
## The PCD is used to control whether to support hiding the TPM.
|
||||
# If TRUE, PcdHideTpm controls whether to hide the TPM.
|
||||
# This pcd is only for validation purpose. It should be set to false in production.
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpmSupport|FALSE|BOOLEAN|0x00000007
|
||||
|
||||
[PcdsDynamic, PcdsDynamicEx]
|
||||
## The PCD is used to control whether to hide the TPM.
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpm|FALSE|BOOLEAN|0x00010002
|
||||
|
||||
[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
|
||||
## This PCD indicates the presence or absence of the platform operator.
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmPhysicalPresence|TRUE|BOOLEAN|0x00010001
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
VFR file used by the TCG configuration component.
|
||||
|
||||
Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -44,13 +44,6 @@ formset
|
|||
endcheckbox;
|
||||
endif;
|
||||
|
||||
suppressif TRUE;
|
||||
checkbox varid = TCG_CONFIGURATION.OriginalHideTpm,
|
||||
prompt = STRING_TOKEN(STR_NULL),
|
||||
help = STRING_TOKEN(STR_NULL),
|
||||
endcheckbox;
|
||||
endif;
|
||||
|
||||
text
|
||||
help = STRING_TOKEN(STR_TPM_STATE_HELP),
|
||||
text = STRING_TOKEN(STR_TPM_STATE_PROMPT),
|
||||
|
|
@ -58,18 +51,6 @@ formset
|
|||
|
||||
subtitle text = STRING_TOKEN(STR_NULL);
|
||||
|
||||
label LABEL_TCG_CONFIGURATION_HIDETPM;
|
||||
|
||||
checkbox varid = TCG_CONFIGURATION.HideTpm,
|
||||
questionid = KEY_HIDE_TPM,
|
||||
prompt = STRING_TOKEN(STR_HIDE_TPM_PROMPT),
|
||||
help = STRING_TOKEN(STR_HIDE_TPM_HELP),
|
||||
flags = RESET_REQUIRED,
|
||||
endcheckbox;
|
||||
|
||||
label LABEL_END;
|
||||
|
||||
grayoutif ideqval TCG_CONFIGURATION.OriginalHideTpm == 1;
|
||||
oneof varid = TCG_CONFIGURATION.TpmOperation,
|
||||
questionid = KEY_TPM_ACTION,
|
||||
prompt = STRING_TOKEN(STR_TPM_OPERATION),
|
||||
|
|
@ -102,8 +83,6 @@ formset
|
|||
|
||||
subtitle text = STRING_TOKEN(STR_NULL);
|
||||
|
||||
endif;
|
||||
|
||||
endform;
|
||||
|
||||
endformset;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
The module entry point for Tcg configuration module.
|
||||
|
||||
Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -75,7 +75,6 @@ TcgConfigDriverEntryPoint (
|
|||
}
|
||||
|
||||
PrivateData->TcgProtocol = TcgProtocol;
|
||||
PrivateData->HideTpm = (BOOLEAN) (PcdGetBool (PcdHideTpmSupport) && PcdGetBool (PcdHideTpm));
|
||||
|
||||
//
|
||||
// Install TCG configuration form
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
## @file
|
||||
# Component name for Tcg configuration module.
|
||||
#
|
||||
# Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -63,11 +63,7 @@
|
|||
gEfiHiiConfigRoutingProtocolGuid ## CONSUMES
|
||||
gEfiTcgProtocolGuid ## CONSUMES
|
||||
|
||||
[FixedPcd]
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpmSupport
|
||||
|
||||
[Pcd]
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpm
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid
|
||||
|
||||
[Depex]
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
HII Config Access protocol implementation of TCG configuration module.
|
||||
|
||||
Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -182,11 +182,6 @@ TcgExtractConfig (
|
|||
ZeroMem (&Configuration, sizeof (TCG_CONFIGURATION));
|
||||
|
||||
Configuration.TpmOperation = PHYSICAL_PRESENCE_ENABLE;
|
||||
Configuration.HideTpm = (BOOLEAN) (PcdGetBool (PcdHideTpmSupport) && PcdGetBool (PcdHideTpm));
|
||||
//
|
||||
// Read the original value of HideTpm from PrivateData which won't be changed by Setup in this boot.
|
||||
//
|
||||
Configuration.OriginalHideTpm = PrivateData->HideTpm;
|
||||
|
||||
//
|
||||
// Display current TPM state.
|
||||
|
|
@ -307,8 +302,6 @@ TcgRouteConfig (
|
|||
return Status;
|
||||
}
|
||||
|
||||
PcdSetBool (PcdHideTpm, TcgConfiguration.HideTpm);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -425,11 +418,6 @@ InstallTcgConfigForm (
|
|||
EFI_STATUS Status;
|
||||
EFI_HII_HANDLE HiiHandle;
|
||||
EFI_HANDLE DriverHandle;
|
||||
VOID *StartOpCodeHandle;
|
||||
VOID *EndOpCodeHandle;
|
||||
EFI_IFR_GUID_LABEL *StartLabel;
|
||||
EFI_IFR_GUID_LABEL *EndLabel;
|
||||
|
||||
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
|
||||
|
||||
DriverHandle = NULL;
|
||||
|
|
@ -473,39 +461,6 @@ InstallTcgConfigForm (
|
|||
|
||||
PrivateData->HiiHandle = HiiHandle;
|
||||
|
||||
//
|
||||
// Remove the Hide TPM question from the IFR
|
||||
//
|
||||
if (!PcdGetBool (PcdHideTpmSupport)) {
|
||||
//
|
||||
// Allocate space for creation of UpdateData Buffer
|
||||
//
|
||||
StartOpCodeHandle = HiiAllocateOpCodeHandle ();
|
||||
ASSERT (StartOpCodeHandle != NULL);
|
||||
|
||||
EndOpCodeHandle = HiiAllocateOpCodeHandle ();
|
||||
ASSERT (EndOpCodeHandle != NULL);
|
||||
|
||||
//
|
||||
// Create Hii Extend Label OpCode as the start opcode
|
||||
//
|
||||
StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
|
||||
StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
|
||||
StartLabel->Number = LABEL_TCG_CONFIGURATION_HIDETPM;
|
||||
|
||||
//
|
||||
// Create Hii Extend Label OpCode as the end opcode
|
||||
//
|
||||
EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
|
||||
EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
|
||||
EndLabel->Number = LABEL_END;
|
||||
|
||||
HiiUpdateForm (HiiHandle, NULL, TCG_CONFIGURATION_FORM_ID, StartOpCodeHandle, EndOpCodeHandle);
|
||||
|
||||
HiiFreeOpCodeHandle (StartOpCodeHandle);
|
||||
HiiFreeOpCodeHandle (EndOpCodeHandle);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
The header file of HII Config Access protocol implementation of TCG
|
||||
configuration module.
|
||||
|
||||
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -62,8 +62,6 @@ typedef struct {
|
|||
EFI_HANDLE DriverHandle;
|
||||
|
||||
EFI_TCG_PROTOCOL *TcgProtocol;
|
||||
|
||||
BOOLEAN HideTpm;
|
||||
} TCG_CONFIG_PRIVATE_DATA;
|
||||
|
||||
extern TCG_CONFIG_PRIVATE_DATA mTcgConfigPrivateDateTemplate;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Header file for NV data structure definition.
|
||||
|
||||
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -22,19 +22,15 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
#define TCG_CONFIGURATION_VARSTORE_ID 0x0001
|
||||
#define TCG_CONFIGURATION_FORM_ID 0x0001
|
||||
|
||||
#define KEY_HIDE_TPM 0x2000
|
||||
#define KEY_TPM_ACTION 0x3000
|
||||
#define KEY_TPM_MOR_ENABLE 0x4000
|
||||
#define KEY_TPM_ACTION 0x3000
|
||||
|
||||
#define LABEL_TCG_CONFIGURATION_HIDETPM 0x0001
|
||||
#define LABEL_END 0xffff
|
||||
#define LABEL_TCG_CONFIGURATION_TPM_OPERATION 0x0001
|
||||
#define LABEL_END 0xffff
|
||||
|
||||
//
|
||||
// Nv Data structure referenced by IFR
|
||||
//
|
||||
typedef struct {
|
||||
BOOLEAN HideTpm;
|
||||
BOOLEAN OriginalHideTpm;
|
||||
UINT8 TpmOperation;
|
||||
BOOLEAN TpmEnable;
|
||||
BOOLEAN TpmActivate;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Initialize TPM device and measure FVs before handing off control to DXE.
|
||||
|
||||
Copyright (c) 2005 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -705,10 +705,6 @@ PeimEntryMA (
|
|||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (PcdGetBool (PcdHideTpmSupport) && PcdGetBool (PcdHideTpm)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize TPM device
|
||||
//
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
## @file
|
||||
# This module will initialize TPM device and measure FVs in PEI phase.
|
||||
#
|
||||
# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -62,7 +62,6 @@
|
|||
gEfiEndOfPeiSignalPpiGuid
|
||||
|
||||
[Pcd]
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpm
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdPhysicalPresenceLifetimeLock
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdPhysicalPresenceCmdEnable
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdPhysicalPresenceHwEnable
|
||||
|
|
@ -72,7 +71,6 @@
|
|||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmScrtmPolicy
|
||||
|
||||
[FixedPcd]
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpmSupport
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported ## CONSUMES
|
||||
|
||||
[Depex]
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
TPM1.2/dTPM2.0 auto detection.
|
||||
|
||||
Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -69,11 +69,6 @@ DetectTpmDevice (
|
|||
EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariablePpi;
|
||||
UINTN Size;
|
||||
|
||||
if (PcdGetBool (PcdHideTpmSupport) && PcdGetBool (PcdHideTpm)) {
|
||||
DEBUG ((EFI_D_ERROR, "DetectTpmDevice: Tpm is hide\n"));
|
||||
return TPM_DEVICE_NULL;
|
||||
}
|
||||
|
||||
Status = PeiServicesGetBootMode (&BootMode);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
# Component name for TrEE configuration module.
|
||||
# NOTE: This module is only for reference only, each platform should have its own setup page.
|
||||
#
|
||||
# Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -55,12 +55,8 @@
|
|||
[Ppis]
|
||||
gEfiPeiReadOnlyVariable2PpiGuid
|
||||
|
||||
[FixedPcd]
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpmSupport
|
||||
|
||||
[Pcd]
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpm
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmInitializationPolicy
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmAutoDetection
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/** @file
|
||||
Initialize TPM2 device and measure FVs before handing off control to DXE.
|
||||
|
||||
Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -620,10 +620,6 @@ PeimEntryMA (
|
|||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (PcdGetBool (PcdHideTpmSupport) && PcdGetBool (PcdHideTpm)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Update for Performance optimization
|
||||
//
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
## @file
|
||||
# This module will initialize TPM2 device and measure FVs in PEI phase.
|
||||
#
|
||||
# Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -58,7 +58,6 @@
|
|||
gEfiEndOfPeiSignalPpiGuid
|
||||
|
||||
[Pcd]
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpm
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString ## CONSUMES
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdTpm2InitializationPolicy
|
||||
|
|
@ -66,7 +65,6 @@
|
|||
gEfiSecurityPkgTokenSpaceGuid.PcdTpm2ScrtmPolicy
|
||||
|
||||
[FixedPcd]
|
||||
gEfiSecurityPkgTokenSpaceGuid.PcdHideTpmSupport
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported ## CONSUMES
|
||||
|
||||
[Depex]
|
||||
|
|
|
|||
|
|
@ -422,16 +422,19 @@ AutenticatedVariableServiceInitialize (
|
|||
**/
|
||||
UINT32
|
||||
AddPubKeyInStore (
|
||||
IN UINT8 *PubKey
|
||||
IN UINT8 *PubKey,
|
||||
IN VARIABLE_ENTRY_CONSISTENCY *VariableDataEntry
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN IsFound;
|
||||
UINT32 Index;
|
||||
VARIABLE_POINTER_TRACK Variable;
|
||||
UINT8 *Ptr;
|
||||
UINT8 *Data;
|
||||
UINTN DataSize;
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN IsFound;
|
||||
UINT32 Index;
|
||||
VARIABLE_POINTER_TRACK Variable;
|
||||
UINT8 *Ptr;
|
||||
UINT8 *Data;
|
||||
UINTN DataSize;
|
||||
VARIABLE_ENTRY_CONSISTENCY PublicKeyEntry;
|
||||
UINT32 Attributes;
|
||||
|
||||
if (PubKey == NULL) {
|
||||
return 0;
|
||||
|
|
@ -511,6 +514,21 @@ AddPubKeyInStore (
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check the variable space for both public key and variable data.
|
||||
//
|
||||
PublicKeyEntry.VariableSize = (mPubKeyNumber + 1) * EFI_CERT_TYPE_RSA2048_SIZE;
|
||||
PublicKeyEntry.Guid = &gEfiAuthenticatedVariableGuid;
|
||||
PublicKeyEntry.Name = AUTHVAR_KEYDB_NAME;
|
||||
Attributes = VARIABLE_ATTRIBUTE_NV_BS_RT | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS;
|
||||
|
||||
if (!CheckRemainingSpaceForConsistency (Attributes, &PublicKeyEntry, VariableDataEntry, NULL)) {
|
||||
//
|
||||
// No enough variable space.
|
||||
//
|
||||
return 0;
|
||||
}
|
||||
|
||||
CopyMem (mPubKeyStore + mPubKeyNumber * EFI_CERT_TYPE_RSA2048_SIZE, PubKey, EFI_CERT_TYPE_RSA2048_SIZE);
|
||||
Index = ++mPubKeyNumber;
|
||||
//
|
||||
|
|
@ -521,7 +539,7 @@ AddPubKeyInStore (
|
|||
&gEfiAuthenticatedVariableGuid,
|
||||
mPubKeyStore,
|
||||
mPubKeyNumber * EFI_CERT_TYPE_RSA2048_SIZE,
|
||||
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS,
|
||||
Attributes,
|
||||
0,
|
||||
0,
|
||||
&Variable,
|
||||
|
|
@ -1172,6 +1190,7 @@ ProcessVariable (
|
|||
EFI_CERT_BLOCK_RSA_2048_SHA256 *CertBlock;
|
||||
UINT32 KeyIndex;
|
||||
UINT64 MonotonicCount;
|
||||
VARIABLE_ENTRY_CONSISTENCY VariableDataEntry;
|
||||
|
||||
KeyIndex = 0;
|
||||
CertData = NULL;
|
||||
|
|
@ -1297,10 +1316,14 @@ ProcessVariable (
|
|||
// Now, the signature has been verified!
|
||||
//
|
||||
if (IsFirstTime && !IsDeletion) {
|
||||
VariableDataEntry.VariableSize = DataSize - AUTHINFO_SIZE;
|
||||
VariableDataEntry.Guid = VendorGuid;
|
||||
VariableDataEntry.Name = VariableName;
|
||||
|
||||
//
|
||||
// Update public key database variable if need.
|
||||
//
|
||||
KeyIndex = AddPubKeyInStore (PubKey);
|
||||
KeyIndex = AddPubKeyInStore (PubKey, &VariableDataEntry);
|
||||
if (KeyIndex == 0) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -805,6 +805,7 @@ Reclaim (
|
|||
FreePool (ValidBuffer);
|
||||
return Status;
|
||||
}
|
||||
ASSERT ((NewPubKeyIndex != NULL) && (NewPubKeyStore != NULL));
|
||||
|
||||
//
|
||||
// Refresh the PubKeyIndex for all valid variables (ADDED and IN_DELETED_TRANSITION).
|
||||
|
|
@ -1448,6 +1449,134 @@ VariableGetBestLanguage (
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
This function is to check if the remaining variable space is enough to set
|
||||
all Variables from argument list successfully. The purpose of the check
|
||||
is to keep the consistency of the Variables to be in variable storage.
|
||||
|
||||
Note: Variables are assumed to be in same storage.
|
||||
The set sequence of Variables will be same with the sequence of VariableEntry from argument list,
|
||||
so follow the argument sequence to check the Variables.
|
||||
|
||||
@param[in] Attributes Variable attributes for Variable entries.
|
||||
@param ... The variable argument list with type VARIABLE_ENTRY_CONSISTENCY *.
|
||||
A NULL terminates the list. The VariableSize of
|
||||
VARIABLE_ENTRY_CONSISTENCY is the variable data size as input.
|
||||
It will be changed to variable total size as output.
|
||||
|
||||
@retval TRUE Have enough variable space to set the Variables successfully.
|
||||
@retval FALSE No enough variable space to set the Variables successfully.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
CheckRemainingSpaceForConsistency (
|
||||
IN UINT32 Attributes,
|
||||
...
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
VA_LIST Args;
|
||||
VARIABLE_ENTRY_CONSISTENCY *VariableEntry;
|
||||
UINT64 MaximumVariableStorageSize;
|
||||
UINT64 RemainingVariableStorageSize;
|
||||
UINT64 MaximumVariableSize;
|
||||
UINTN TotalNeededSize;
|
||||
UINTN OriginalVarSize;
|
||||
VARIABLE_STORE_HEADER *VariableStoreHeader;
|
||||
VARIABLE_POINTER_TRACK VariablePtrTrack;
|
||||
VARIABLE_HEADER *NextVariable;
|
||||
UINTN VarNameSize;
|
||||
UINTN VarDataSize;
|
||||
|
||||
//
|
||||
// Non-Volatile related.
|
||||
//
|
||||
VariableStoreHeader = mNvVariableCache;
|
||||
|
||||
Status = VariableServiceQueryVariableInfoInternal (
|
||||
Attributes,
|
||||
&MaximumVariableStorageSize,
|
||||
&RemainingVariableStorageSize,
|
||||
&MaximumVariableSize
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
TotalNeededSize = 0;
|
||||
VA_START (Args, Attributes);
|
||||
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
|
||||
while (VariableEntry != NULL) {
|
||||
//
|
||||
// Calculate variable total size.
|
||||
//
|
||||
VarNameSize = StrSize (VariableEntry->Name);
|
||||
VarNameSize += GET_PAD_SIZE (VarNameSize);
|
||||
VarDataSize = VariableEntry->VariableSize;
|
||||
VarDataSize += GET_PAD_SIZE (VarDataSize);
|
||||
VariableEntry->VariableSize = HEADER_ALIGN (sizeof (VARIABLE_HEADER) + VarNameSize + VarDataSize);
|
||||
|
||||
TotalNeededSize += VariableEntry->VariableSize;
|
||||
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
|
||||
}
|
||||
VA_END (Args);
|
||||
|
||||
if (RemainingVariableStorageSize >= TotalNeededSize) {
|
||||
//
|
||||
// Already have enough space.
|
||||
//
|
||||
return TRUE;
|
||||
} else if (AtRuntime ()) {
|
||||
//
|
||||
// At runtime, no reclaim.
|
||||
// The original variable space of Variables can't be reused.
|
||||
//
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VA_START (Args, Attributes);
|
||||
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
|
||||
while (VariableEntry != NULL) {
|
||||
//
|
||||
// Check if Variable[Index] has been present and get its size.
|
||||
//
|
||||
OriginalVarSize = 0;
|
||||
VariablePtrTrack.StartPtr = GetStartPointer (VariableStoreHeader);
|
||||
VariablePtrTrack.EndPtr = GetEndPointer (VariableStoreHeader);
|
||||
Status = FindVariableEx (
|
||||
VariableEntry->Name,
|
||||
VariableEntry->Guid,
|
||||
FALSE,
|
||||
&VariablePtrTrack
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
// Get size of Variable[Index].
|
||||
//
|
||||
NextVariable = GetNextVariablePtr (VariablePtrTrack.CurrPtr);
|
||||
OriginalVarSize = (UINTN) NextVariable - (UINTN) VariablePtrTrack.CurrPtr;
|
||||
//
|
||||
// Add the original size of Variable[Index] to remaining variable storage size.
|
||||
//
|
||||
RemainingVariableStorageSize += OriginalVarSize;
|
||||
}
|
||||
if (VariableEntry->VariableSize > RemainingVariableStorageSize) {
|
||||
//
|
||||
// No enough space for Variable[Index].
|
||||
//
|
||||
VA_END (Args);
|
||||
return FALSE;
|
||||
}
|
||||
//
|
||||
// Sub the (new) size of Variable[Index] from remaining variable storage size.
|
||||
//
|
||||
RemainingVariableStorageSize -= VariableEntry->VariableSize;
|
||||
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);
|
||||
}
|
||||
VA_END (Args);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
Hook the operations in PlatformLangCodes, LangCodes, PlatformLang and Lang.
|
||||
|
||||
|
|
@ -1482,6 +1611,7 @@ AutoUpdateLangVariable (
|
|||
UINT32 Attributes;
|
||||
VARIABLE_POINTER_TRACK Variable;
|
||||
BOOLEAN SetLanguageCodes;
|
||||
VARIABLE_ENTRY_CONSISTENCY VariableEntry[2];
|
||||
|
||||
//
|
||||
// Don't do updates for delete operation
|
||||
|
|
@ -1604,12 +1734,29 @@ AutoUpdateLangVariable (
|
|||
BestLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->LangCodes, Index, TRUE);
|
||||
|
||||
//
|
||||
// Successfully convert PlatformLang to Lang, and set the BestLang value into Lang variable simultaneously.
|
||||
// Check the variable space for both Lang and PlatformLang variable.
|
||||
//
|
||||
FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||
VariableEntry[0].VariableSize = ISO_639_2_ENTRY_SIZE + 1;
|
||||
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;
|
||||
VariableEntry[0].Name = L"Lang";
|
||||
|
||||
VariableEntry[1].VariableSize = AsciiStrSize (BestPlatformLang);
|
||||
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;
|
||||
VariableEntry[1].Name = L"PlatformLang";
|
||||
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) {
|
||||
//
|
||||
// No enough variable space to set both Lang and PlatformLang successfully.
|
||||
//
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
} else {
|
||||
//
|
||||
// Successfully convert PlatformLang to Lang, and set the BestLang value into Lang variable simultaneously.
|
||||
//
|
||||
FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||
|
||||
Status = UpdateVariable (L"Lang", &gEfiGlobalVariableGuid, BestLang,
|
||||
ISO_639_2_ENTRY_SIZE + 1, Attributes, 0, 0, &Variable, NULL);
|
||||
Status = UpdateVariable (L"Lang", &gEfiGlobalVariableGuid, BestLang,
|
||||
ISO_639_2_ENTRY_SIZE + 1, Attributes, 0, 0, &Variable, NULL);
|
||||
}
|
||||
|
||||
DEBUG ((EFI_D_INFO, "Variable Driver Auto Update PlatformLang, PlatformLang:%a, Lang:%a Status: %r\n", BestPlatformLang, BestLang, Status));
|
||||
}
|
||||
|
|
@ -1636,19 +1783,43 @@ AutoUpdateLangVariable (
|
|||
BestPlatformLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->PlatformLangCodes, Index, FALSE);
|
||||
|
||||
//
|
||||
// Successfully convert Lang to PlatformLang, and set the BestPlatformLang value into PlatformLang variable simultaneously.
|
||||
// Check the variable space for both PlatformLang and Lang variable.
|
||||
//
|
||||
FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||
VariableEntry[0].VariableSize = AsciiStrSize (BestPlatformLang);
|
||||
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;
|
||||
VariableEntry[0].Name = L"PlatformLang";
|
||||
|
||||
Status = UpdateVariable (L"PlatformLang", &gEfiGlobalVariableGuid, BestPlatformLang,
|
||||
AsciiStrSize (BestPlatformLang), Attributes, 0, 0, &Variable, NULL);
|
||||
VariableEntry[1].VariableSize = ISO_639_2_ENTRY_SIZE + 1;
|
||||
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;
|
||||
VariableEntry[1].Name = L"Lang";
|
||||
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) {
|
||||
//
|
||||
// No enough variable space to set both PlatformLang and Lang successfully.
|
||||
//
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
} else {
|
||||
//
|
||||
// Successfully convert Lang to PlatformLang, and set the BestPlatformLang value into PlatformLang variable simultaneously.
|
||||
//
|
||||
FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);
|
||||
|
||||
Status = UpdateVariable (L"PlatformLang", &gEfiGlobalVariableGuid, BestPlatformLang,
|
||||
AsciiStrSize (BestPlatformLang), Attributes, 0, 0, &Variable, NULL);
|
||||
}
|
||||
|
||||
DEBUG ((EFI_D_INFO, "Variable Driver Auto Update Lang, Lang:%a, PlatformLang:%a Status: %r\n", BestLang, BestPlatformLang, Status));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
if (SetLanguageCodes) {
|
||||
//
|
||||
// Continue to set PlatformLangCodes or LangCodes.
|
||||
//
|
||||
return EFI_SUCCESS;
|
||||
} else {
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1769,10 +1940,10 @@ UpdateVariable (
|
|||
//
|
||||
if ((Variable->CurrPtr->Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) {
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
//
|
||||
goto Done;
|
||||
}
|
||||
|
||||
//
|
||||
// Only variable that have RT attributes can be updated/deleted in Runtime.
|
||||
//
|
||||
if ((Variable->CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0) {
|
||||
|
|
@ -2852,16 +3023,18 @@ VariableServiceSetVariable (
|
|||
goto Done;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Hook the operation of setting PlatformLangCodes/PlatformLang and LangCodes/Lang.
|
||||
//
|
||||
Status = AutoUpdateLangVariable (VariableName, Data, DataSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
|
||||
if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {
|
||||
//
|
||||
// The auto update operation failed, directly return to avoid inconsistency between PlatformLang and Lang.
|
||||
// Hook the operation of setting PlatformLangCodes/PlatformLang and LangCodes/Lang.
|
||||
//
|
||||
goto Done;
|
||||
Status = AutoUpdateLangVariable (VariableName, Data, DataSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// The auto update operation failed, directly return to avoid inconsistency between PlatformLang and Lang.
|
||||
//
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -2913,14 +3086,12 @@ Done:
|
|||
@param MaximumVariableSize Pointer to the maximum size of an individual EFI variables
|
||||
associated with the attributes specified.
|
||||
|
||||
@return EFI_INVALID_PARAMETER An invalid combination of attribute bits was supplied.
|
||||
@return EFI_SUCCESS Query successfully.
|
||||
@return EFI_UNSUPPORTED The attribute is not supported on this platform.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VariableServiceQueryVariableInfo (
|
||||
VariableServiceQueryVariableInfoInternal (
|
||||
IN UINT32 Attributes,
|
||||
OUT UINT64 *MaximumVariableStorageSize,
|
||||
OUT UINT64 *RemainingVariableStorageSize,
|
||||
|
|
@ -2933,38 +3104,12 @@ VariableServiceQueryVariableInfo (
|
|||
VARIABLE_STORE_HEADER *VariableStoreHeader;
|
||||
UINT64 CommonVariableTotalSize;
|
||||
UINT64 HwErrVariableTotalSize;
|
||||
EFI_STATUS Status;
|
||||
VARIABLE_POINTER_TRACK VariablePtrTrack;
|
||||
|
||||
CommonVariableTotalSize = 0;
|
||||
HwErrVariableTotalSize = 0;
|
||||
|
||||
if(MaximumVariableStorageSize == NULL || RemainingVariableStorageSize == NULL || MaximumVariableSize == NULL || Attributes == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == 0) {
|
||||
//
|
||||
// Make sure the Attributes combination is supported by the platform.
|
||||
//
|
||||
return EFI_UNSUPPORTED;
|
||||
} else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS) {
|
||||
//
|
||||
// Make sure if runtime bit is set, boot service bit is set also.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if (AtRuntime () && ((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0)) {
|
||||
//
|
||||
// Make sure RT Attribute is set if we are in Runtime phase.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
|
||||
//
|
||||
// Make sure Hw Attribute is set with NV.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);
|
||||
|
||||
if((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) {
|
||||
//
|
||||
// Query is Volatile related.
|
||||
|
|
@ -3036,6 +3181,27 @@ VariableServiceQueryVariableInfo (
|
|||
} else {
|
||||
CommonVariableTotalSize += VariableSize;
|
||||
}
|
||||
} else if (Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {
|
||||
//
|
||||
// If it is a IN_DELETED_TRANSITION variable,
|
||||
// and there is not also a same ADDED one at the same time,
|
||||
// this IN_DELETED_TRANSITION variable is valid.
|
||||
//
|
||||
VariablePtrTrack.StartPtr = GetStartPointer (VariableStoreHeader);
|
||||
VariablePtrTrack.EndPtr = GetEndPointer (VariableStoreHeader);
|
||||
Status = FindVariableEx (
|
||||
GetVariableNamePtr (Variable),
|
||||
&Variable->VendorGuid,
|
||||
FALSE,
|
||||
&VariablePtrTrack
|
||||
);
|
||||
if (!EFI_ERROR (Status) && VariablePtrTrack.CurrPtr->State != VAR_ADDED) {
|
||||
if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
|
||||
HwErrVariableTotalSize += VariableSize;
|
||||
} else {
|
||||
CommonVariableTotalSize += VariableSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3057,10 +3223,79 @@ VariableServiceQueryVariableInfo (
|
|||
*MaximumVariableSize = *RemainingVariableStorageSize - sizeof (VARIABLE_HEADER);
|
||||
}
|
||||
|
||||
ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
This code returns information about the EFI variables.
|
||||
|
||||
Caution: This function may receive untrusted input.
|
||||
This function may be invoked in SMM mode. This function will do basic validation, before parse the data.
|
||||
|
||||
@param Attributes Attributes bitmask to specify the type of variables
|
||||
on which to return information.
|
||||
@param MaximumVariableStorageSize Pointer to the maximum size of the storage space available
|
||||
for the EFI variables associated with the attributes specified.
|
||||
@param RemainingVariableStorageSize Pointer to the remaining size of the storage space available
|
||||
for EFI variables associated with the attributes specified.
|
||||
@param MaximumVariableSize Pointer to the maximum size of an individual EFI variables
|
||||
associated with the attributes specified.
|
||||
|
||||
@return EFI_INVALID_PARAMETER An invalid combination of attribute bits was supplied.
|
||||
@return EFI_SUCCESS Query successfully.
|
||||
@return EFI_UNSUPPORTED The attribute is not supported on this platform.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VariableServiceQueryVariableInfo (
|
||||
IN UINT32 Attributes,
|
||||
OUT UINT64 *MaximumVariableStorageSize,
|
||||
OUT UINT64 *RemainingVariableStorageSize,
|
||||
OUT UINT64 *MaximumVariableSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
if(MaximumVariableStorageSize == NULL || RemainingVariableStorageSize == NULL || MaximumVariableSize == NULL || Attributes == 0) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == 0) {
|
||||
//
|
||||
// Make sure the Attributes combination is supported by the platform.
|
||||
//
|
||||
return EFI_UNSUPPORTED;
|
||||
} else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS) {
|
||||
//
|
||||
// Make sure if runtime bit is set, boot service bit is set also.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if (AtRuntime () && ((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0)) {
|
||||
//
|
||||
// Make sure RT Attribute is set if we are in Runtime phase.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
} else if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
|
||||
//
|
||||
// Make sure Hw Attribute is set with NV.
|
||||
//
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);
|
||||
|
||||
Status = VariableServiceQueryVariableInfoInternal (
|
||||
Attributes,
|
||||
MaximumVariableStorageSize,
|
||||
RemainingVariableStorageSize,
|
||||
MaximumVariableSize
|
||||
);
|
||||
|
||||
ReleaseLockOnlyAtBootTime (&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
This function reclaims variable storage if free size is below the threshold.
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
The internal header file includes the common header files, defines
|
||||
internal structure and functions used by Variable modules.
|
||||
|
||||
Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
|
|
@ -44,6 +44,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
#include <Guid/FaultTolerantWrite.h>
|
||||
#include <Guid/HardwareErrorVariable.h>
|
||||
|
||||
#define VARIABLE_ATTRIBUTE_BS_RT (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
|
||||
#define VARIABLE_ATTRIBUTE_NV_BS_RT (VARIABLE_ATTRIBUTE_BS_RT | EFI_VARIABLE_NON_VOLATILE)
|
||||
|
||||
#define VARIABLE_RECLAIM_THRESHOLD (1024)
|
||||
#define EFI_VARIABLE_ATTRIBUTES_MASK (EFI_VARIABLE_NON_VOLATILE | \
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | \
|
||||
|
|
@ -103,10 +106,8 @@ typedef struct {
|
|||
typedef struct {
|
||||
EFI_GUID *Guid;
|
||||
CHAR16 *Name;
|
||||
UINT32 Attributes;
|
||||
UINTN DataSize;
|
||||
VOID *Data;
|
||||
} VARIABLE_CACHE_ENTRY;
|
||||
UINTN VariableSize;
|
||||
} VARIABLE_ENTRY_CONSISTENCY;
|
||||
|
||||
typedef struct {
|
||||
EFI_GUID Guid;
|
||||
|
|
@ -213,6 +214,32 @@ DataSizeOfVariable (
|
|||
IN VARIABLE_HEADER *Variable
|
||||
);
|
||||
|
||||
/**
|
||||
This function is to check if the remaining variable space is enough to set
|
||||
all Variables from argument list successfully. The purpose of the check
|
||||
is to keep the consistency of the Variables to be in variable storage.
|
||||
|
||||
Note: Variables are assumed to be in same storage.
|
||||
The set sequence of Variables will be same with the sequence of VariableEntry from argument list,
|
||||
so follow the argument sequence to check the Variables.
|
||||
|
||||
@param[in] Attributes Variable attributes for Variable entries.
|
||||
@param ... The variable argument list with type VARIABLE_ENTRY_CONSISTENCY *.
|
||||
A NULL terminates the list. The VariableSize of
|
||||
VARIABLE_ENTRY_CONSISTENCY is the variable data size as input.
|
||||
It will be changed to variable total size as output.
|
||||
|
||||
@retval TRUE Have enough variable space to set the Variables successfully.
|
||||
@retval FALSE No enough variable space to set the Variables successfully.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
CheckRemainingSpaceForConsistency (
|
||||
IN UINT32 Attributes,
|
||||
...
|
||||
);
|
||||
|
||||
/**
|
||||
Update the variable region with Variable information. If EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS is set,
|
||||
index of associated public key is needed.
|
||||
|
|
@ -556,6 +583,34 @@ VariableServiceSetVariable (
|
|||
IN VOID *Data
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
This code returns information about the EFI variables.
|
||||
|
||||
Caution: This function may receive untrusted input.
|
||||
This function may be invoked in SMM mode. This function will do basic validation, before parse the data.
|
||||
|
||||
@param Attributes Attributes bitmask to specify the type of variables
|
||||
on which to return information.
|
||||
@param MaximumVariableStorageSize Pointer to the maximum size of the storage space available
|
||||
for the EFI variables associated with the attributes specified.
|
||||
@param RemainingVariableStorageSize Pointer to the remaining size of the storage space available
|
||||
for EFI variables associated with the attributes specified.
|
||||
@param MaximumVariableSize Pointer to the maximum size of an individual EFI variables
|
||||
associated with the attributes specified.
|
||||
|
||||
@return EFI_SUCCESS Query successfully.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VariableServiceQueryVariableInfoInternal (
|
||||
IN UINT32 Attributes,
|
||||
OUT UINT64 *MaximumVariableStorageSize,
|
||||
OUT UINT64 *RemainingVariableStorageSize,
|
||||
OUT UINT64 *MaximumVariableSize
|
||||
);
|
||||
|
||||
/**
|
||||
|
||||
This code returns information about the EFI variables.
|
||||
|
|
|
|||
|
|
@ -98,7 +98,8 @@
|
|||
gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize
|
||||
|
||||
[FeaturePcd]
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## SOMETIME_CONSUMES (statistic the information of variable.)
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## CONSUMES # statistic the information of variable.
|
||||
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate ## CONSUMES
|
||||
|
||||
[Depex]
|
||||
gEfiFirmwareVolumeBlockProtocolGuid AND gEfiFaultTolerantWriteProtocolGuid
|
||||
|
|
|
|||
|
|
@ -101,7 +101,8 @@
|
|||
gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize
|
||||
|
||||
[FeaturePcd]
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## SOMETIME_CONSUMES (statistic the information of variable.)
|
||||
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## CONSUMES # statistic the information of variable.
|
||||
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate ## CONSUMES
|
||||
|
||||
[Depex]
|
||||
TRUE
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue