[resend since the first seems to be lost in the list]
From: James Bottomley <[email protected]>

I have a use case for inserting variables into the flash image, but it can't
be verified on Ovmf since it throws away the variables section and builds a
new pristine one.  Fix this by having Ovmf create it's in memory variable area
initialised from the flash image store.

Signed-off-by: James Bottomley <[email protected]>
---
 OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c   | 169 +++++--------------------------
 OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf |   1 +
 2 files changed, 25 insertions(+), 145 deletions(-)

diff --git a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c 
b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c
index 7a8beb3..92fd95e 100644
--- a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c
+++ b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c
@@ -625,159 +625,38 @@ InitializeFvAndVariableStoreHeaders (
   IN  VOID   *Ptr
   )
 {
+  EFI_FIRMWARE_VOLUME_HEADER  *Fv;
+  EFI_PHYSICAL_ADDRESS            NvStorageBase;
+
   //
-  // Templates for standard (non-authenticated) variable FV header
+  // Copy the variables structure from the firmware into the location
   //
-  STATIC FVB_FV_HDR_AND_VARS_TEMPLATE FvAndVarTemplate = {
-    { // EFI_FIRMWARE_VOLUME_HEADER FvHdr;
-      // UINT8                     ZeroVector[16];
-      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
-
-      // EFI_GUID                  FileSystemGuid;
-      EFI_SYSTEM_NV_DATA_FV_GUID,
-
-      // UINT64                    FvLength;
-      EMU_FVB_SIZE,
-
-      // UINT32                    Signature;
-      EFI_FVH_SIGNATURE,
-
-      // EFI_FVB_ATTRIBUTES_2      Attributes;
-      0x4feff,
-
-      // UINT16                    HeaderLength;
-      EMU_FV_HEADER_LENGTH,
-
-      // UINT16                    Checksum;
-      0,
-
-      // UINT16                    ExtHeaderOffset;
-      0,
-
-      // UINT8                     Reserved[1];
-      {0},
-
-      // UINT8                     Revision;
-      EFI_FVH_REVISION,
-
-      // EFI_FV_BLOCK_MAP_ENTRY    BlockMap[1];
-      { 
-        {
-          2, // UINT32 NumBlocks;
-          EMU_FVB_BLOCK_SIZE  // UINT32 Length;
-        }
-      }
-    },
-    // EFI_FV_BLOCK_MAP_ENTRY     EndBlockMap;
-    { 0, 0 }, // End of block map
-    { // VARIABLE_STORE_HEADER      VarHdr;
-      // EFI_GUID  Signature;
-      EFI_VARIABLE_GUID,
-
-      // UINT32  Size;
-      (
-        FixedPcdGet32 (PcdVariableStoreSize) -
-        OFFSET_OF (FVB_FV_HDR_AND_VARS_TEMPLATE, VarHdr)
-      ),
-
-      // UINT8   Format;
-      VARIABLE_STORE_FORMATTED,
-
-      // UINT8   State;
-      VARIABLE_STORE_HEALTHY,
-
-      // UINT16  Reserved;
-      0,
-
-      // UINT32  Reserved1;
-      0
-    }
-  };
-
+  NvStorageBase = (EFI_PHYSICAL_ADDRESS) PcdGet32 
(PcdOvmfFlashNvStorageVariableBase);
+  Fv = (EFI_FIRMWARE_VOLUME_HEADER *)NvStorageBase;
+  ASSERT(Fv->FvLength == EMU_FVB_SIZE);
+  ASSERT(Fv->HeaderLength == EMU_FV_HEADER_LENGTH);
+  CopyMem(Ptr, (UINT8 *) (UINTN)NvStorageBase, Fv->FvLength);
   //
-  // Templates for authenticated variable FV header
+  // Fix up the block Headers (Emu has a special block size which may differ
+  // from other flash)
   //
-  STATIC FVB_FV_HDR_AND_VARS_TEMPLATE FvAndAuthenticatedVarTemplate = {
-    { // EFI_FIRMWARE_VOLUME_HEADER FvHdr;
-      // UINT8                     ZeroVector[16];
-      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
-
-      // EFI_GUID                  FileSystemGuid;
-      EFI_SYSTEM_NV_DATA_FV_GUID,
-
-      // UINT64                    FvLength;
-      EMU_FVB_SIZE,
-
-      // UINT32                    Signature;
-      EFI_FVH_SIGNATURE,
-
-      // EFI_FVB_ATTRIBUTES_2      Attributes;
-      0x4feff,
-
-      // UINT16                    HeaderLength;
-      EMU_FV_HEADER_LENGTH,
-
-      // UINT16                    Checksum;
-      0,
-
-      // UINT16                    ExtHeaderOffset;
-      0,
-
-      // UINT8                     Reserved[1];
-      {0},
-
-      // UINT8                     Revision;
-      EFI_FVH_REVISION,
-
-      // EFI_FV_BLOCK_MAP_ENTRY    BlockMap[1];
-      {
-        {
-          2, // UINT32 NumBlocks;
-          EMU_FVB_BLOCK_SIZE  // UINT32 Length;
-        }
-      }
-    },
-    // EFI_FV_BLOCK_MAP_ENTRY     EndBlockMap;
-    { 0, 0 }, // End of block map
-    { // VARIABLE_STORE_HEADER      VarHdr;
-        // EFI_GUID  Signature;     // need authenticated variables for secure 
boot
-        EFI_AUTHENTICATED_VARIABLE_GUID,
-
-      // UINT32  Size;
-      (
-        FixedPcdGet32 (PcdVariableStoreSize) -
-        OFFSET_OF (FVB_FV_HDR_AND_VARS_TEMPLATE, VarHdr)
-      ),
-
-      // UINT8   Format;
-      VARIABLE_STORE_FORMATTED,
-
-      // UINT8   State;
-      VARIABLE_STORE_HEALTHY,
-
-      // UINT16  Reserved;
-      0,
-
-      // UINT32  Reserved1;
-      0
-    }
-  };
-
-  EFI_FIRMWARE_VOLUME_HEADER  *Fv;
-
+  Fv = Ptr;
+  Fv->BlockMap[0].NumBlocks = 2;
+  Fv->BlockMap[0].Length = EMU_FVB_BLOCK_SIZE;
   //
-  // Copy the template structure into the location
+  // fix up attributes (EFI_FVB2_ALIGNMENT_16 and
+  // everything except EFI_FVB2_READ_DISABLED_CAP)
   //
-  if (FeaturePcdGet (PcdSecureBootEnable) == FALSE) {
-    CopyMem (Ptr, (VOID*)&FvAndVarTemplate, sizeof (FvAndVarTemplate));
-  } else {
-    CopyMem (Ptr, (VOID*)&FvAndAuthenticatedVarTemplate, sizeof 
(FvAndAuthenticatedVarTemplate));
-  }
-
+  Fv->Attributes = 0x4fffe;
+  //
+  // We should only have a single entry in the block map
+  //
+  ASSERT(Fv->BlockMap[1].NumBlocks == 0);
+  ASSERT(Fv->BlockMap[1].Length == 0);
   //
-  // Update the checksum for the FV header
+  // Now that we mucked around with the FV header, redo its checksum
   //
-  Fv = (EFI_FIRMWARE_VOLUME_HEADER*) Ptr;
+  Fv->Checksum = 0;
   Fv->Checksum = CalculateCheckSum16 (Ptr, Fv->HeaderLength);
 }
 
diff --git a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf 
b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
index 4d4827d..5c39f87 100644
--- a/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
+++ b/OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
@@ -60,6 +60,7 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase
 
 [Pcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize



------------------------------------------------------------------------------
New Year. New Location. New Benefits. New Data Center in Ashburn, VA.
GigeNET is offering a free month of service with a new server in Ashburn.
Choose from 2 high performing configs, both with 100TB of bandwidth.
Higher redundancy.Lower latency.Increased capacity.Completely compliant.
http://p.sf.net/sfu/gigenet
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to