]> 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 ca23c1634d792617e325528dac84d8050143b1f3..ff4165d19ec1c55af78b1ad7c2e3032d63dc3e7a 100644 (file)
@@ -203,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
@@ -345,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
@@ -375,7 +394,7 @@ FvGetVolumeAttributes (
                               Attributes\r
                               );\r
   if (!EFI_ERROR (Status)) {\r
-    *Attributes = (*Attributes & 0x1ff) | ((UINTN)EFI_FV_ALIGNMENT_2 << RShiftU64((*Attributes & EFI_FV2_ALIGNMENT), 16));\r
+    *Attributes = Fv2AttributesToFvAttributes (*Attributes);\r
   }\r
   return Status;\r
 }\r
@@ -400,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
@@ -459,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
@@ -472,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
@@ -562,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
@@ -605,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
@@ -617,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