]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.c
Add missing parameter in functions header.
[mirror_edk2.git] / OvmfPkg / EmuVariableFvbRuntimeDxe / Fvb.c
index 2076a8c6e9bb071e224da1494f359fc2f414eaf4..c1f46a7d9d2fb66650ed8e1b26cfd84151bd423a 100644 (file)
@@ -2,7 +2,7 @@
   Firmware Block Services to support emulating non-volatile variables\r
   by pretending that a memory buffer is storage for the NV variables.\r
 \r
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
   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
@@ -34,6 +34,9 @@
 #include <Library/PlatformFvbLib.h>\r
 #include "Fvb.h"\r
 \r
+#define EFI_AUTHENTICATED_VARIABLE_GUID \\r
+{ 0xaaf32c78, 0x947b, 0x439a, { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 } }\r
+\r
 //\r
 // Virtual Address Change Event\r
 //\r
@@ -116,7 +119,7 @@ FvbVirtualAddressChangeEvent (
   a memory-mapped firmware volume. This function should be called\r
   only for memory-mapped firmware volumes.\r
 \r
-  @param This     Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.\r
+  @param This     Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.\r
   \r
   @param Address  Pointer to a caller-allocated\r
                   EFI_PHYSICAL_ADDRESS that, on successful\r
@@ -131,7 +134,7 @@ FvbVirtualAddressChangeEvent (
 EFI_STATUS\r
 EFIAPI\r
 FvbProtocolGetPhysicalAddress (\r
-  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,\r
+  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,\r
   OUT       EFI_PHYSICAL_ADDRESS                *Address\r
   )\r
 {\r
@@ -152,7 +155,7 @@ FvbProtocolGetPhysicalAddress (
   retrieve the block map (see EFI_FIRMWARE_VOLUME_HEADER).\r
 \r
 \r
-  @param This           Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.\r
+  @param This           Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.\r
 \r
   @param Lba            Indicates the block for which to return the size.\r
 \r
@@ -174,7 +177,7 @@ FvbProtocolGetPhysicalAddress (
 EFI_STATUS\r
 EFIAPI\r
 FvbProtocolGetBlockSize (\r
-  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,\r
+  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,\r
   IN        EFI_LBA                             Lba,\r
   OUT       UINTN                               *BlockSize,\r
   OUT       UINTN                               *NumberOfBlocks\r
@@ -199,7 +202,7 @@ FvbProtocolGetBlockSize (
   The GetAttributes() function retrieves the attributes and\r
   current settings of the block. Status Codes Returned\r
 \r
-  @param This       Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.\r
+  @param This       Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.\r
 \r
   @param Attributes Pointer to EFI_FVB_ATTRIBUTES_2 in which the\r
                     attributes and current settings are\r
@@ -213,7 +216,7 @@ FvbProtocolGetBlockSize (
 EFI_STATUS\r
 EFIAPI\r
 FvbProtocolGetAttributes (\r
-  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,\r
+  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,\r
   OUT       EFI_FVB_ATTRIBUTES_2                *Attributes\r
   )\r
 {\r
@@ -234,7 +237,7 @@ FvbProtocolGetAttributes (
   The SetAttributes() function sets configurable firmware volume\r
   attributes and returns the new settings of the firmware volume.\r
 \r
-  @param This         Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.\r
+  @param This         Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.\r
 \r
   @param Attributes   On input, Attributes is a pointer to\r
                       EFI_FVB_ATTRIBUTES_2 that contains the\r
@@ -255,7 +258,7 @@ FvbProtocolGetAttributes (
 EFI_STATUS\r
 EFIAPI\r
 FvbProtocolSetAttributes (\r
-  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,\r
+  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,\r
   IN OUT    EFI_FVB_ATTRIBUTES_2                *Attributes\r
   )\r
 {\r
@@ -281,7 +284,7 @@ FvbProtocolSetAttributes (
   flushed to the hardware before the EraseBlocks() service\r
   returns.\r
 \r
-  @param This   Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL\r
+  @param This   Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL\r
                 instance.\r
 \r
   @param ...    The variable argument list is a list of tuples.\r
@@ -314,7 +317,7 @@ FvbProtocolSetAttributes (
 EFI_STATUS\r
 EFIAPI\r
 FvbProtocolEraseBlocks (\r
-  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,\r
+  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,\r
   ...\r
   )\r
 {\r
@@ -377,6 +380,9 @@ FvbProtocolEraseBlocks (
       EraseSize,\r
       ERASED_UINT8\r
       );\r
+    VA_START (args, This);\r
+    PlatformFvbBlocksErased (This, args);\r
+    VA_END (args);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -413,7 +419,7 @@ FvbProtocolEraseBlocks (
   fully flushed to the hardware before the Write() service\r
   returns.\r
 \r
-  @param This     Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.\r
+  @param This     Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.\r
   \r
   @param Lba      The starting logical block index to write to.\r
   \r
@@ -445,7 +451,7 @@ FvbProtocolEraseBlocks (
 EFI_STATUS\r
 EFIAPI\r
 FvbProtocolWrite (\r
-  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,\r
+  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,\r
   IN        EFI_LBA                             Lba,\r
   IN        UINTN                               Offset,\r
   IN OUT    UINTN                               *NumBytes,\r
@@ -496,7 +502,7 @@ FvbProtocolWrite (
   indicate the number of bytes actually read. The caller must be\r
   aware that a read may be partially completed.\r
 \r
-  @param This     Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL instance.\r
+  @param This     Indicates the EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL instance.\r
   \r
   @param Lba      The starting logical block index\r
                   from which to read.\r
@@ -530,7 +536,7 @@ FvbProtocolWrite (
 EFI_STATUS\r
 EFIAPI\r
 FvbProtocolRead (\r
-  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,\r
+  IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL *This,\r
   IN        EFI_LBA                             Lba,\r
   IN        UINTN                               Offset,\r
   IN OUT    UINTN                               *NumBytes,\r
@@ -557,6 +563,7 @@ FvbProtocolRead (
 \r
   if (*NumBytes > 0) {\r
     CopyMem (Buffer, FvbDataPtr, *NumBytes);\r
+    PlatformFvbDataRead (This, Lba, Offset, *NumBytes, Buffer);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -618,6 +625,9 @@ InitializeFvAndVariableStoreHeaders (
   IN  VOID   *Ptr\r
   )\r
 {\r
+  //\r
+  // Templates for standard (non-authenticated) variable FV header\r
+  //\r
   STATIC FVB_FV_HDR_AND_VARS_TEMPLATE FvAndVarTemplate = {\r
     { // EFI_FIRMWARE_VOLUME_HEADER FvHdr;\r
       // UINT8                     ZeroVector[16];\r
@@ -680,12 +690,83 @@ InitializeFvAndVariableStoreHeaders (
       0\r
     }\r
   };\r
+\r
+  //\r
+  // Templates for authenticated variable FV header\r
+  //\r
+  STATIC FVB_FV_HDR_AND_VARS_TEMPLATE FvAndAuthenticatedVarTemplate = {\r
+    { // EFI_FIRMWARE_VOLUME_HEADER FvHdr;\r
+      // UINT8                     ZeroVector[16];\r
+      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r
+\r
+      // EFI_GUID                  FileSystemGuid;\r
+      EFI_SYSTEM_NV_DATA_FV_GUID,\r
+\r
+      // UINT64                    FvLength;\r
+      EMU_FVB_SIZE,\r
+\r
+      // UINT32                    Signature;\r
+      EFI_FVH_SIGNATURE,\r
+\r
+      // EFI_FVB_ATTRIBUTES_2      Attributes;\r
+      0x4feff,\r
+\r
+      // UINT16                    HeaderLength;\r
+      EMU_FV_HEADER_LENGTH,\r
+\r
+      // UINT16                    Checksum;\r
+      0,\r
+\r
+      // UINT16                    ExtHeaderOffset;\r
+      0,\r
+\r
+      // UINT8                     Reserved[1];\r
+      0,\r
+\r
+      // UINT8                     Revision;\r
+      EFI_FVH_REVISION,\r
+\r
+      // EFI_FV_BLOCK_MAP_ENTRY    BlockMap[1];\r
+      { 2, // UINT32 NumBlocks;\r
+        EMU_FVB_BLOCK_SIZE  // UINT32 Length;\r
+      }\r
+    },\r
+    // EFI_FV_BLOCK_MAP_ENTRY     EndBlockMap;\r
+    { 0, 0 }, // End of block map\r
+    { // VARIABLE_STORE_HEADER      VarHdr;\r
+        // EFI_GUID  Signature;     // need authenticated variables for secure boot\r
+        EFI_AUTHENTICATED_VARIABLE_GUID,\r
+\r
+      // UINT32  Size;\r
+      (\r
+        FixedPcdGet32 (PcdVariableStoreSize) -\r
+        OFFSET_OF (FVB_FV_HDR_AND_VARS_TEMPLATE, VarHdr)\r
+      ),\r
+\r
+      // UINT8   Format;\r
+      VARIABLE_STORE_FORMATTED,\r
+\r
+      // UINT8   State;\r
+      VARIABLE_STORE_HEALTHY,\r
+\r
+      // UINT16  Reserved;\r
+      0,\r
+\r
+      // UINT32  Reserved1;\r
+      0\r
+    }\r
+  };\r
+\r
   EFI_FIRMWARE_VOLUME_HEADER  *Fv;\r
 \r
   //\r
   // Copy the template structure into the location\r
   //\r
-  CopyMem (Ptr, (VOID*)&FvAndVarTemplate, sizeof (FvAndVarTemplate));\r
+  if (FeaturePcdGet (PcdSecureBootEnable) == FALSE) {\r
+    CopyMem (Ptr, (VOID*)&FvAndVarTemplate, sizeof (FvAndVarTemplate));\r
+  } else {\r
+    CopyMem (Ptr, (VOID*)&FvAndAuthenticatedVarTemplate, sizeof (FvAndAuthenticatedVarTemplate));\r
+  }\r
 \r
   //\r
   // Update the checksum for the FV header\r
@@ -815,7 +896,7 @@ FvbInitialize (
     SetMem (Ptr, EMU_FVB_SIZE, ERASED_UINT8);\r
     InitializeFvAndVariableStoreHeaders (Ptr);\r
   }\r
-  PcdSet32 (PcdFlashNvStorageVariableBase, (UINT32)(UINTN) Ptr);\r
+  PcdSet64 (PcdFlashNvStorageVariableBase64, (UINT32)(UINTN) Ptr);\r
 \r
   //\r
   // Initialize the Fault Tolerant Write data area\r
@@ -846,7 +927,7 @@ FvbInitialize (
   Handle = 0;\r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &Handle,\r
-                  &gEfiFirmwareVolumeBlockProtocolGuid,\r
+                  &gEfiFirmwareVolumeBlock2ProtocolGuid,\r
                   &mEmuVarsFvb.FwVolBlockInstance,\r
                   &gEfiDevicePathProtocolGuid,\r
                   &mEmuVarsFvb.DevicePath,\r