]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/ReadOnlyVariableOnReadOnlyVariable2Thunk/ReadOnlyVariableToReadOnlyVariable2Thunk.c
Rename module name from ***To*** to ***On***. AAAOnBBB means this module produce...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / ReadOnlyVariableOnReadOnlyVariable2Thunk / ReadOnlyVariableToReadOnlyVariable2Thunk.c
diff --git a/EdkCompatibilityPkg/Compatibility/ReadOnlyVariableOnReadOnlyVariable2Thunk/ReadOnlyVariableToReadOnlyVariable2Thunk.c b/EdkCompatibilityPkg/Compatibility/ReadOnlyVariableOnReadOnlyVariable2Thunk/ReadOnlyVariableToReadOnlyVariable2Thunk.c
new file mode 100644 (file)
index 0000000..0e531e3
--- /dev/null
@@ -0,0 +1,201 @@
+/** @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