so follow the argument sequence to check the Variables.\r
\r
@param[in] Attributes Variable attributes for Variable entries.\r
- @param ... Variable argument list with type VARIABLE_ENTRY_CONSISTENCY *.\r
- A NULL terminates the list.\r
+ @param ... The variable argument list with type VARIABLE_ENTRY_CONSISTENCY *.\r
+ A NULL terminates the list. The VariableSize of \r
+ VARIABLE_ENTRY_CONSISTENCY is the variable data size as input.\r
+ It will be changed to variable total size as output.\r
\r
@retval TRUE Have enough variable space to set the Variables successfully.\r
@retval FALSE No enough variable space to set the Variables successfully.\r
VARIABLE_STORE_HEADER *VariableStoreHeader;\r
VARIABLE_POINTER_TRACK VariablePtrTrack;\r
VARIABLE_HEADER *NextVariable;\r
+ UINTN VarNameSize;\r
+ UINTN VarDataSize;\r
\r
//\r
// Non-Volatile related.\r
VA_START (Args, Attributes);\r
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);\r
while (VariableEntry != NULL) {\r
+ //\r
+ // Calculate variable total size.\r
+ //\r
+ VarNameSize = StrSize (VariableEntry->Name);\r
+ VarNameSize += GET_PAD_SIZE (VarNameSize);\r
+ VarDataSize = VariableEntry->VariableSize;\r
+ VarDataSize += GET_PAD_SIZE (VarDataSize);\r
+ VariableEntry->VariableSize = HEADER_ALIGN (sizeof (VARIABLE_HEADER) + VarNameSize + VarDataSize);\r
+\r
TotalNeededSize += VariableEntry->VariableSize;\r
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);\r
}\r
UINT32 Attributes;\r
VARIABLE_POINTER_TRACK Variable;\r
BOOLEAN SetLanguageCodes;\r
- UINTN VarNameSize;\r
- UINTN VarDataSize;\r
VARIABLE_ENTRY_CONSISTENCY VariableEntry[2];\r
\r
//\r
BestLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->LangCodes, Index, TRUE);\r
\r
//\r
- // Calculate the needed variable size for Lang variable.\r
+ // Check the variable space for both Lang and PlatformLang variable.\r
//\r
- VarNameSize = StrSize (EFI_LANG_VARIABLE_NAME);\r
- VarDataSize = ISO_639_2_ENTRY_SIZE + 1;\r
- VariableEntry[0].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize + GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);\r
- VariableEntry[0].VariableSize = HEADER_ALIGN (VariableEntry[0].VariableSize);\r
+ VariableEntry[0].VariableSize = ISO_639_2_ENTRY_SIZE + 1;\r
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;\r
VariableEntry[0].Name = EFI_LANG_VARIABLE_NAME;\r
- //\r
- // Calculate the needed variable size for PlatformLang variable.\r
- //\r
- VarNameSize = StrSize (EFI_PLATFORM_LANG_VARIABLE_NAME);\r
- VarDataSize = AsciiStrSize (BestPlatformLang);\r
- VariableEntry[1].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize + GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);\r
- VariableEntry[1].VariableSize = HEADER_ALIGN (VariableEntry[1].VariableSize);\r
+ \r
+ VariableEntry[1].VariableSize = AsciiStrSize (BestPlatformLang);\r
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;\r
VariableEntry[1].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;\r
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) {\r
BestPlatformLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->PlatformLangCodes, Index, FALSE);\r
\r
//\r
- // Calculate the needed variable size for PlatformLang variable.\r
+ // Check the variable space for both PlatformLang and Lang variable.\r
//\r
- VarNameSize = StrSize (EFI_PLATFORM_LANG_VARIABLE_NAME);\r
- VarDataSize = AsciiStrSize (BestPlatformLang);\r
- VariableEntry[0].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize + GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);\r
- VariableEntry[0].VariableSize = HEADER_ALIGN (VariableEntry[0].VariableSize);\r
+ VariableEntry[0].VariableSize = AsciiStrSize (BestPlatformLang);\r
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;\r
VariableEntry[0].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;\r
- //\r
- // Calculate the needed variable size for Lang variable.\r
- //\r
- VarNameSize = StrSize (EFI_LANG_VARIABLE_NAME);\r
- VarDataSize = ISO_639_2_ENTRY_SIZE + 1;\r
- VariableEntry[1].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize + GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);\r
- VariableEntry[1].VariableSize = HEADER_ALIGN (VariableEntry[1].VariableSize);\r
+\r
+ VariableEntry[1].VariableSize = ISO_639_2_ENTRY_SIZE + 1;\r
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;\r
VariableEntry[1].Name = EFI_LANG_VARIABLE_NAME;\r
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) {\r
typedef struct {\r
EFI_GUID *Guid;\r
CHAR16 *Name;\r
-// UINT32 Attributes;\r
- //\r
- // Variable size include variable header, name and data.\r
- //\r
UINTN VariableSize;\r
} VARIABLE_ENTRY_CONSISTENCY;\r
\r
**/\r
UINT32\r
AddPubKeyInStore (\r
- IN UINT8 *PubKey\r
+ IN UINT8 *PubKey,\r
+ IN VARIABLE_ENTRY_CONSISTENCY *VariableDataEntry\r
)\r
{\r
- EFI_STATUS Status;\r
- BOOLEAN IsFound;\r
- UINT32 Index;\r
- VARIABLE_POINTER_TRACK Variable;\r
- UINT8 *Ptr;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
+ EFI_STATUS Status;\r
+ BOOLEAN IsFound;\r
+ UINT32 Index;\r
+ VARIABLE_POINTER_TRACK Variable;\r
+ UINT8 *Ptr;\r
+ UINT8 *Data;\r
+ UINTN DataSize;\r
+ VARIABLE_ENTRY_CONSISTENCY PublicKeyEntry;\r
+ UINT32 Attributes;\r
\r
if (PubKey == NULL) {\r
return 0;\r
} \r
}\r
\r
+ //\r
+ // Check the variable space for both public key and variable data.\r
+ //\r
+ PublicKeyEntry.VariableSize = (mPubKeyNumber + 1) * EFI_CERT_TYPE_RSA2048_SIZE;\r
+ PublicKeyEntry.Guid = &gEfiAuthenticatedVariableGuid;\r
+ PublicKeyEntry.Name = AUTHVAR_KEYDB_NAME;\r
+ Attributes = VARIABLE_ATTRIBUTE_NV_BS_RT | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS;\r
+\r
+ if (!CheckRemainingSpaceForConsistency (Attributes, &PublicKeyEntry, VariableDataEntry, NULL)) {\r
+ //\r
+ // No enough variable space.\r
+ //\r
+ return 0;\r
+ }\r
+\r
CopyMem (mPubKeyStore + mPubKeyNumber * EFI_CERT_TYPE_RSA2048_SIZE, PubKey, EFI_CERT_TYPE_RSA2048_SIZE);\r
Index = ++mPubKeyNumber;\r
//\r
&gEfiAuthenticatedVariableGuid,\r
mPubKeyStore,\r
mPubKeyNumber * EFI_CERT_TYPE_RSA2048_SIZE,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS,\r
+ Attributes,\r
0,\r
0,\r
&Variable,\r
EFI_CERT_BLOCK_RSA_2048_SHA256 *CertBlock;\r
UINT32 KeyIndex;\r
UINT64 MonotonicCount;\r
+ VARIABLE_ENTRY_CONSISTENCY VariableDataEntry;\r
\r
KeyIndex = 0;\r
CertData = NULL;\r
// Now, the signature has been verified!\r
//\r
if (IsFirstTime && !IsDeletion) {\r
+ VariableDataEntry.VariableSize = DataSize - AUTHINFO_SIZE;\r
+ VariableDataEntry.Guid = VendorGuid;\r
+ VariableDataEntry.Name = VariableName;\r
+\r
//\r
// Update public key database variable if need.\r
//\r
- KeyIndex = AddPubKeyInStore (PubKey);\r
+ KeyIndex = AddPubKeyInStore (PubKey, &VariableDataEntry);\r
if (KeyIndex == 0) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
return FALSE;\r
}\r
\r
- Variable = GetStartPointer (mNvVariableCache);\r
+ Variable = GetStartPointer ((VARIABLE_STORE_HEADER *) (UINTN) mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase);\r
\r
while (IsValidVariableHeader (Variable)) {\r
if ((Variable->State == VAR_ADDED || Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) && \r
so follow the argument sequence to check the Variables.\r
\r
@param[in] Attributes Variable attributes for Variable entries.\r
- @param ... Variable argument list with type VARIABLE_ENTRY_CONSISTENCY *.\r
- A NULL terminates the list.\r
+ @param ... The variable argument list with type VARIABLE_ENTRY_CONSISTENCY *.\r
+ A NULL terminates the list. The VariableSize of \r
+ VARIABLE_ENTRY_CONSISTENCY is the variable data size as input.\r
+ It will be changed to variable total size as output.\r
\r
@retval TRUE Have enough variable space to set the Variables successfully.\r
@retval FALSE No enough variable space to set the Variables successfully.\r
VARIABLE_STORE_HEADER *VariableStoreHeader;\r
VARIABLE_POINTER_TRACK VariablePtrTrack;\r
VARIABLE_HEADER *NextVariable;\r
+ UINTN VarNameSize;\r
+ UINTN VarDataSize;\r
\r
//\r
// Non-Volatile related.\r
VA_START (Args, Attributes);\r
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);\r
while (VariableEntry != NULL) {\r
+ //\r
+ // Calculate variable total size.\r
+ //\r
+ VarNameSize = StrSize (VariableEntry->Name);\r
+ VarNameSize += GET_PAD_SIZE (VarNameSize);\r
+ VarDataSize = VariableEntry->VariableSize;\r
+ VarDataSize += GET_PAD_SIZE (VarDataSize);\r
+ VariableEntry->VariableSize = HEADER_ALIGN (sizeof (VARIABLE_HEADER) + VarNameSize + VarDataSize);\r
+\r
TotalNeededSize += VariableEntry->VariableSize;\r
VariableEntry = VA_ARG (Args, VARIABLE_ENTRY_CONSISTENCY *);\r
}\r
UINT32 Attributes;\r
VARIABLE_POINTER_TRACK Variable;\r
BOOLEAN SetLanguageCodes;\r
- UINTN VarNameSize;\r
- UINTN VarDataSize;\r
VARIABLE_ENTRY_CONSISTENCY VariableEntry[2];\r
\r
//\r
BestLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->LangCodes, Index, TRUE);\r
\r
//\r
- // Calculate the needed variable size for Lang variable.\r
+ // Check the variable space for both Lang and PlatformLang variable.\r
//\r
- VarNameSize = StrSize (EFI_LANG_VARIABLE_NAME);\r
- VarDataSize = ISO_639_2_ENTRY_SIZE + 1;\r
- VariableEntry[0].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize + GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);\r
- VariableEntry[0].VariableSize = HEADER_ALIGN (VariableEntry[0].VariableSize);\r
+ VariableEntry[0].VariableSize = ISO_639_2_ENTRY_SIZE + 1;\r
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;\r
VariableEntry[0].Name = EFI_LANG_VARIABLE_NAME;\r
- //\r
- // Calculate the needed variable size for PlatformLang variable.\r
- //\r
- VarNameSize = StrSize (EFI_PLATFORM_LANG_VARIABLE_NAME);\r
- VarDataSize = AsciiStrSize (BestPlatformLang);\r
- VariableEntry[1].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize + GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);\r
- VariableEntry[1].VariableSize = HEADER_ALIGN (VariableEntry[1].VariableSize);\r
+ \r
+ VariableEntry[1].VariableSize = AsciiStrSize (BestPlatformLang);\r
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;\r
VariableEntry[1].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;\r
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) {\r
BestPlatformLang = GetLangFromSupportedLangCodes (mVariableModuleGlobal->PlatformLangCodes, Index, FALSE);\r
\r
//\r
- // Calculate the needed variable size for PlatformLang variable.\r
+ // Check the variable space for both PlatformLang and Lang variable.\r
//\r
- VarNameSize = StrSize (EFI_PLATFORM_LANG_VARIABLE_NAME);\r
- VarDataSize = AsciiStrSize (BestPlatformLang);\r
- VariableEntry[0].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize + GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);\r
- VariableEntry[0].VariableSize = HEADER_ALIGN (VariableEntry[0].VariableSize);\r
+ VariableEntry[0].VariableSize = AsciiStrSize (BestPlatformLang);\r
VariableEntry[0].Guid = &gEfiGlobalVariableGuid;\r
VariableEntry[0].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;\r
- //\r
- // Calculate the needed variable size for Lang variable.\r
- //\r
- VarNameSize = StrSize (EFI_LANG_VARIABLE_NAME);\r
- VarDataSize = ISO_639_2_ENTRY_SIZE + 1;\r
- VariableEntry[1].VariableSize = sizeof (VARIABLE_HEADER) + VarNameSize + GET_PAD_SIZE (VarNameSize) + VarDataSize + GET_PAD_SIZE (VarDataSize);\r
- VariableEntry[1].VariableSize = HEADER_ALIGN (VariableEntry[1].VariableSize);\r
+\r
+ VariableEntry[1].VariableSize = ISO_639_2_ENTRY_SIZE + 1;\r
VariableEntry[1].Guid = &gEfiGlobalVariableGuid;\r
VariableEntry[1].Name = EFI_LANG_VARIABLE_NAME;\r
if (!CheckRemainingSpaceForConsistency (VARIABLE_ATTRIBUTE_NV_BS_RT, &VariableEntry[0], &VariableEntry[1], NULL)) {\r
typedef struct {\r
EFI_GUID *Guid;\r
CHAR16 *Name;\r
-// UINT32 Attributes;\r
- //\r
- // Variable size include variable header, name and data.\r
- //\r
UINTN VariableSize;\r
} VARIABLE_ENTRY_CONSISTENCY;\r
\r
IN VARIABLE_HEADER *Variable\r
);\r
\r
+/**\r
+ This function is to check if the remaining variable space is enough to set\r
+ all Variables from argument list successfully. The purpose of the check\r
+ is to keep the consistency of the Variables to be in variable storage.\r
+\r
+ Note: Variables are assumed to be in same storage.\r
+ The set sequence of Variables will be same with the sequence of VariableEntry from argument list,\r
+ so follow the argument sequence to check the Variables.\r
+\r
+ @param[in] Attributes Variable attributes for Variable entries.\r
+ @param ... The variable argument list with type VARIABLE_ENTRY_CONSISTENCY *.\r
+ A NULL terminates the list. The VariableSize of \r
+ VARIABLE_ENTRY_CONSISTENCY is the variable data size as input.\r
+ It will be changed to variable total size as output.\r
+\r
+ @retval TRUE Have enough variable space to set the Variables successfully.\r
+ @retval FALSE No enough variable space to set the Variables successfully.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+CheckRemainingSpaceForConsistency (\r
+ IN UINT32 Attributes,\r
+ ...\r
+ );\r
+ \r
/**\r
Update the variable region with Variable information. If EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS is set,\r
index of associated public key is needed.\r