]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) Covert the FvAttributes back to format defined in Framework spec after calling...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 18 Nov 2008 14:20:01 +0000 (14:20 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 18 Nov 2008 14:20:01 +0000 (14:20 +0000)
2) Set the EFI_FV_FILE_ATTRIB_MEMORY_MAPPED before calling PI FV Protocol->WriteFile interface.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6612 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FvToFv2Thunk/FvToFv2Thunk.c

index ca23c1634d792617e325528dac84d8050143b1f3..803bc2c9feebc867638544d7168e3369492f3f45 100644 (file)
@@ -345,6 +345,17 @@ InitializeFirmwareVolume2 (
   return EFI_SUCCESS;\r
 }\r
 \r
+FRAMEWORK_EFI_FV_ATTRIBUTES\r
+Fv2AttributesToFvAttributes (\r
+    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 +386,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 +411,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 +470,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 +484,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 +581,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 +639,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 +652,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