Message ID | 1477899280-29857-3-git-send-email-peterx@redhat.com |
---|---|
State | New |
Headers | show |
On Mon, 31 Oct 2016 15:34:39 +0800 Peter Xu <peterx@redhat.com> wrote: > We should not use cpu_to_le16() here, instead each of device/function > value is stored in a 8 byte field. > > Signed-off-by: Peter Xu <peterx@redhat.com> it better matches spec and the same as linux kernel handles 'path' so Reviewed-by: Igor Mammedov <imammedo@redhat.com> > --- > hw/i386/acpi-build.c | 3 ++- > include/hw/acpi/acpi-defs.h | 5 ++++- > 2 files changed, 6 insertions(+), 2 deletions(-) > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index 93be96f..263ed3b 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -2599,7 +2599,8 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker) > scope->length = ioapic_scope_size; > scope->enumeration_id = ACPI_BUILD_IOAPIC_ID; > scope->bus = Q35_PSEUDO_BUS_PLATFORM; > - scope->path[0] = cpu_to_le16(Q35_PSEUDO_DEVFN_IOAPIC); > + scope->path[0].device = PCI_SLOT(Q35_PSEUDO_DEVFN_IOAPIC); > + scope->path[0].function = PCI_FUNC(Q35_PSEUDO_DEVFN_IOAPIC); > > build_header(linker, table_data, (void *)(table_data->data + dmar_start), > "DMAR", table_data->len - dmar_start, 1, NULL, NULL); > diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h > index d1d1d61..154f3b8 100644 > --- a/include/hw/acpi/acpi-defs.h > +++ b/include/hw/acpi/acpi-defs.h > @@ -619,7 +619,10 @@ struct AcpiDmarDeviceScope { > uint16_t reserved; > uint8_t enumeration_id; > uint8_t bus; > - uint16_t path[0]; /* list of dev:func pairs */ > + struct { > + uint8_t device; > + uint8_t function; > + } path[0]; > } QEMU_PACKED; > typedef struct AcpiDmarDeviceScope AcpiDmarDeviceScope; >
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 93be96f..263ed3b 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -2599,7 +2599,8 @@ build_dmar_q35(GArray *table_data, BIOSLinker *linker) scope->length = ioapic_scope_size; scope->enumeration_id = ACPI_BUILD_IOAPIC_ID; scope->bus = Q35_PSEUDO_BUS_PLATFORM; - scope->path[0] = cpu_to_le16(Q35_PSEUDO_DEVFN_IOAPIC); + scope->path[0].device = PCI_SLOT(Q35_PSEUDO_DEVFN_IOAPIC); + scope->path[0].function = PCI_FUNC(Q35_PSEUDO_DEVFN_IOAPIC); build_header(linker, table_data, (void *)(table_data->data + dmar_start), "DMAR", table_data->len - dmar_start, 1, NULL, NULL); diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h index d1d1d61..154f3b8 100644 --- a/include/hw/acpi/acpi-defs.h +++ b/include/hw/acpi/acpi-defs.h @@ -619,7 +619,10 @@ struct AcpiDmarDeviceScope { uint16_t reserved; uint8_t enumeration_id; uint8_t bus; - uint16_t path[0]; /* list of dev:func pairs */ + struct { + uint8_t device; + uint8_t function; + } path[0]; } QEMU_PACKED; typedef struct AcpiDmarDeviceScope AcpiDmarDeviceScope;
We should not use cpu_to_le16() here, instead each of device/function value is stored in a 8 byte field. Signed-off-by: Peter Xu <peterx@redhat.com> --- hw/i386/acpi-build.c | 3 ++- include/hw/acpi/acpi-defs.h | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-)