From 7ba905c909915ffaf66f116e5f894061c7f0ebe9 Mon Sep 17 00:00:00 2001 From: klu2 Date: Mon, 13 Aug 2007 08:37:06 +0000 Subject: [PATCH] Add VariablePei into IntelFrameworkModulePkg git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3624 6f19259b-4bc3-4df7-8a09-765794883524 --- .../IntelFrameworkModulePkg.dsc | 1 + .../VariablePei/Ipf/VariableWorker.c | 57 ++ .../Universal/VariablePei/Variable.c | 626 ++++++++++++++++++ .../Universal/VariablePei/Variable.h | 266 ++++++++ .../Universal/VariablePei/VariablePei.inf | 112 ++++ .../Universal/VariablePei/VariablePei.msa | 76 +++ .../Universal/VariablePei/VariableWorker.c | 63 ++ 7 files changed, 1201 insertions(+) create mode 100644 IntelFrameworkModulePkg/Universal/VariablePei/Ipf/VariableWorker.c create mode 100644 IntelFrameworkModulePkg/Universal/VariablePei/Variable.c create mode 100644 IntelFrameworkModulePkg/Universal/VariablePei/Variable.h create mode 100644 IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.inf create mode 100644 IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.msa create mode 100644 IntelFrameworkModulePkg/Universal/VariablePei/VariableWorker.c diff --git a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc index 544f22b7cd..4d52381149 100644 --- a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc +++ b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc @@ -177,6 +177,7 @@ IntelFrameworkModulePkg/Universal/DriverSampleDxe/DriverSampleDxe.inf IntelFrameworkModulePkg/Universal/Console/VgaClassDxe/VgaClassDxe.inf IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PcatSingleSegmentPciCfgPei.inf + IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.inf IntelFrameworkModulePkg/Bus/Pci/VgaMiniPortDxe/VgaMiniPortDxe.inf IntelFrameworkModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf diff --git a/IntelFrameworkModulePkg/Universal/VariablePei/Ipf/VariableWorker.c b/IntelFrameworkModulePkg/Universal/VariablePei/Ipf/VariableWorker.c new file mode 100644 index 0000000000..0a4ee95774 --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/VariablePei/Ipf/VariableWorker.c @@ -0,0 +1,57 @@ +/** @file + Variable worker functions. + + Copyright (c) 2006, Intel Corporation
+ All rights reserved. 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. + +**/ + +#include + + +/** + Get one variable by the index count. + + @param IndexTable The pointer to variable index table. + @param Count The index count of variable in index table. + + @return The pointer to variable header indexed by count. + +**/ +VARIABLE_HEADER * +GetVariableByIndex ( + IN VARIABLE_INDEX_TABLE *IndexTable, + IN UINT32 Count + ) +{ + return (VARIABLE_HEADER *) (UINTN) ((((UINT32)IndexTable->Index[Count]) << 2) + ((UINT32)(UINTN)IndexTable->StartPtr & 0xFFFC0000) ); +} + +/** + Record Variable in VariableIndex HOB. + + Record Variable in VariableIndex HOB and update the length of variable index table. + + @param IndexTable The pointer to variable index table. + @param Variable The pointer to the variable that will be recorded. + + @retval VOID + +**/ +VOID +VariableIndexTableUpdate ( + IN OUT VARIABLE_INDEX_TABLE *IndexTable, + IN VARIABLE_HEADER *Variable + ) +{ + IndexTable->Index[IndexTable->Length++] = (UINT16) (((UINT32)(UINTN) Variable) >> 2); + + return; +} + diff --git a/IntelFrameworkModulePkg/Universal/VariablePei/Variable.c b/IntelFrameworkModulePkg/Universal/VariablePei/Variable.c new file mode 100644 index 0000000000..99dfce6d8e --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/VariablePei/Variable.c @@ -0,0 +1,626 @@ +/*++ + +Copyright (c) 2006 - 2007 Intel Corporation.
+All rights reserved. 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. +Module Name: + + Variable.c + +Abstract: + + Framework PEIM to provide the Variable functionality + +--*/ + + +#include "Variable.h" + +// +// Module globals +// +static EFI_PEI_READ_ONLY_VARIABLE_PPI mVariablePpi = { + PeiGetVariable, + PeiGetNextVariableName +}; + +static EFI_PEI_READ_ONLY_VARIABLE2_PPI mVariable2Ppi = { + PeiGetVariable2, + PeiGetNextVariableName2 +}; + +static EFI_PEI_PPI_DESCRIPTOR mPpiListVariable[] = { + { + (EFI_PEI_PPI_DESCRIPTOR_PPI), + &gEfiPeiReadOnlyVariable2PpiGuid, + &mVariable2Ppi + }, + { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiPeiReadOnlyVariablePpiGuid, + &mVariablePpi + } +}; + +EFI_GUID mEfiVariableIndexTableGuid = EFI_VARIABLE_INDEX_TABLE_GUID; + +EFI_STATUS +EFIAPI +PeimInitializeVariableServices ( + IN EFI_FFS_FILE_HEADER *FfsHeader, + IN EFI_PEI_SERVICES **PeiServices + ) +/*++ + +Routine Description: + + Provide the functionality of the variable services. + +Arguments: + + FfsHeadher - The FFS file header + PeiServices - General purpose services available to every PEIM. + +Returns: + + Status - EFI_SUCCESS if the interface could be successfully + installed + +--*/ +{ + // + // Publish the variable capability to other modules + // + return (**PeiServices).InstallPpi (PeiServices, &mPpiListVariable[0]); + +} + +STATIC +VARIABLE_HEADER * +GetNextVariablePtr ( + IN VARIABLE_HEADER *Variable + ) +/*++ + +Routine Description: + + This code checks if variable header is valid or not. + +Arguments: + Variable Pointer to the Variable Header. + +Returns: + TRUE Variable header is valid. + FALSE Variable header is not valid. + +--*/ +{ + return (VARIABLE_HEADER *) ((UINTN) GET_VARIABLE_DATA_PTR (Variable) + Variable->DataSize + GET_PAD_SIZE (Variable->DataSize)); +} + +STATIC +BOOLEAN +EFIAPI +IsValidVariableHeader ( + IN VARIABLE_HEADER *Variable + ) +/*++ + +Routine Description: + + This code checks if variable header is valid or not. + +Arguments: + Variable Pointer to the Variable Header. + +Returns: + TRUE Variable header is valid. + FALSE Variable header is not valid. + +--*/ +{ + if (Variable == NULL || + Variable->StartId != VARIABLE_DATA || + (sizeof (VARIABLE_HEADER) + Variable->DataSize + Variable->NameSize) > MAX_VARIABLE_SIZE + ) { + return FALSE; + } + + return TRUE; +} + +STATIC +VARIABLE_STORE_STATUS +EFIAPI +GetVariableStoreStatus ( + IN VARIABLE_STORE_HEADER *VarStoreHeader + ) +/*++ + +Routine Description: + + This code gets the pointer to the variable name. + +Arguments: + + VarStoreHeader Pointer to the Variable Store Header. + +Returns: + + EfiRaw Variable store is raw + EfiValid Variable store is valid + EfiInvalid Variable store is invalid + +--*/ +{ + if (VarStoreHeader->Signature == VARIABLE_STORE_SIGNATURE && + VarStoreHeader->Format == VARIABLE_STORE_FORMATTED && + VarStoreHeader->State == VARIABLE_STORE_HEALTHY + ) { + + return EfiValid; + } + + if (VarStoreHeader->Signature == 0xffffffff && + VarStoreHeader->Size == 0xffffffff && + VarStoreHeader->Format == 0xff && + VarStoreHeader->State == 0xff + ) { + + return EfiRaw; + } else { + return EfiInvalid; + } +} + +STATIC +EFI_STATUS +CompareWithValidVariable ( + IN VARIABLE_HEADER *Variable, + IN CONST CHAR16 *VariableName, + IN CONST EFI_GUID *VendorGuid, + OUT VARIABLE_POINTER_TRACK *PtrTrack + ) +/*++ + +Routine Description: + + This function compares a variable with variable entries in database + +Arguments: + + Variable - Pointer to the variable in our database + VariableName - Name of the variable to compare to 'Variable' + VendorGuid - GUID of the variable to compare to 'Variable' + PtrTrack - Variable Track Pointer structure that contains + Variable Information. + +Returns: + + EFI_SUCCESS - Found match variable + EFI_NOT_FOUND - Variable not found + +--*/ +{ + if (VariableName[0] == 0) { + PtrTrack->CurrPtr = Variable; + return EFI_SUCCESS; + } else { + // + // Don't use CompareGuid function here for performance reasons. + // Instead we compare the GUID a UINT32 at a time and branch + // on the first failed comparison. + // + if ((((INT32 *) VendorGuid)[0] == ((INT32 *) &Variable->VendorGuid)[0]) && + (((INT32 *) VendorGuid)[1] == ((INT32 *) &Variable->VendorGuid)[1]) && + (((INT32 *) VendorGuid)[2] == ((INT32 *) &Variable->VendorGuid)[2]) && + (((INT32 *) VendorGuid)[3] == ((INT32 *) &Variable->VendorGuid)[3]) + ) { + if (!CompareMem (VariableName, GET_VARIABLE_NAME_PTR (Variable), Variable->NameSize)) { + PtrTrack->CurrPtr = Variable; + return EFI_SUCCESS; + } + } + } + + return EFI_NOT_FOUND; +} + +STATIC +EFI_STATUS +EFIAPI +FindVariable ( + IN EFI_PEI_SERVICES **PeiServices, + IN CONST CHAR16 *VariableName, + IN CONST EFI_GUID *VendorGuid, + OUT VARIABLE_POINTER_TRACK *PtrTrack + ) +/*++ + +Routine Description: + + This code finds variable in storage blocks (Non-Volatile) + +Arguments: + + PeiServices - General purpose services available to every PEIM. + VariableName - Name of the variable to be found + VendorGuid - Vendor GUID to be found. + PtrTrack - Variable Track Pointer structure that contains + Variable Information. + +Returns: + + EFI_SUCCESS - Variable found successfully + EFI_NOT_FOUND - Variable not found + EFI_INVALID_PARAMETER - Invalid variable name + +--*/ +{ + EFI_HOB_GUID_TYPE *GuidHob; + VARIABLE_STORE_HEADER *VariableStoreHeader; + VARIABLE_HEADER *Variable; + VARIABLE_HEADER *MaxIndex; + VARIABLE_INDEX_TABLE *IndexTable; + UINT32 Count; + UINT8 *VariableBase; + + if (VariableName != 0 && VendorGuid == NULL) { + return EFI_INVALID_PARAMETER; + } + // + // No Variable Address equals zero, so 0 as initial value is safe. + // + MaxIndex = 0; + + GuidHob = GetFirstGuidHob (&mEfiVariableIndexTableGuid); + if (GuidHob == NULL) { + IndexTable = BuildGuidHob (&mEfiVariableIndexTableGuid, sizeof (VARIABLE_INDEX_TABLE)); + IndexTable->Length = 0; + IndexTable->StartPtr = NULL; + IndexTable->EndPtr = NULL; + IndexTable->GoneThrough = 0; + } else { + IndexTable = GET_GUID_HOB_DATA (GuidHob); + for (Count = 0; Count < IndexTable->Length; Count++) + { + MaxIndex = GetVariableByIndex (IndexTable, Count); + + if (CompareWithValidVariable (MaxIndex, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) { + PtrTrack->StartPtr = IndexTable->StartPtr; + PtrTrack->EndPtr = IndexTable->EndPtr; + + return EFI_SUCCESS; + } + } + + if (IndexTable->GoneThrough) { + return EFI_NOT_FOUND; + } + } + // + // If not found in HOB, then let's start from the MaxIndex we've found. + // + if (MaxIndex != NULL) { + Variable = GetNextVariablePtr (MaxIndex); + } else { + if (IndexTable->StartPtr || IndexTable->EndPtr) { + Variable = IndexTable->StartPtr; + } else { + VariableBase = (UINT8 *) (UINTN) PcdGet32 (PcdFlashNvStorageVariableBase); + VariableStoreHeader = (VARIABLE_STORE_HEADER *) (VariableBase + \ + ((EFI_FIRMWARE_VOLUME_HEADER *) (VariableBase)) -> HeaderLength); + + if (GetVariableStoreStatus (VariableStoreHeader) != EfiValid) { + return EFI_UNSUPPORTED; + } + + if (~VariableStoreHeader->Size == 0) { + return EFI_NOT_FOUND; + } + // + // Find the variable by walk through non-volatile variable store + // + IndexTable->StartPtr = (VARIABLE_HEADER *) (VariableStoreHeader + 1); + IndexTable->EndPtr = (VARIABLE_HEADER *) ((UINTN) VariableStoreHeader + VariableStoreHeader->Size); + + // + // Start Pointers for the variable. + // Actual Data Pointer where data can be written. + // + Variable = IndexTable->StartPtr; + } + } + // + // Find the variable by walk through non-volatile variable store + // + PtrTrack->StartPtr = IndexTable->StartPtr; + PtrTrack->EndPtr = IndexTable->EndPtr; + + while (IsValidVariableHeader (Variable) && (Variable <= IndexTable->EndPtr)) { + if (Variable->State == VAR_ADDED) { + // + // Record Variable in VariableIndex HOB + // + if (IndexTable->Length < VARIABLE_INDEX_TABLE_VOLUME) + { + VariableIndexTableUpdate (IndexTable, Variable); + } + + if (CompareWithValidVariable (Variable, VariableName, VendorGuid, PtrTrack) == EFI_SUCCESS) { + return EFI_SUCCESS; + } + } + + Variable = GetNextVariablePtr (Variable); + } + // + // If gone through the VariableStore, that means we never find in Firmware any more. + // + if (IndexTable->Length < VARIABLE_INDEX_TABLE_VOLUME) { + IndexTable->GoneThrough = 1; + } + + PtrTrack->CurrPtr = NULL; + + return EFI_NOT_FOUND; +} + +EFI_STATUS +EFIAPI +PeiGetVariable ( + IN EFI_PEI_SERVICES **PeiServices, + IN CHAR16 *VariableName, + IN EFI_GUID * VendorGuid, + OUT UINT32 *Attributes OPTIONAL, + IN OUT UINTN *DataSize, + OUT VOID *Data + ) +/*++ + +Routine Description: + + Provide the read variable functionality of the variable services. + +Arguments: + + PeiServices - General purpose services available to every PEIM. + + VariableName - The variable name + + VendorGuid - The vendor's GUID + + Attributes - Pointer to the attribute + + DataSize - Size of data + + Data - Pointer to data + +Returns: + + EFI_SUCCESS - The interface could be successfully installed + + EFI_NOT_FOUND - The variable could not be discovered + + EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough + +--*/ +{ + VARIABLE_POINTER_TRACK Variable; + UINTN VarDataSize; + EFI_STATUS Status; + + if (VariableName == NULL || VendorGuid == NULL) { + return EFI_INVALID_PARAMETER; + } + // + // Find existing variable + // + Status = FindVariable (PeiServices, VariableName, VendorGuid, &Variable); + + if (Variable.CurrPtr == NULL || Status != EFI_SUCCESS) { + return Status; + } + // + // Get data size + // + VarDataSize = Variable.CurrPtr->DataSize; + if (*DataSize >= VarDataSize) { + (*PeiServices)->CopyMem (Data, GET_VARIABLE_DATA_PTR (Variable.CurrPtr), VarDataSize); + + if (Attributes != NULL) { + *Attributes = Variable.CurrPtr->Attributes; + } + + *DataSize = VarDataSize; + return EFI_SUCCESS; + } else { + *DataSize = VarDataSize; + return EFI_BUFFER_TOO_SMALL; + } +} + + +EFI_STATUS +EFIAPI +PeiGetVariable2 ( + IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This, + IN CONST CHAR16 *VariableName, + IN CONST EFI_GUID *VariableGuid, + OUT UINT32 *Attributes, + IN OUT UINTN *DataSize, + OUT VOID *Data + ) +/*++ + +Routine Description: + + Provide the read variable functionality of the variable services. + +Arguments: + + PeiServices - General purpose services available to every PEIM. + + VariableName - The variable name + + VendorGuid - The vendor's GUID + + Attributes - Pointer to the attribute + + DataSize - Size of data + + Data - Pointer to data + +Returns: + + EFI_SUCCESS - The interface could be successfully installed + + EFI_NOT_FOUND - The variable could not be discovered + + EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough + +--*/ +{ + return PeiGetVariable ( + GetPeiServicesTablePointer (), + (CHAR16*)VariableName, + (EFI_GUID*)VariableGuid, + Attributes, + DataSize, + Data + ); +} + +EFI_STATUS +EFIAPI +PeiGetNextVariableName ( + IN EFI_PEI_SERVICES **PeiServices, + IN OUT UINTN *VariableNameSize, + IN OUT CHAR16 *VariableName, + IN OUT EFI_GUID *VendorGuid + ) +/*++ + +Routine Description: + + Provide the get next variable functionality of the variable services. + +Arguments: + + PeiServices - General purpose services available to every PEIM. + VariabvleNameSize - The variable name's size. + VariableName - A pointer to the variable's name. + VendorGuid - A pointer to the EFI_GUID structure. + + VariableNameSize - Size of the variable name + + VariableName - The variable name + + VendorGuid - The vendor's GUID + +Returns: + + EFI_SUCCESS - The interface could be successfully installed + + EFI_NOT_FOUND - The variable could not be discovered + +--*/ +{ + VARIABLE_POINTER_TRACK Variable; + UINTN VarNameSize; + EFI_STATUS Status; + + if (VariableName == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = FindVariable (PeiServices, VariableName, VendorGuid, &Variable); + + if (Variable.CurrPtr == NULL || Status != EFI_SUCCESS) { + return Status; + } + + if (VariableName[0] != 0) { + // + // If variable name is not NULL, get next variable + // + Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr); + } + + while (!(Variable.CurrPtr >= Variable.EndPtr || Variable.CurrPtr == NULL)) { + if (IsValidVariableHeader (Variable.CurrPtr)) { + if (Variable.CurrPtr->State == VAR_ADDED) { + VarNameSize = (UINTN) Variable.CurrPtr->NameSize; + if (VarNameSize <= *VariableNameSize) { + (*PeiServices)->CopyMem (VariableName, GET_VARIABLE_NAME_PTR (Variable.CurrPtr), VarNameSize); + + (*PeiServices)->CopyMem (VendorGuid, &Variable.CurrPtr->VendorGuid, sizeof (EFI_GUID)); + + Status = EFI_SUCCESS; + } else { + Status = EFI_BUFFER_TOO_SMALL; + } + + *VariableNameSize = VarNameSize; + return Status; + // + // Variable is found + // + } else { + Variable.CurrPtr = GetNextVariablePtr (Variable.CurrPtr); + } + } else { + break; + } + } + + return EFI_NOT_FOUND; +} + +EFI_STATUS +EFIAPI +PeiGetNextVariableName2 ( + IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This, + IN OUT UINTN *VariableNameSize, + IN OUT CHAR16 *VariableName, + IN OUT EFI_GUID *VariableGuid + ) +/*++ + +Routine Description: + + Provide the get next variable functionality of the variable services. + +Arguments: + + PeiServices - General purpose services available to every PEIM. + VariabvleNameSize - The variable name's size. + VariableName - A pointer to the variable's name. + VariableGuid - A pointer to the EFI_GUID structure. + + VariableNameSize - Size of the variable name + + VariableName - The variable name + + VendorGuid - The vendor's GUID + +Returns: + + EFI_SUCCESS - The interface could be successfully installed + + EFI_NOT_FOUND - The variable could not be discovered + +--*/ +{ + return PeiGetNextVariableName ( + GetPeiServicesTablePointer (), + VariableNameSize, + VariableName, + VariableGuid + ); +} \ No newline at end of file diff --git a/IntelFrameworkModulePkg/Universal/VariablePei/Variable.h b/IntelFrameworkModulePkg/Universal/VariablePei/Variable.h new file mode 100644 index 0000000000..cc82b0fd5c --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/VariablePei/Variable.h @@ -0,0 +1,266 @@ +/*++ + +Copyright (c) 2006 - 2007, Intel Corporation +All rights reserved. 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. + +Module Name: + + Variable.h + +Abstract: + + Tiano PEIM to provide the variable functionality + +--*/ + +#ifndef _PEI_VARIABLE_H +#define _PEI_VARIABLE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// Define GET_PAD_SIZE to optimize compiler +// +#if ((ALIGNMENT == 0) || (ALIGNMENT == 1)) +#define GET_PAD_SIZE(a) (0) +#else +#define GET_PAD_SIZE(a) (((~a) + 1) & (ALIGNMENT - 1)) +#endif + +#define GET_VARIABLE_NAME_PTR(a) (CHAR16 *) ((UINTN) (a) + sizeof (VARIABLE_HEADER)) + +#define GET_VARIABLE_DATA_PTR(a) \ + (UINT8 *) ((UINTN) GET_VARIABLE_NAME_PTR (a) + (a)->NameSize + GET_PAD_SIZE ((a)->NameSize)) + +typedef struct { + VARIABLE_HEADER *CurrPtr; + VARIABLE_HEADER *EndPtr; + VARIABLE_HEADER *StartPtr; +} VARIABLE_POINTER_TRACK; + +#define VARIABLE_INDEX_TABLE_VOLUME 122 + +#define EFI_VARIABLE_INDEX_TABLE_GUID \ + { 0x8cfdb8c8, 0xd6b2, 0x40f3, { 0x8e, 0x97, 0x02, 0x30, 0x7c, 0xc9, 0x8b, 0x7c } } + +typedef struct { + UINT16 Length; + UINT16 GoneThrough; + VARIABLE_HEADER *EndPtr; + VARIABLE_HEADER *StartPtr; + UINT16 Index[VARIABLE_INDEX_TABLE_VOLUME]; +} VARIABLE_INDEX_TABLE; + + +// +// Functions +// +EFI_STATUS +EFIAPI +PeimInitializeVariableServices ( + IN EFI_FFS_FILE_HEADER *FfsHeader, + IN EFI_PEI_SERVICES **PeiServices + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + FfsHeader - TODO: add argument description + PeiServices - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EFIAPI +PeiGetVariable ( + IN EFI_PEI_SERVICES **PeiServices, + IN CHAR16 *VariableName, + IN EFI_GUID * VendorGuid, + OUT UINT32 *Attributes OPTIONAL, + IN OUT UINTN *DataSize, + OUT VOID *Data + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + PeiServices - TODO: add argument description + VariableName - TODO: add argument description + VendorGuid - TODO: add argument description + Attributes - TODO: add argument description + DataSize - TODO: add argument description + Data - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EFIAPI +PeiGetVariable2 ( + IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This, + IN CONST CHAR16 *VariableName, + IN CONST EFI_GUID *VariableGuid, + OUT UINT32 *Attributes, + IN OUT UINTN *DataSize, + OUT VOID *Data + ) +/*++ + +Routine Description: + + Provide the read variable functionality of the variable services. + +Arguments: + + PeiServices - General purpose services available to every PEIM. + + VariableName - The variable name + + VendorGuid - The vendor's GUID + + Attributes - Pointer to the attribute + + DataSize - Size of data + + Data - Pointer to data + +Returns: + + EFI_SUCCESS - The interface could be successfully installed + + EFI_NOT_FOUND - The variable could not be discovered + + EFI_BUFFER_TOO_SMALL - The caller buffer is not large enough + +--*/ +; + +EFI_STATUS +EFIAPI +PeiGetNextVariableName2 ( + IN CONST EFI_PEI_READ_ONLY_VARIABLE2_PPI *This, + IN OUT UINTN *VariableNameSize, + IN OUT CHAR16 *VariableName, + IN OUT EFI_GUID *VariableGuid + ) +/*++ + +Routine Description: + + Provide the get next variable functionality of the variable services. + +Arguments: + + PeiServices - General purpose services available to every PEIM. + VariabvleNameSize - The variable name's size. + VariableName - A pointer to the variable's name. + VariableGuid - A pointer to the EFI_GUID structure. + + VariableNameSize - Size of the variable name + + VariableName - The variable name + + VendorGuid - The vendor's GUID + +Returns: + + EFI_SUCCESS - The interface could be successfully installed + + EFI_NOT_FOUND - The variable could not be discovered + +--*/ +; + +EFI_STATUS +EFIAPI +PeiGetNextVariableName ( + IN EFI_PEI_SERVICES **PeiServices, + IN OUT UINTN *VariableNameSize, + IN OUT CHAR16 *VariableName, + IN OUT EFI_GUID *VendorGuid + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + PeiServices - TODO: add argument description + VariableNameSize - TODO: add argument description + VariableName - TODO: add argument description + VendorGuid - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +/** + Get one variable by the index count. + + @param IndexTable The pointer to variable index table. + @param Count The index count of variable in index table. + + @return The pointer to variable header indexed by count. + +**/ +VARIABLE_HEADER * +GetVariableByIndex ( + IN VARIABLE_INDEX_TABLE *IndexTable, + IN UINT32 Count + ); + +/** + Record Variable in VariableIndex HOB. + + Record Variable in VariableIndex HOB and update the length of variable index table. + + @param IndexTable The pointer to variable index table. + @param Variable The pointer to the variable that will be recorded. + + @retval VOID + +**/ +VOID +VariableIndexTableUpdate ( + IN OUT VARIABLE_INDEX_TABLE *IndexTable, + IN VARIABLE_HEADER *Variable + ); + +#endif // _PEI_VARIABLE_H diff --git a/IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.inf b/IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.inf new file mode 100644 index 0000000000..02e1d21497 --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.inf @@ -0,0 +1,112 @@ +#/** @file +# Component description file for PeiVariable module. +# +# Framework PEIM to provide the Variable functionality. +# Copyright (c) 2006 - 2007, Intel Corporation +# +# All rights reserved. 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. +# +# +#**/ + +################################################################################ +# +# Defines Section - statements that will be processed to create a Makefile. +# +################################################################################ +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PeiVariable + FILE_GUID = 34C8C28F-B61C-45a2-8F2E-89E46BECC63B + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + + ENTRY_POINT = PeimInitializeVariableServices + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +################################################################################ +# +# Sources Section - list of files that are required for the build to succeed. +# +################################################################################ + +[Sources.common] + Variable.dxs + Variable.c + Variable.h + +[Sources.Ia32] + VariableWorker.c + +[Sources.X64] + VariableWorker.c + +[Sources.IPF] + Ipf/VariableWorker.c + +[Sources.EBC] + VariableWorker.c + + +################################################################################ +# +# Package Dependency Section - list of Package files that are required for +# this module. +# +################################################################################ + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + IntelFrameworkPkg/IntelFrameworkPkg.dec + + +################################################################################ +# +# Library Class Section - list of Library Classes that are required for +# this module. +# +################################################################################ + +[LibraryClasses] + BaseMemoryLib + PcdLib + HobLib + PeimEntryPoint + DebugLib + + +################################################################################ +# +# PPI C Name Section - list of PPI and PPI Notify C Names that this module +# uses or produces. +# +################################################################################ + +[Ppis] + gEfiPeiReadOnlyVariablePpiGuid # PPI ALWAYS_PRODUCED + gEfiPeiReadOnlyVariable2PpiGuid # PPI ALWAYS_PRODUCED + +################################################################################ +# +# Pcd DYNAMIC - list of PCDs that this module is coded for. +# +################################################################################ + +[PcdsDynamic.common] + PcdFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid + +[depex] + TRUE diff --git a/IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.msa b/IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.msa new file mode 100644 index 0000000000..565ae31a13 --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/VariablePei/VariablePei.msa @@ -0,0 +1,76 @@ + + + + PeiVariable + PEIM + 34C8C28F-B61C-45a2-8F2E-89E46BECC63B + 1.0 + Component description file for PeiVariable module. + Framework PEIM to provide the Variable functionality. + Copyright (c) 2006 - 2007, Intel Corporation + All rights reserved. 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. + FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052 + + + IA32 X64 IPF EBC + false + PeiVariable + + + + DebugLib + + + PeimEntryPoint + + + HobLib + + + PcdLib + + + BaseMemoryLib + + + + Variable.h + Variable.c + Variable.dxs + VariableWorker.c + Ipf/VariableWorker.c + Ia32/VarMachine.h + Ebc/VarMachine.h + x64/VarMachine.h + Ipf/VarMachine.h + + + + + + + + gEfiPeiReadOnlyVariablePpiGuid + + + + EFI_SPECIFICATION_VERSION 0x00020000 + EDK_RELEASE_VERSION 0x00020000 + + PeimInitializeVariableServices + + + + + PcdFlashNvStorageVariableBase + gEfiGenericPlatformTokenSpaceGuid + The driver gets the Variable store base address from this PCD. This base address point to + an EFI_FIRMWARE_VOLUMN_HEADER struct. + + + \ No newline at end of file diff --git a/IntelFrameworkModulePkg/Universal/VariablePei/VariableWorker.c b/IntelFrameworkModulePkg/Universal/VariablePei/VariableWorker.c new file mode 100644 index 0000000000..1a49ee8c98 --- /dev/null +++ b/IntelFrameworkModulePkg/Universal/VariablePei/VariableWorker.c @@ -0,0 +1,63 @@ +/*++ + +Copyright (c) 2007, Intel Corporation +All rights reserved. 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. + +Module Name: + + VariableWorker.c + +Abstract: + + Framework PEIM to provide the Variable functionality + +--*/ + +#include + +/** + Get one variable by the index count. + + @param IndexTable The pointer to variable index table. + @param Count The index count of variable in index table. + + @return The pointer to variable header indexed by count. + +**/ +VARIABLE_HEADER * +GetVariableByIndex ( + IN VARIABLE_INDEX_TABLE *IndexTable, + IN UINT32 Count + ) +{ + return (VARIABLE_HEADER *) (UINTN) (IndexTable->Index[Count] + ((UINTN) IndexTable->StartPtr & 0xFFFF0000)); +} + +/** + Record Variable in VariableIndex HOB. + + Record Variable in VariableIndex HOB and update the length of variable index table. + + @param IndexTable The pointer to variable index table. + @param Variable The pointer to the variable that will be recorded. + + @retval VOID + +**/ +VOID +VariableIndexTableUpdate ( + IN OUT VARIABLE_INDEX_TABLE *IndexTable, + IN VARIABLE_HEADER *Variable + ) +{ + IndexTable->Index[IndexTable->Length++] = (UINT16) (UINTN) Variable; + + return; +} + -- 2.39.2