--- /dev/null
+/** @file\r
+Module produce EFI_PEI_READ_ONLY_VARIABLE_PPI on top of EFI_PEI_READ_ONLY_VARIABLE2_PPI.\r
+UEFI PI Spec supersedes Intel's Framework Specs. \r
+# EFI_PEI_READ_ONLY_VARIABLE_PPI defined in Intel Framework Pkg is replaced by EFI_PEI_READ_ONLY_VARIABLE2_PPI\r
+# in MdePkg.\r
+# This module produces EFI_PEI_READ_ONLY_VARIABLE_PPI on top of EFI_PEI_READ_ONLY_VARIABLE2_PPI. \r
+# This module is used on platform when both of these two conditions are true:\r
+# 1) Framework module consumes EFI_PEI_READ_ONLY_VARIABLE_PPI is present.\r
+# 2) The platform has a PI module that only produces EFI_PEI_READ_ONLY_VARIABLE2_PPI.\r
+\r
+This module can't be used together with ReadOnlyVariable2ToReadOnlyVariableThunk module.\r
+\r
+Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Module Name:\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+#include <Ppi/ReadOnlyVariable.h>\r
+#include <Ppi/ReadOnlyVariable2.h>\r
+#include <Ppi/ReadOnlyVariableThunkPresent.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PeiServicesLib.h>\r
+\r
+//\r
+// Function Prototypes\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+PeiGetVariable (\r
+ IN EFI_PEI_SERVICES **PeiServices,\r
+ IN CHAR16 *VariableName,\r
+ IN EFI_GUID *VendorGuid,\r
+ OUT UINT32 *Attributes OPTIONAL,\r
+ IN OUT UINTN *DataSize,\r
+ OUT VOID *Data\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+PeiGetNextVariableName (\r
+ IN EFI_PEI_SERVICES **PeiServices,\r
+ IN OUT UINTN *VariableNameSize,\r
+ IN OUT CHAR16 *VariableName,\r
+ IN OUT EFI_GUID *VendorGuid\r
+ );\r
+\r
+//\r
+// Module globals\r
+//\r
+EFI_PEI_READ_ONLY_VARIABLE_PPI mVariablePpi = {\r
+ PeiGetVariable,\r
+ PeiGetNextVariableName\r
+};\r
+\r
+EFI_PEI_PPI_DESCRIPTOR mPpiListVariable = {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+ &gEfiPeiReadOnlyVariablePpiGuid,\r
+ &mVariablePpi\r
+};\r
+\r
+EFI_PEI_PPI_DESCRIPTOR mReadOnlyVariableThunkPresent = {\r
+ (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+ &gPeiReadonlyVariableThunkPresentPpiGuid,\r
+ NULL\r
+};\r
+\r
+\r
+/**\r
+ Standard entry point of a PEIM.\r
+\r
+ @param FfsHeadher The FFS file header\r
+ @param PeiServices General purpose services available to every PEIM.\r
+\r
+ @retval EFI_SUCCESS If the gEfiPeiReadOnlyVariablePpiGuid interface could be successfully installed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeimInitializeReadOnlyVariable (\r
+ IN EFI_PEI_FILE_HANDLE FfsHeader,\r
+ IN CONST EFI_PEI_SERVICES **PeiServices\r
+ )\r
+{\r
+ VOID *Interface;\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Make sure ReadOnlyVariableToReadOnlyVariable2 module is not present. If so, the call chain will form a\r
+ // infinite loop: ReadOnlyVariable -> ReadOnlyVariable2 -> ReadOnlyVariable -> ....\r
+ //\r
+ Status = PeiServicesLocatePpi (&gPeiReadonlyVariableThunkPresentPpiGuid, 0, NULL, &Interface);\r
+ ASSERT (Status == EFI_NOT_FOUND);\r
+\r
+ Status = PeiServicesInstallPpi (&mReadOnlyVariableThunkPresent);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Publish the variable capability to other modules\r
+ //\r
+ return (*PeiServices)->InstallPpi (PeiServices, &mPpiListVariable);\r
+}\r
+\r
+/**\r
+ Provide the read variable functionality of the variable services.\r
+\r
+ @param PeiServices General purpose services available to every PEIM.\r
+ @param VariableName The variable name\r
+ @param VendorGuid The vendor's GUID\r
+ @param Attributes Pointer to the attribute\r
+ @param DataSize Size of data\r
+ @param Data Pointer to data\r
+\r
+ @retval EFI_SUCCESS The interface could be successfully installed\r
+ @retval EFI_NOT_FOUND The variable could not be discovered\r
+ @retval EFI_BUFFER_TOO_SMALL The caller buffer is not large enough\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeiGetVariable (\r
+ IN EFI_PEI_SERVICES **PeiServices,\r
+ IN CHAR16 *VariableName,\r
+ IN EFI_GUID *VendorGuid,\r
+ OUT UINT32 *Attributes OPTIONAL,\r
+ IN OUT UINTN *DataSize,\r
+ OUT VOID *Data\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_PEI_READ_ONLY_VARIABLE2_PPI *ReadOnlyVariable2;\r
+\r
+ Status = (*PeiServices)->LocatePpi (\r
+ (CONST EFI_PEI_SERVICES **)PeiServices, \r
+ &gEfiPeiReadOnlyVariable2PpiGuid, \r
+ 0, \r
+ NULL, \r
+ (VOID **)&ReadOnlyVariable2\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ return ReadOnlyVariable2->GetVariable (\r
+ ReadOnlyVariable2,\r
+ VariableName,\r
+ VendorGuid,\r
+ Attributes,\r
+ DataSize,\r
+ Data\r
+ );\r
+}\r
+\r
+/**\r
+ Provide the get next variable functionality of the variable services.\r
+\r
+ @param PeiServices General purpose services available to every PEIM.\r
+ @param VariabvleNameSize The variable name's size.\r
+ @param VariableName A pointer to the variable's name.\r
+ @param VariableGuid A pointer to the EFI_GUID structure.\r
+ @param VariableNameSize Size of the variable name\r
+ @param VariableName The variable name\r
+ @param VendorGuid The vendor's GUID\r
+\r
+ @retval EFI_SUCCESS The interface could be successfully installed\r
+ @retval EFI_NOT_FOUND The variable could not be discovered\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeiGetNextVariableName (\r
+ IN EFI_PEI_SERVICES **PeiServices,\r
+ IN OUT UINTN *VariableNameSize,\r
+ IN OUT CHAR16 *VariableName,\r
+ IN OUT EFI_GUID *VendorGuid\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_PEI_READ_ONLY_VARIABLE2_PPI *ReadOnlyVariable2;\r
+\r
+ Status = (*PeiServices)->LocatePpi (\r
+ (CONST EFI_PEI_SERVICES **)PeiServices, \r
+ &gEfiPeiReadOnlyVariable2PpiGuid, \r
+ 0, \r
+ NULL, \r
+ (VOID **)&ReadOnlyVariable2\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ return ReadOnlyVariable2->NextVariableName (\r
+ ReadOnlyVariable2,\r
+ VariableNameSize,\r
+ VariableName,\r
+ VendorGuid\r
+ );\r
+}\r