The "BLOB.HostsOnlyTableData" field tracks whether the allocated & downloaded fw_cfg blob should be released in the end. The current name "HostsOnlyTableData" reflects only the original determinant for this, namely whether the blob hosts ACPI table data only -- because in that case EFI_ACPI_TABLE_PROTOCOL.InstallAcpiTable() would create deep copies of all referenced parts of the blob.
However, in commit 9965cbd424f2 ("OvmfPkg/AcpiPlatformDxe: implement the QEMU_LOADER_WRITE_POINTER command", 2017-02-08) we flipped the field to FALSE in ProcessCmdWritePointer() too, because the blob must also not be released if we send its allocation address back to QEMU. Therefore we should more generally call the field "Releasable".
Cc: "Michael S. Tsirkin" mst@redhat.com Cc: Ard Biesheuvel ard.biesheuvel@linaro.org Cc: Ben Warren ben@skyportsystems.com Cc: Dongjiu Geng gengdongjiu@huawei.com Cc: Igor Mammedov imammedo@redhat.com Cc: Jordan Justen jordan.l.justen@intel.com Cc: Leif Lindholm leif.lindholm@linaro.org Cc: Shannon Zhao zhaoshenglong@huawei.com Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek lersek@redhat.com --- OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c b/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c index 1bc5fe297a96..4a7b051288bc 100644 --- a/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c +++ b/OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpi.c @@ -34,13 +34,12 @@ typedef struct { UINT8 File[QEMU_LOADER_FNAME_SIZE]; // NUL-terminated name of the fw_cfg // blob. This is the ordering / search // key. UINTN Size; // The number of bytes in this blob. UINT8 *Base; // Pointer to the blob data. - BOOLEAN HostsOnlyTableData; // TRUE iff the blob has been found to - // only contain data that is directly - // part of ACPI tables. + BOOLEAN Releasable; // TRUE iff the blob should be released + // at the end of processing. } BLOB;
/** Compare a standalone key against a user structure containing an embedded key. @@ -206,11 +205,11 @@ ProcessCmdAllocate ( goto FreePages; } CopyMem (Blob->File, Allocate->File, QEMU_LOADER_FNAME_SIZE); Blob->Size = FwCfgSize; Blob->Base = (VOID *)(UINTN)Address; - Blob->HostsOnlyTableData = TRUE; + Blob->Releasable = TRUE;
Status = OrderedCollectionInsert (Tracker, NULL, Blob); if (Status == RETURN_ALREADY_STARTED) { DEBUG ((EFI_D_ERROR, "%a: duplicated file "%a"\n", __FUNCTION__, Allocate->File)); @@ -505,11 +504,11 @@ ProcessCmdWritePointer ( // // Because QEMU has now learned PointeeBlob->Base, we must mark PointeeBlob // as unreleasable, for the case when the whole linker/loader script is // handled successfully. // - PointeeBlob->HostsOnlyTableData = FALSE; + PointeeBlob->Releasable = FALSE;
DEBUG ((DEBUG_VERBOSE, "%a: PointerFile="%a" PointeeFile="%a" " "PointerOffset=0x%x PointeeOffset=0x%x PointerSize=%d\n", __FUNCTION__, WritePointer->PointerFile, WritePointer->PointeeFile, WritePointer->PointerOffset, WritePointer->PointeeOffset, @@ -612,12 +611,13 @@ UndoCmdWritePointer ( before, or an ACPI table different from RSDT and XSDT has been installed (reflected by InstalledKey and NumInstalled), or RSDT or XSDT has been identified but not installed, or the fw_cfg blob pointed-into by AddPointer has - been marked as hosting something else than - just direct ACPI table contents. + been marked as non-releasable due to hosting + something else than just direct ACPI table + contents.
@return Error codes returned by AcpiProtocol->InstallAcpiTable(). **/ STATIC @@ -740,11 +740,11 @@ Process2ndPassCmdAddPointer ( } }
if (TableSize == 0) { DEBUG ((EFI_D_VERBOSE, "not found; marking fw_cfg blob as opaque\n")); - Blob2->HostsOnlyTableData = FALSE; + Blob2->Releasable = FALSE; return EFI_SUCCESS; }
if (*NumInstalled == INSTALLED_TABLES_MAX) { DEBUG ((EFI_D_ERROR, "%a: can't install more than %d tables\n", @@ -982,23 +982,23 @@ RollbackWritePointersAndFreeTracker: } }
// // Tear down the tracker infrastructure. Each fw_cfg blob will be left in - // place only if we're exiting with success and the blob hosts data that is - // not directly part of some ACPI table. + // place only if we're exiting with success and the blob has been marked + // non-releasable. // for (TrackerEntry = OrderedCollectionMin (Tracker); TrackerEntry != NULL; TrackerEntry = TrackerEntry2) { VOID *UserStruct; BLOB *Blob;
TrackerEntry2 = OrderedCollectionNext (TrackerEntry); OrderedCollectionDelete (Tracker, TrackerEntry, &UserStruct); Blob = UserStruct;
- if (EFI_ERROR (Status) || Blob->HostsOnlyTableData) { + if (EFI_ERROR (Status) || Blob->Releasable) { DEBUG ((EFI_D_VERBOSE, "%a: freeing "%a"\n", __FUNCTION__, Blob->File)); gBS->FreePages ((UINTN)Blob->Base, EFI_SIZE_TO_PAGES (Blob->Size)); } FreePool (Blob);