/** @file\r
\r
Implement ReadOnly Variable Services required by PEIM and install\r
- PI ReadOnly Varaiable2 PPI. These services operates the non volatile storage space.\r
+ PEI ReadOnly Varaiable2 PPI. These services operates the non volatile storage space.\r
\r
Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
All rights reserved. This program and the accompanying materials\r
//\r
// Module globals\r
//\r
-static EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariablePpi = {\r
+EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariablePpi = {\r
PeiGetVariable,\r
PeiGetNextVariableName\r
};\r
\r
-static EFI_PEI_PPI_DESCRIPTOR mPpiListVariable = {\r
+EFI_PEI_PPI_DESCRIPTOR mPpiListVariable = {\r
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
&gEfiPeiReadOnlyVariable2PpiGuid,\r
&mVariablePpi\r
\r
EFI_GUID mEfiVariableIndexTableGuid = EFI_VARIABLE_INDEX_TABLE_GUID;\r
\r
+\r
+/**\r
+ Provide the functionality of the variable services.\r
+ \r
+ @param FileHandle Handle of the file being invoked. \r
+ Type EFI_PEI_FILE_HANDLE is defined in FfsFindNextFile().\r
+ @param PeiServices General purpose services available to every PEIM.\r
+\r
+ @retval EFI_SUCCESS If the interface could be successfully installed\r
+ @retval Others Returned from PeiServicesInstallPpi()\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PeimInitializeVariableServices (\r
- IN EFI_FFS_FILE_HEADER *FfsHeader,\r
- IN EFI_PEI_SERVICES **PeiServices\r
+ IN EFI_PEI_FILE_HANDLE FileHandle,\r
+ IN CONST EFI_PEI_SERVICES **PeiServices\r
)\r
-/*++\r
-\r
-Routine Description:\r
+{\r
+ EFI_BOOT_MODE BootMode;\r
+ EFI_STATUS Status;\r
\r
- Provide the functionality of the variable services.\r
+ //\r
+ // Check if this is recovery boot path. If no, publish the variable access capability\r
+ // to other modules. If yes, the content of variable area is not reliable. Therefore,\r
+ // in this case we should not provide variable service to other pei modules. \r
+ // \r
+ Status = (*PeiServices)->GetBootMode (PeiServices, &BootMode);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ if (BootMode == BOOT_IN_RECOVERY_MODE) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
\r
-Arguments:\r
+ return PeiServicesInstallPpi (&mPpiListVariable);\r
\r
- FfsHeadher - The FFS file header\r
- PeiServices - General purpose services available to every PEIM.\r
+}\r
\r
-Returns:\r
+/**\r
\r
- Status - EFI_SUCCESS if the interface could be successfully\r
- installed\r
+ Gets the pointer to the first variable header in given variable store area.\r
\r
---*/\r
-{\r
- //\r
- // Publish the variable capability to other modules\r
- //\r
- return (**PeiServices).InstallPpi ((CONST EFI_PEI_SERVICES **)PeiServices, &mPpiListVariable);\r
+ @param VarStoreHeader Pointer to the Variable Store Header.\r
\r
-}\r
+ @return Pointer to the first variable header\r
\r
+**/\r
VARIABLE_HEADER *\r
GetStartPointer (\r
IN VARIABLE_STORE_HEADER *VarStoreHeader\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This code gets the pointer to the first variable memory pointer byte\r
-\r
-Arguments:\r
-\r
- VarStoreHeader Pointer to the Variable Store Header.\r
-\r
-Returns:\r
-\r
- VARIABLE_HEADER* Pointer to last unavailable Variable Header\r
-\r
---*/\r
{\r
//\r
// The end of variable store\r
return (VARIABLE_HEADER *) HEADER_ALIGN (VarStoreHeader + 1);\r
}\r
\r
-VARIABLE_HEADER *\r
-GetEndPointer (\r
- IN VARIABLE_STORE_HEADER *VarStoreHeader\r
- )\r
-/*++\r
-\r
-Routine Description:\r
\r
- This code gets the pointer to the last variable memory pointer byte\r
+/**\r
+ This code gets the pointer to the last variable memory pointer byte.\r
\r
-Arguments:\r
+ @param VarStoreHeader Pointer to the Variable Store Header.\r
\r
- VarStoreHeader Pointer to the Variable Store Header.\r
+ @return VARIABLE_HEADER* pointer to last unavailable Variable Header.\r
\r
-Returns:\r
-\r
- VARIABLE_HEADER* Pointer to last unavailable Variable Header\r
-\r
---*/\r
+**/\r
+VARIABLE_HEADER *\r
+GetEndPointer (\r
+ IN VARIABLE_STORE_HEADER *VarStoreHeader\r
+ )\r
{\r
//\r
// The end of variable store\r
return (VARIABLE_HEADER *) HEADER_ALIGN ((UINTN) VarStoreHeader + VarStoreHeader->Size);\r
}\r
\r
-STATIC\r
-BOOLEAN\r
-EFIAPI\r
-IsValidVariableHeader (\r
- IN VARIABLE_HEADER *Variable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
\r
+/**\r
This code checks if variable header is valid or not.\r
\r
-Arguments:\r
- Variable Pointer to the Variable Header.\r
+ @param Variable Pointer to the Variable Header.\r
\r
-Returns:\r
- TRUE Variable header is valid.\r
- FALSE Variable header is not valid.\r
+ @retval TRUE Variable header is valid.\r
+ @retval FALSE Variable header is not valid.\r
\r
---*/\r
+**/\r
+BOOLEAN\r
+IsValidVariableHeader (\r
+ IN VARIABLE_HEADER *Variable\r
+ )\r
{\r
if (Variable == NULL || Variable->StartId != VARIABLE_DATA ) {\r
return FALSE;\r
}\r
\r
\r
-UINTN\r
-NameSizeOfVariable (\r
- IN VARIABLE_HEADER *Variable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
This code gets the size of name of variable.\r
\r
-Arguments:\r
+ @param Variable Pointer to the Variable Header.\r
\r
- Variable Pointer to the Variable Header.\r
+ @return Size of variable in bytes in type UINTN.\r
\r
-Returns:\r
-\r
- UINTN Size of variable in bytes\r
-\r
---*/\r
+**/\r
+UINTN\r
+NameSizeOfVariable (\r
+ IN VARIABLE_HEADER *Variable\r
+ )\r
{\r
if (Variable->State == (UINT8) (-1) ||\r
- Variable->DataSize == (UINT32) -1 ||\r
- Variable->NameSize == (UINT32) -1 ||\r
- Variable->Attributes == (UINT32) -1) {\r
+ Variable->DataSize == (UINT32) (-1) ||\r
+ Variable->NameSize == (UINT32) (-1) ||\r
+ Variable->Attributes == (UINT32) (-1)) {\r
return 0;\r
}\r
return (UINTN) Variable->NameSize;\r
}\r
\r
-UINTN\r
-DataSizeOfVariable (\r
- IN VARIABLE_HEADER *Variable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
\r
- This code gets the size of name of variable.\r
-\r
-Arguments:\r
-\r
- Variable Pointer to the Variable Header.\r
+/**\r
+ This code gets the size of data of variable.\r
\r
-Returns:\r
+ @param Variable Pointer to the Variable Header.\r
\r
- UINTN Size of variable in bytes\r
+ @return Size of variable in bytes in type UINTN.\r
\r
---*/\r
+**/\r
+UINTN\r
+DataSizeOfVariable (\r
+ IN VARIABLE_HEADER *Variable\r
+ )\r
{\r
- if (Variable->State == (UINT8) -1 ||\r
- Variable->DataSize == (UINT32) -1 ||\r
- Variable->NameSize == (UINT32) -1 ||\r
- Variable->Attributes == (UINT32) -1) {\r
+ if (Variable->State == (UINT8) (-1) ||\r
+ Variable->DataSize == (UINT32) (-1) ||\r
+ Variable->NameSize == (UINT32) (-1) ||\r
+ Variable->Attributes == (UINT32) (-1)) {\r
return 0;\r
}\r
return (UINTN) Variable->DataSize;\r
}\r
\r
-CHAR16 *\r
-GetVariableNamePtr (\r
- IN VARIABLE_HEADER *Variable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
This code gets the pointer to the variable name.\r
\r
-Arguments:\r
-\r
- Variable Pointer to the Variable Header.\r
+ @param Variable Pointer to the Variable Header.\r
\r
-Returns:\r
+ @return A CHAR16* pointer to Variable Name.\r
\r
- CHAR16* Pointer to Variable Name\r
-\r
---*/\r
+**/\r
+CHAR16 *\r
+GetVariableNamePtr (\r
+ IN VARIABLE_HEADER *Variable\r
+ )\r
{\r
\r
return (CHAR16 *) (Variable + 1);\r
}\r
\r
\r
-UINT8 *\r
-GetVariableDataPtr (\r
- IN VARIABLE_HEADER *Variable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
+/**\r
This code gets the pointer to the variable data.\r
\r
-Arguments:\r
+ @param Variable Pointer to the Variable Header.\r
\r
- Variable Pointer to the Variable Header.\r
+ @return A UINT8* pointer to Variable Data.\r
\r
-Returns:\r
-\r
- UINT8* Pointer to Variable Data\r
-\r
---*/\r
+**/\r
+UINT8 *\r
+GetVariableDataPtr (\r
+ IN VARIABLE_HEADER *Variable\r
+ )\r
{\r
UINTN Value;\r
\r
return (UINT8 *) Value;\r
}\r
\r
-VARIABLE_HEADER *\r
-GetNextVariablePtr (\r
- IN VARIABLE_HEADER *Variable\r
- )\r
-/*++\r
-\r
-Routine Description:\r
\r
+/**\r
This code gets the pointer to the next variable header.\r
\r
-Arguments:\r
+ @param Variable Pointer to the Variable Header.\r
\r
- Variable Pointer to the Variable Header.\r
+ @return A VARIABLE_HEADER* pointer to next variable header.\r
\r
-Returns:\r
-\r
- VARIABLE_HEADER* Pointer to next variable header.\r
-\r
---*/\r
+**/\r
+VARIABLE_HEADER *\r
+GetNextVariablePtr (\r
+ IN VARIABLE_HEADER *Variable\r
+ )\r
{\r
UINTN Value;\r
\r
return (VARIABLE_HEADER *) HEADER_ALIGN (Value);\r
}\r
\r
+/**\r
+ This code gets the pointer to the variable name.\r
+\r
+ @param VarStoreHeader Pointer to the Variable Store Header.\r
\r
-STATIC\r
+ @retval EfiRaw Variable store is raw\r
+ @retval EfiValid Variable store is valid\r
+ @retval EfiInvalid Variable store is invalid\r
+\r
+**/\r
VARIABLE_STORE_STATUS\r
-EFIAPI\r
GetVariableStoreStatus (\r
IN VARIABLE_STORE_HEADER *VarStoreHeader\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This code gets the pointer to the variable name.\r
-\r
-Arguments:\r
-\r
- VarStoreHeader Pointer to the Variable Store Header.\r
-\r
-Returns:\r
-\r
- EfiRaw Variable store is raw\r
- EfiValid Variable store is valid\r
- EfiInvalid Variable store is invalid\r
-\r
---*/\r
{\r
- if (VarStoreHeader->Signature == VARIABLE_STORE_SIGNATURE &&\r
+ \r
+ if (CompareGuid (&VarStoreHeader->Signature, &gEfiVariableGuid) &&\r
VarStoreHeader->Format == VARIABLE_STORE_FORMATTED &&\r
VarStoreHeader->State == VARIABLE_STORE_HEALTHY\r
) {\r
return EfiValid;\r
}\r
\r
- if (VarStoreHeader->Signature == 0xffffffff &&\r
+ if (((UINT32 *)(&VarStoreHeader->Signature))[0] == 0xffffffff &&\r
+ ((UINT32 *)(&VarStoreHeader->Signature))[1] == 0xffffffff &&\r
+ ((UINT32 *)(&VarStoreHeader->Signature))[2] == 0xffffffff &&\r
+ ((UINT32 *)(&VarStoreHeader->Signature))[3] == 0xffffffff &&\r
VarStoreHeader->Size == 0xffffffff &&\r
VarStoreHeader->Format == 0xff &&\r
VarStoreHeader->State == 0xff\r
}\r
}\r
\r
-STATIC\r
+\r
+/**\r
+ This function compares a variable with variable entries in database.\r
+\r
+ @param Variable Pointer to the variable in our database\r
+ @param VariableName Name of the variable to compare to 'Variable'\r
+ @param VendorGuid GUID of the variable to compare to 'Variable'\r
+ @param PtrTrack Variable Track Pointer structure that contains Variable Information.\r
+\r
+ @retval EFI_SUCCESS Found match variable\r
+ @retval EFI_NOT_FOUND Variable not found\r
+\r
+**/\r
EFI_STATUS\r
CompareWithValidVariable (\r
IN VARIABLE_HEADER *Variable,\r
IN CONST EFI_GUID *VendorGuid,\r
OUT VARIABLE_POINTER_TRACK *PtrTrack\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This function compares a variable with variable entries in database\r
-\r
-Arguments:\r
-\r
- Variable - Pointer to the variable in our database\r
- VariableName - Name of the variable to compare to 'Variable'\r
- VendorGuid - GUID of the variable to compare to 'Variable'\r
- PtrTrack - Variable Track Pointer structure that contains\r
- Variable Information.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Found match variable\r
- EFI_NOT_FOUND - Variable not found\r
-\r
---*/\r
{\r
VOID *Point;\r
\r
) {\r
ASSERT (NameSizeOfVariable (Variable) != 0);\r
Point = (VOID *) GetVariableNamePtr (Variable);\r
- if (!CompareMem (VariableName, Point, NameSizeOfVariable (Variable))) {\r
+ if (CompareMem (VariableName, Point, NameSizeOfVariable (Variable)) == 0) {\r
PtrTrack->CurrPtr = Variable;\r
return EFI_SUCCESS;\r
}\r
return EFI_NOT_FOUND;\r
}\r
\r
-STATIC\r
+\r
+/**\r
+ This code finds variable in storage blocks (Non-Volatile).\r
+\r
+ @param PeiServices General purpose services available to every PEIM.\r
+ @param VariableName Name of the variable to be found\r
+ @param VendorGuid Vendor GUID to be found.\r
+ @param PtrTrack Variable Track Pointer structure that contains Variable Information.\r
+\r
+ @retval EFI_SUCCESS Variable found successfully\r
+ @retval EFI_NOT_FOUND Variable not found\r
+ @retval EFI_INVALID_PARAMETER Invalid variable name\r
+\r
+**/\r
EFI_STATUS\r
-EFIAPI\r
FindVariable (\r
IN CONST EFI_PEI_SERVICES **PeiServices,\r
IN CONST CHAR16 *VariableName,\r
IN CONST EFI_GUID *VendorGuid,\r
OUT VARIABLE_POINTER_TRACK *PtrTrack\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- This code finds variable in storage blocks (Non-Volatile)\r
-\r
-Arguments:\r
-\r
- PeiServices - General purpose services available to every PEIM.\r
- VariableName - Name of the variable to be found\r
- VendorGuid - Vendor GUID to be found.\r
- PtrTrack - Variable Track Pointer structure that contains\r
- Variable Information.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - Variable found successfully\r
- EFI_NOT_FOUND - Variable not found\r
- EFI_INVALID_PARAMETER - Invalid variable name\r
-\r
---*/\r
{\r
EFI_HOB_GUID_TYPE *GuidHob;\r
VARIABLE_STORE_HEADER *VariableStoreHeader;\r
VARIABLE_HEADER *Variable;\r
+ VARIABLE_HEADER *LastVariable;\r
VARIABLE_HEADER *MaxIndex;\r
VARIABLE_INDEX_TABLE *IndexTable;\r
UINT32 Count;\r
+ UINT32 Offset;\r
UINT8 *VariableBase;\r
+ BOOLEAN StopRecord;\r
\r
- if (VariableName != 0 && VendorGuid == NULL) {\r
+ if (VariableName[0] != 0 && VendorGuid == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
//\r
// No Variable Address equals zero, so 0 as initial value is safe.\r
//\r
MaxIndex = 0;\r
+ StopRecord = FALSE;\r
\r
GuidHob = GetFirstGuidHob (&mEfiVariableIndexTableGuid);\r
if (GuidHob == NULL) {\r
+ //\r
+ // If it's the first time to access variable region in flash, create a guid hob to record\r
+ // VAR_ADDED type variable info.\r
+ // Note that as the resource of PEI phase is limited, only store the number of \r
+ // VARIABLE_INDEX_TABLE_VOLUME of VAR_ADDED type variables to reduce access time.\r
+ //\r
IndexTable = BuildGuidHob (&mEfiVariableIndexTableGuid, sizeof (VARIABLE_INDEX_TABLE));\r
IndexTable->Length = 0;\r
IndexTable->StartPtr = NULL;\r
IndexTable->GoneThrough = 0;\r
} else {\r
IndexTable = GET_GUID_HOB_DATA (GuidHob);\r
- for (Count = 0; Count < IndexTable->Length; Count++)\r
- {\r
- MaxIndex = GetVariableByIndex (IndexTable, Count);\r
-\r
+ for (Offset = 0, Count = 0; Count < IndexTable->Length; Count++) {\r
+ //\r
+ // traverse the variable info list to look for varible.\r
+ // The IndexTable->Index[Count] records the distance of two neighbouring VAR_ADDED type variables.\r
+ //\r
+ ASSERT (Count < VARIABLE_INDEX_TABLE_VOLUME);\r
+ Offset += IndexTable->Index[Count];\r
+ MaxIndex = (VARIABLE_HEADER *)((CHAR8 *)(IndexTable->StartPtr) + Offset);\r
if (CompareWithValidVariable (MaxIndex, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) {\r
PtrTrack->StartPtr = IndexTable->StartPtr;\r
PtrTrack->EndPtr = IndexTable->EndPtr;\r
}\r
}\r
\r
- if (IndexTable->GoneThrough) {\r
+ if (IndexTable->GoneThrough != 0) {\r
return EFI_NOT_FOUND;\r
}\r
}\r
// If not found in HOB, then let's start from the MaxIndex we've found.\r
//\r
if (MaxIndex != NULL) {\r
- Variable = GetNextVariablePtr (MaxIndex);\r
+ Variable = GetNextVariablePtr (MaxIndex);\r
+ LastVariable = MaxIndex;\r
} else {\r
- if (IndexTable->StartPtr || IndexTable->EndPtr) {\r
+ if ((IndexTable->StartPtr != NULL) || (IndexTable->EndPtr != NULL)) {\r
Variable = IndexTable->StartPtr;\r
} else {\r
VariableBase = (UINT8 *) (UINTN) PcdGet32 (PcdFlashNvStorageVariableBase);\r
//\r
Variable = IndexTable->StartPtr;\r
}\r
+\r
+ LastVariable = IndexTable->StartPtr;\r
}\r
//\r
// Find the variable by walk through non-volatile variable store\r
PtrTrack->StartPtr = IndexTable->StartPtr;\r
PtrTrack->EndPtr = IndexTable->EndPtr;\r
\r
- while (IsValidVariableHeader (Variable) && (Variable <= IndexTable->EndPtr)) {\r
+ while ((Variable < IndexTable->EndPtr) && IsValidVariableHeader (Variable)) {\r
if (Variable->State == VAR_ADDED) {\r
//\r
// Record Variable in VariableIndex HOB\r
//\r
- if (IndexTable->Length < VARIABLE_INDEX_TABLE_VOLUME)\r
- {\r
- VariableIndexTableUpdate (IndexTable, Variable);\r
+ if (IndexTable->Length < VARIABLE_INDEX_TABLE_VOLUME && StopRecord != TRUE) {\r
+ Offset = (UINT32)((UINTN)Variable - (UINTN)LastVariable);\r
+ //\r
+ // The distance of two neighbouring VAR_ADDED variable is larger than 2^16, \r
+ // which is beyond the allowable scope(UINT16) of record. In such case, need not to\r
+ // record the subsequent VAR_ADDED type variables again.\r
+ //\r
+ if ((Offset & 0xFFFF0000UL) != 0) {\r
+ StopRecord = TRUE;\r
+ }\r
+\r
+ if (StopRecord != TRUE) {\r
+ IndexTable->Index[IndexTable->Length++] = (UINT16) Offset;\r
+ }\r
+ LastVariable = Variable;\r
}\r
\r
if (CompareWithValidVariable (Variable, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) {\r
return EFI_NOT_FOUND;\r
}\r
\r
+/**\r
+ This service retrieves a variable's value using its name and GUID.\r
+\r
+ Read the specified variable from the UEFI variable store. If the Data \r
+ buffer is too small to hold the contents of the variable, the error\r
+ EFI_BUFFER_TOO_SMALL is returned and DataSize is set to the required buffer\r
+ size to obtain the data.\r
+\r
+ @param This A pointer to this instance of the EFI_PEI_READ_ONLY_VARIABLE2_PPI.\r
+ @param VariableName A pointer to a null-terminated string that is the variable's name.\r
+ @param VariableGuid A pointer to an EFI_GUID that is the variable's GUID. The combination of\r
+ VariableGuid and VariableName must be unique.\r
+ @param Attributes If non-NULL, on return, points to the variable's attributes.\r
+ @param DataSize On entry, points to the size in bytes of the Data buffer.\r
+ On return, points to the size of the data returned in Data.\r
+ @param Data Points to the buffer which will hold the returned variable value.\r
+\r
+ @retval EFI_SUCCESS The variable was read successfully.\r
+ @retval EFI_NOT_FOUND The variable could not be found.\r
+ @retval EFI_BUFFER_TOO_SMALL The DataSize is too small for the resulting data. \r
+ DataSize is updated with the size required for \r
+ the specified variable.\r
+ @retval EFI_INVALID_PARAMETER VariableName, VariableGuid, DataSize or Data is NULL.\r
+ @retval EFI_DEVICE_ERROR The variable could not be retrieved because of a device error.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PeiGetVariable (\r
IN OUT UINTN *DataSize,\r
OUT VOID *Data\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Provide the read variable functionality of the variable services.\r
-\r
-Arguments:\r
-\r
- PeiServices - General purpose services available to every PEIM.\r
-\r
- VariableName - The variable name\r
-\r
- VendorGuid - The vendor's GUID\r
-\r
- Attributes - Pointer to the attribute\r
-\r
- DataSize - Size of data\r
-\r
- Data - Pointer to data\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The interface could be successfully installed\r
-\r
- EFI_NOT_FOUND - The variable could not be discovered\r
-\r
- EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough\r
-\r
---*/\r
{\r
VARIABLE_POINTER_TRACK Variable;\r
UINTN VarDataSize;\r
//\r
VarDataSize = DataSizeOfVariable (Variable.CurrPtr);\r
if (*DataSize >= VarDataSize) {\r
- //\r
- // PO-TKW: Address one checking in this place\r
- //\r
if (Data == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- (*PeiServices)->CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
+ CopyMem (Data, GetVariableDataPtr (Variable.CurrPtr), VarDataSize);\r
\r
if (Attributes != NULL) {\r
*Attributes = Variable.CurrPtr->Attributes;\r
}\r
}\r
\r
+/**\r
+ Return the next variable name and GUID.\r
+\r
+ This function is called multiple times to retrieve the VariableName \r
+ and VariableGuid of all variables currently available in the system. \r
+ On each call, the previous results are passed into the interface, \r
+ and, on return, the interface returns the data for the next \r
+ interface. When the entire variable list has been returned, \r
+ EFI_NOT_FOUND is returned.\r
+\r
+ @param This A pointer to this instance of the EFI_PEI_READ_ONLY_VARIABLE2_PPI.\r
+\r
+ @param VariableNameSize On entry, points to the size of the buffer pointed to by VariableName.\r
+ @param VariableName On entry, a pointer to a null-terminated string that is the variable's name.\r
+ On return, points to the next variable's null-terminated name string.\r
+ @param VariableGuid On entry, a pointer to an UEFI _GUID that is the variable's GUID. \r
+ On return, a pointer to the next variable's GUID.\r
+\r
+ @retval EFI_SUCCESS The variable was read successfully.\r
+ @retval EFI_NOT_FOUND The variable could not be found.\r
+ @retval EFI_BUFFER_TOO_SMALL The VariableNameSize is too small for the resulting\r
+ data. VariableNameSize is updated with the size\r
+ required for the specified variable.\r
+ @retval EFI_INVALID_PARAMETER VariableName, VariableGuid or\r
+ VariableNameSize is NULL.\r
+ @retval EFI_DEVICE_ERROR The variable could not be retrieved because of a device error.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
PeiGetNextVariableName (\r
IN OUT CHAR16 *VariableName,\r
IN OUT EFI_GUID *VariableGuid\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Provide the get next variable functionality of the variable services.\r
-\r
-Arguments:\r
-\r
- PeiServices - General purpose services available to every PEIM.\r
- VariabvleNameSize - The variable name's size.\r
- VariableName - A pointer to the variable's name.\r
- VariableGuid - A pointer to the EFI_GUID structure.\r
-\r
- VariableNameSize - Size of the variable name\r
-\r
- VariableName - The variable name\r
-\r
- VendorGuid - The vendor's GUID\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - The interface could be successfully installed\r
-\r
- EFI_NOT_FOUND - The variable could not be discovered\r
-\r
---*/\r
{\r
VARIABLE_POINTER_TRACK Variable;\r
UINTN VarNameSize;\r
\r
VarNameSize = (UINTN) NameSizeOfVariable (Variable.CurrPtr);\r
if (VarNameSize <= *VariableNameSize) {\r
- (*PeiServices)->CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);\r
+ CopyMem (VariableName, GetVariableNamePtr (Variable.CurrPtr), VarNameSize);\r
\r
- (*PeiServices)->CopyMem (VariableGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID));\r
+ CopyMem (VariableGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID));\r
\r
Status = EFI_SUCCESS;\r
} else {\r