aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>2022-05-25 18:32:31 +0100
committerMichael S. Tsirkin <mst@redhat.com>2022-06-09 19:32:49 -0400
commit68f14a87291343bcec2bfcec7fdc0c8a3c01f66c (patch)
tree1acaf67ed4314a505c0ddf2b4529484140b2eddb
parent4c8f2ffff1bffcf4649c5373a50f2475c598eb0e (diff)
downloadqemu-68f14a87291343bcec2bfcec7fdc0c8a3c01f66c.zip
qemu-68f14a87291343bcec2bfcec7fdc0c8a3c01f66c.tar.gz
qemu-68f14a87291343bcec2bfcec7fdc0c8a3c01f66c.tar.bz2
hw/acpi/viot: sort VIOT ACPI table entries by PCI host bridge min_bus
This ensures that the VIOT ACPI table output is always stable for a given PCI topology by ensuring that entries are ordered according to min_bus. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Ani Sinha <ani@anisinha.ca> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20220525173232.31429-6-mark.cave-ayland@ilande.co.uk> Reviewed-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--hw/acpi/viot.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/hw/acpi/viot.c b/hw/acpi/viot.c
index c32bbdd..4e0bf69 100644
--- a/hw/acpi/viot.c
+++ b/hw/acpi/viot.c
@@ -64,6 +64,20 @@ static int enumerate_pci_host_bridges(Object *obj, void *opaque)
return 0;
}
+static gint pci_host_range_compare(gconstpointer a, gconstpointer b)
+{
+ struct viot_pci_host_range *range_a = (struct viot_pci_host_range *)a;
+ struct viot_pci_host_range *range_b = (struct viot_pci_host_range *)b;
+
+ if (range_a->min_bus < range_b->min_bus) {
+ return -1;
+ } else if (range_a->min_bus > range_b->min_bus) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
/*
* Generate a VIOT table with one PCI-based virtio-iommu that manages PCI
* endpoints.
@@ -87,6 +101,9 @@ void build_viot(MachineState *ms, GArray *table_data, BIOSLinker *linker,
object_child_foreach_recursive(OBJECT(ms), enumerate_pci_host_bridges,
pci_host_ranges);
+ /* Sort the pci host ranges by min_bus */
+ g_array_sort(pci_host_ranges, pci_host_range_compare);
+
/* ACPI table header */
acpi_table_begin(&table, table_data);
/* Node count */