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
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
{\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
{\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
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
{\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
{\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
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