]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FvToFv2Thunk/FvToFv2Thunk.c
Correct FeatureFlagExpress PCD format based on INF spec.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FvToFv2Thunk / FvToFv2Thunk.c
index 61b2b049ca93bf5aea2a56f3e8a52d9226903e9b..ff4165d19ec1c55af78b1ad7c2e3032d63dc3e7a 100644 (file)
@@ -1,4 +1,11 @@
-/*++\r
+/** @file\r
+UEFI PI specification supersedes Inte's Framework Specification.\r
+EFI_FIRMWARE_VOLUME_PROTOCOL defined in Intel Framework Pkg is replaced by\r
+EFI_FIRMWARE_VOLUME2_PROTOCOL in MdePkg.\r
+This module produces FV on top of FV2. This module is used on platform when both of\r
+these two conditions are true:\r
+1) Framework module consuming FV is present\r
+2) And the platform only produces FV2\r
 \r
 Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
 All rights reserved. This program and the accompanying materials\r
@@ -10,13 +17,7 @@ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 Module Name:\r
 \r
-  FvToFv2Thunk.c\r
-\r
-Abstract:\r
-\r
-  DXE driver \r
-\r
---*/\r
+**/\r
 \r
 #include <PiDxe.h>\r
 #include <Protocol/FirmwareVolume2.h>\r
@@ -202,7 +203,7 @@ FvGetNextFile (
   OUT UINTN                         *Size\r
   );\r
 \r
-#define FIRMWARE_VOLUME_PRIVATE_DATA_SIGNATURE  EFI_SIGNATURE_32 ('f', 'v', 't', 'h')\r
+#define FIRMWARE_VOLUME_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('f', 'v', 't', 'h')\r
 \r
 typedef struct {\r
   UINTN                          Signature;\r
@@ -344,6 +345,25 @@ InitializeFirmwareVolume2 (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Convert FV attrbiutes to FV2 attributes.\r
+\r
+  @param Fv2Attributes FV2 attributes.\r
+\r
+  @return FV attributes.\r
+\r
+**/\r
+FRAMEWORK_EFI_FV_ATTRIBUTES\r
+Fv2AttributesToFvAttributes (\r
+  IN  EFI_FV_ATTRIBUTES Fv2Attributes\r
+  )\r
+{\r
+  //\r
+  // Clear those filed that is not defined in Framework FV spec and Alignment conversion.\r
+  //\r
+  return (Fv2Attributes & 0x1ff) | ((UINTN) EFI_FV_ALIGNMENT_2 << RShiftU64((Fv2Attributes & EFI_FV2_ALIGNMENT), 16));\r
+}\r
+\r
 /**\r
   Retrieves attributes, insures positive polarity of attribute bits, returns\r
   resulting attributes in output parameter\r
@@ -374,7 +394,7 @@ FvGetVolumeAttributes (
                               Attributes\r
                               );\r
   if (!EFI_ERROR (Status)) {\r
-    *Attributes = (*Attributes & 0x1ff) | ((UINTN)EFI_FV_ALIGNMENT_2 << ((*Attributes & EFI_FV2_ALIGNMENT) >> 16));\r
+    *Attributes = Fv2AttributesToFvAttributes (*Attributes);\r
   }\r
   return Status;\r
 }\r
@@ -399,21 +419,21 @@ FvSetVolumeAttributes (
 {\r
   FIRMWARE_VOLUME_PRIVATE_DATA   *Private;\r
   EFI_FIRMWARE_VOLUME2_PROTOCOL  *FirmwareVolume2;\r
-  INTN                           Alignment;\r
   EFI_FV_ATTRIBUTES              Fv2Attributes; \r
+  EFI_STATUS                     Status;\r
 \r
   Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);\r
   FirmwareVolume2 = Private->FirmwareVolume2;\r
 \r
   Fv2Attributes = (*Attributes & 0x1ff);\r
-  Alignment = LowBitSet64 (RShiftU64 (*Attributes, 16) & 0xffff);\r
-  if (Alignment != -1) {\r
-    Fv2Attributes |= LShiftU64 (Alignment, 16);\r
-  }\r
-  return FirmwareVolume2->SetVolumeAttributes (\r
+  Status = FirmwareVolume2->SetVolumeAttributes (\r
                             FirmwareVolume2,\r
                             &Fv2Attributes\r
                             );\r
+\r
+  *Attributes = Fv2AttributesToFvAttributes (Fv2Attributes);\r
+  \r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -458,11 +478,12 @@ FvReadFile (
 {\r
   FIRMWARE_VOLUME_PRIVATE_DATA   *Private;\r
   EFI_FIRMWARE_VOLUME2_PROTOCOL  *FirmwareVolume2;\r
+  EFI_STATUS                     Status;\r
 \r
   Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);\r
   FirmwareVolume2 = Private->FirmwareVolume2;\r
 \r
-  return FirmwareVolume2->ReadFile (\r
+  Status = FirmwareVolume2->ReadFile (\r
                             FirmwareVolume2,\r
                             NameGuid,\r
                             Buffer,\r
@@ -471,6 +492,13 @@ FvReadFile (
                             FileAttributes,\r
                             AuthenticationStatus\r
                             );\r
+\r
+  //\r
+  // For Framework FV attrbutes, only alignment fields are valid.\r
+  //\r
+  *FileAttributes = *FileAttributes & EFI_FV_FILE_ATTRIB_ALIGNMENT;\r
+  \r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -561,16 +589,31 @@ FvWriteFile (
 {\r
   FIRMWARE_VOLUME_PRIVATE_DATA   *Private;\r
   EFI_FIRMWARE_VOLUME2_PROTOCOL  *FirmwareVolume2;\r
+  EFI_FV_WRITE_FILE_DATA         *PiFileData;\r
+  EFI_STATUS                     Status;\r
+  UINTN                          Index;\r
 \r
   Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);\r
   FirmwareVolume2 = Private->FirmwareVolume2;\r
 \r
-  return FirmwareVolume2->WriteFile (\r
+  PiFileData = AllocateCopyPool (sizeof (EFI_FV_WRITE_FILE_DATA), FileData);\r
+\r
+  //\r
+  // Framework Spec assume firmware files are Memory-Mapped.\r
+  //\r
+  for (Index = 0; Index < NumberOfFiles; Index++) {\r
+    PiFileData[Index].FileAttributes |= EFI_FV_FILE_ATTRIB_MEMORY_MAPPED;\r
+  }\r
+\r
+  Status = FirmwareVolume2->WriteFile (\r
                             FirmwareVolume2,\r
                             NumberOfFiles,\r
                             WritePolicy,\r
                             (EFI_FV_WRITE_FILE_DATA *)FileData\r
                             );\r
+\r
+  FreePool (PiFileData);\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -604,11 +647,12 @@ FvGetNextFile (
 {\r
   FIRMWARE_VOLUME_PRIVATE_DATA   *Private;\r
   EFI_FIRMWARE_VOLUME2_PROTOCOL  *FirmwareVolume2;\r
+  EFI_STATUS                     Status;\r
 \r
   Private = FIRMWARE_VOLUME_PRIVATE_DATA_FROM_THIS (This);\r
   FirmwareVolume2 = Private->FirmwareVolume2;\r
 \r
-  return FirmwareVolume2->GetNextFile (\r
+  Status = FirmwareVolume2->GetNextFile (\r
                             FirmwareVolume2,\r
                             Key,\r
                             FileType,\r
@@ -616,4 +660,11 @@ FvGetNextFile (
                             Attributes,\r
                             Size\r
                             );\r
+\r
+  //\r
+  // For Framework FV attrbutes, only alignment fields are valid.\r
+  //\r
+  *Attributes = *Attributes & EFI_FV_FILE_ATTRIB_ALIGNMENT;\r
+  \r
+  return Status;\r
 }\r