All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables
@ 2021-06-25  9:17 Igor Mammedov
  2021-06-25  9:17 ` [PATCH 01/53] tests: acpi: dump table with failed checksum Igor Mammedov
                   ` (54 more replies)
  0 siblings, 55 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Highlights:
  * drop pointer arithmetic in ACPI tables code
  * use endian agnostic API
  * simplifies review of tables. /in most cases just line by line comparision with spec/

Series replaces build_header() with acpi_init_table()/acpi_table_composed()
API that hides pointer/offset arithmetic from user, to prevent
errors caused by it [1].
While doing above, it was necessary to split table header from
packed structure that was describing the table, which is
counter-productive since it still leaves packed structure drawbacks.
So that sort of forced me to rewrite tables that were composed with
help of packed structures to preferred build_append_int_noprefix() API.
In cases where switch to build_append_int_noprefix() was small, it was
combined with acpi_init_table()/acpi_table_composed() patch.
Conversion reduced code size quite a bit despite me adding doc comments
for every table row.

Series also includes optional qtest patches that add missing acpi
tests for tables that I'm touching to verify conversion changes.
That includes an alternative build time based impl. of
qtest_has_accel() API. So if we start bike-shedding this qtest_has_accel()
we can safely drop all tests included, till the time discussion settles
and some form of a qtest_has_accel() is merged, at which point I'd respin
depended tests.

1) commits
   bb9feea43179 x86: acpi: use offset instead of pointer when using build_header()
   4d027afeb3a9 Virt: ACPI: fix qemu assert due to re-assigned table data address

Link to repo:
   https://gitlab.com/imammedo/qemu/-/commits/acpi_build_header_refactoring

CC: mst@redhat.com

Igor Mammedov (53):
  tests: acpi: dump table with failed checksum
  tests: qtest: add qtest_has_accel() to check if tested binary supports
    accelerator
  tests: acpi: whitelist expected tables for acpi/q35/numamem testcase
  tests: acpi: q35: test for x2APIC entries in SRAT
  tests: acpi: update expected tables blobs
  tests: acpi: whitelist new expected table
    tests/data/acpi/q35/DMAR.dmar
  tests: acpi: add testcase for intel_iommu (DMAR table)
  tests: acpi: add expected blob for DMAR table
  tests: acpi: whitelist expected blobs for new acpi/q35/ivrs testcase
  tests: acpi: add testcase for amd-iommu (IVRS table)
  tests: acpi: update expected blobs
  tests: acpi: arm/virt: drop redundant test_acpi_one() in
    test_acpi_virt_tcg()
  tests: acpi: whitelist expected tables for acpi/virt/iort testcase
  tests: acpi: arm/virt: use kvm to test IORT table
  tests: acpi: add expected IORT table blob
  tests: arm-cpu-features: use qtest_has_kvm() API
  tests: migration-test: use qtest_has_accel() API
  tests: bios-tables-test: use qtest_has_accel() API to register TCG
    only tests
  acpi: add helper routines to initialize ACPI tables
  acpi: build_rsdt: use acpi_init_table()/acpi_table_composed() instead
    of build_header()
  acpi: build_xsdt: use acpi_init_table()/acpi_table_composed() instead
    of build_header()
  acpi: build_slit: use acpi_init_table()/acpi_table_composed() instead
    of build_header()
  acpi: build_fadt: use acpi_init_table()/acpi_table_composed() instead
    of build_header()
  acpi: build_tpm2: use acpi_init_table()/acpi_table_composed() instead
    of build_header()
  acpi: acpi_build_hest: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: build_mcfg: use acpi_init_table()/acpi_table_composed() instead
    of build_header()
  acpi: build_hmat: use acpi_init_table()/acpi_table_composed() instead
    of build_header()
  acpi: nvdimm_build_nfit: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: nvdimm_build_ssdt: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: vmgenid_build_acpi: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: x86: build_dsdt: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: build_hpet: use acpi_init_table()/acpi_table_composed() instead
    of build_header()
  acpi: build_tpm_tcpa: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: arm/x86: build_srat: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: use build_append_int_noprefix() API to compose SRAT table
  acpi: build_dmar_q35: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: build_waet: use acpi_init_table()/acpi_table_composed() instead
    of build_header()
  acpi: build_amd_iommu: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: madt: arm/x86: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: x86: remove dead code
  acpi: x86: set enabled when composing _MAT entries
  acpi: x86: madt: use build_append_int_noprefix() API to compose MADT
    table
  acpi: arm/virt: madt: use build_append_int_noprefix() API to compose
    MADT table
  acpi: build_dsdt_microvm: use acpi_init_table()/acpi_table_composed()
    instead of build_header()
  acpi: arm: virt: build_dsdt: use
    acpi_init_table()/acpi_table_composed() instead of build_header()
  acpi: arm: virt: build_iort: use
    acpi_init_table()/acpi_table_composed() instead of build_header()
  acpi: arm/virt: convert build_iort() to endian agnostic
    build_append_FOO() API
  acpi: arm/virt: build_spcr: fix invalid cast
  acpi: arm/virt: build_spcr: use
    acpi_init_table()/acpi_table_composed() instead of build_header()
  acpi: arm/virt: build_gtdt: use
    acpi_init_table()/acpi_table_composed() instead of build_header()
  acpi: build_facs: use build_append_int_noprefix() API to compose table
  acpi: remove no longer used build_header()
  acpi: AcpiGenericAddress no longer used to map/access fields of MMIO,
    drop packed attribute

 include/hw/acpi/acpi-defs.h          | 528 +------------------------
 include/hw/acpi/acpi_dev_interface.h |   3 +-
 include/hw/acpi/aml-build.h          |  21 +-
 include/hw/i386/pc.h                 |   7 +-
 tests/qtest/libqos/libqtest.h        |   8 +
 hw/acpi/acpi-x86-stub.c              |   3 +-
 hw/acpi/aml-build.c                  | 188 +++++----
 hw/acpi/cpu.c                        |  17 +-
 hw/acpi/ghes.c                       |  10 +-
 hw/acpi/hmat.c                       |  14 +-
 hw/acpi/nvdimm.c                     |  64 ++--
 hw/acpi/pci.c                        |  18 +-
 hw/acpi/vmgenid.c                    |  16 +-
 hw/arm/virt-acpi-build.c             | 550 +++++++++++++++------------
 hw/i386/acpi-build.c                 | 285 +++++++-------
 hw/i386/acpi-common.c                | 158 ++++----
 hw/i386/acpi-microvm.c               |  13 +-
 meson.build                          |   6 +
 tests/data/acpi/q35/APIC.numamem     | Bin 0 -> 2686 bytes
 tests/data/acpi/q35/DMAR.dmar        | Bin 0 -> 80 bytes
 tests/data/acpi/q35/DSDT.ivrs        | Bin 0 -> 7877 bytes
 tests/data/acpi/q35/DSDT.numamem     | Bin 7865 -> 35222 bytes
 tests/data/acpi/q35/FACP.numamem     | Bin 0 -> 244 bytes
 tests/data/acpi/q35/IVRS.ivrs        | Bin 0 -> 104 bytes
 tests/data/acpi/q35/SRAT.numamem     | Bin 224 -> 5080 bytes
 tests/data/acpi/virt/IORT.iort       | Bin 0 -> 124 bytes
 tests/qtest/acpi-utils.c             |  14 +
 tests/qtest/arm-cpu-features.c       |  29 +-
 tests/qtest/bios-tables-test.c       |  85 ++++-
 tests/qtest/libqtest.c               |  27 ++
 tests/qtest/migration-test.c         |  15 +-
 31 files changed, 873 insertions(+), 1206 deletions(-)
 create mode 100644 tests/data/acpi/q35/APIC.numamem
 create mode 100644 tests/data/acpi/q35/DMAR.dmar
 create mode 100644 tests/data/acpi/q35/DSDT.ivrs
 create mode 100644 tests/data/acpi/q35/FACP.numamem
 create mode 100644 tests/data/acpi/q35/IVRS.ivrs
 create mode 100644 tests/data/acpi/virt/IORT.iort

--
2.27.0



^ permalink raw reply	[flat|nested] 71+ messages in thread

* [PATCH 01/53] tests: acpi: dump table with failed checksum
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 02/53] tests: qtest: add qtest_has_accel() to check if tested binary supports accelerator Igor Mammedov
                   ` (53 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, thuth, mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: mst@redhat.com
CC: thuth@redhat.com
CC: lvivier@redhat.com
---
 tests/qtest/acpi-utils.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/tests/qtest/acpi-utils.c b/tests/qtest/acpi-utils.c
index d2a202efca..766c48e3a6 100644
--- a/tests/qtest/acpi-utils.c
+++ b/tests/qtest/acpi-utils.c
@@ -98,6 +98,20 @@ void acpi_fetch_table(QTestState *qts, uint8_t **aml, uint32_t *aml_len,
         ACPI_ASSERT_CMP(**aml, sig);
     }
     if (verify_checksum) {
+        if (acpi_calc_checksum(*aml, *aml_len)) {
+            gint fd, ret;
+            char *fname = NULL;
+            GError *error = NULL;
+
+            fprintf(stderr, "Invalid '%.4s'(%d)\n", *aml, *aml_len);
+            fd = g_file_open_tmp("malformed-XXXXXX.dat", &fname, &error);
+            g_assert_no_error(error);
+            fprintf(stderr, "Dumping invalid table into '%s'\n", fname);
+            ret = qemu_write_full(fd, *aml, *aml_len);
+            g_assert(ret == *aml_len);
+            close(fd);
+            g_free(fname);
+        }
         g_assert(!acpi_calc_checksum(*aml, *aml_len));
     }
 }
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 02/53] tests: qtest: add qtest_has_accel() to check if tested binary supports accelerator
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
  2021-06-25  9:17 ` [PATCH 01/53] tests: acpi: dump table with failed checksum Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:33   ` Philippe Mathieu-Daudé
  2021-06-25  9:17 ` [PATCH 03/53] tests: acpi: whitelist expected tables for acpi/q35/numamem testcase Igor Mammedov
                   ` (52 subsequent siblings)
  54 siblings, 1 reply; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, thuth, f4bug, mst

Currently it is not possible to create tests that have KVM as a hard
requirement on a host that doesn't support KVM for tested target
binary (modulo going through the trouble of compiling out
the offending test case).

Following scenario makes test fail when it's run on non x86 host:
  qemu-system-x86_64 -enable-kvm -M q35,kernel-irqchip=on -smp 1,maxcpus=288

This patch introduces qtest_has_accel() to let users check if accel is
available in advance and avoid executing non run-able test-cases.

It implements detection of TCG and KVM only, the rest could be
added later on, when we actually start testing them in qtest.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
PS:
There is an alternative 'runtime' approach on list:
'query-accels' series.
https://patchwork.kernel.org/project/qemu-devel/patch/20210503211020.894589-4-philmd@redhat.com/

on upside this impl. much cheaper to execute than the 'query-accels'
as it doesn't need to run QEMU for probing.

v4:
  - s/qtest_has_kvm/qtest_has_accel/
  - add TCG detection (based on --disable-tcg)
v3:
  - make it work with --disable-kvm
       (Claudio Fontana <cfontana@suse.de>)
v2:
  - fix access() check.
     s/access()/!access()/
  - format C array items at meson.build time

CC: thuth@redhat.com
CC: lvivier@redhat.com
CC: f4bug@amsat.org
---
 tests/qtest/libqos/libqtest.h |  8 ++++++++
 meson.build                   |  6 ++++++
 tests/qtest/libqtest.c        | 27 +++++++++++++++++++++++++++
 3 files changed, 41 insertions(+)

diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
index a68dcd79d4..59e9271195 100644
--- a/tests/qtest/libqos/libqtest.h
+++ b/tests/qtest/libqos/libqtest.h
@@ -588,6 +588,14 @@ bool qtest_big_endian(QTestState *s);
  */
 const char *qtest_get_arch(void);
 
+/**
+ * qtest_has_accel:
+ * @accel_name: Accelerator name to check for.
+ *
+ * Returns: true if the accelerator is built in.
+ */
+bool qtest_has_accel(const char *accel_name);
+
 /**
  * qtest_add_func:
  * @str: Test case path.
diff --git a/meson.build b/meson.build
index d8a92666fb..7eeb201179 100644
--- a/meson.build
+++ b/meson.build
@@ -76,6 +76,12 @@ else
   kvm_targets = []
 endif
 
+kvm_targets_c = ''
+if not get_option('kvm').disabled() and targetos == 'linux'
+  kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
+endif
+config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
+
 accelerator_targets = { 'CONFIG_KVM': kvm_targets }
 if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
   # i368 emulator provides xenpv machine type for multiple architectures
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 825b13a44c..643769e416 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -920,6 +920,33 @@ const char *qtest_get_arch(void)
     return end + 1;
 }
 
+bool qtest_has_accel(const char *accel_name)
+{
+    if (g_str_equal(accel_name, "tcg")) {
+#if defined(CONFIG_TCG)
+        return true;
+#else
+        return false;
+#endif
+    } else if (g_str_equal(accel_name, "kvm")) {
+        int i;
+        const char *arch = qtest_get_arch();
+        const char *targets[] = { CONFIG_KVM_TARGETS };
+
+        for (i = 0; i < ARRAY_SIZE(targets); i++) {
+            if (!strncmp(targets[i], arch, strlen(arch))) {
+                if (!access("/dev/kvm", R_OK | W_OK)) {
+                    return true;
+                }
+            }
+        }
+    } else {
+        /* not implemented */
+        g_assert_not_reached();
+    }
+    return false;
+}
+
 bool qtest_get_irq(QTestState *s, int num)
 {
     /* dummy operation in order to make sure irq is up to date */
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 03/53] tests: acpi: whitelist expected tables for acpi/q35/numamem testcase
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
  2021-06-25  9:17 ` [PATCH 01/53] tests: acpi: dump table with failed checksum Igor Mammedov
  2021-06-25  9:17 ` [PATCH 02/53] tests: qtest: add qtest_has_accel() to check if tested binary supports accelerator Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 04/53] tests: acpi: q35: test for x2APIC entries in SRAT Igor Mammedov
                   ` (51 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/qtest/bios-tables-test-allowed-diff.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index dfb8523c8b..9db598f9fe 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1 +1,5 @@
 /* List of comma-separated changed AML files to ignore */
+"tests/data/acpi/q35/DSDT.numamem",
+"tests/data/acpi/q35/SRAT.numamem",
+"tests/data/acpi/q35/FACP",
+"tests/data/acpi/q35/APIC",
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 04/53] tests: acpi: q35: test for x2APIC entries in SRAT
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (2 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 03/53] tests: acpi: whitelist expected tables for acpi/q35/numamem testcase Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-07-02 14:45   ` Michael S. Tsirkin
  2021-06-25  9:17 ` [PATCH 05/53] tests: acpi: update expected tables blobs Igor Mammedov
                   ` (50 subsequent siblings)
  54 siblings, 1 reply; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, thuth, mst

Set -smp 1,maxcpus=288 to test for ACPI code that
deal with CPUs with large APIC ID (>255).

PS:
Test requires KVM and in-kernel irqchip support,
so skip test if KVM is not available.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  - switch to qtest_has_accel() API

CC: thuth@redhat.com
CC: lvivier@redhat.com
---
 tests/qtest/bios-tables-test.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index 51d3a4e239..ca496819fa 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1021,7 +1021,7 @@ static void test_acpi_piix4_tcg_nohpet(void)
     free_test_data(&data);
 }
 
-static void test_acpi_q35_tcg_numamem(void)
+static void test_acpi_q35_kvm_numamem(void)
 {
     test_data data;
 
@@ -1029,7 +1029,9 @@ static void test_acpi_q35_tcg_numamem(void)
     data.machine = MACHINE_Q35;
     data.variant = ".numamem";
     test_acpi_one(" -object memory-backend-ram,id=ram0,size=128M"
-                  " -numa node -numa node,memdev=ram0", &data);
+                  " -numa node -numa node,memdev=ram0"
+                  " -machine kernel-irqchip=on -smp 1,maxcpus=288"
+                   , &data);
     free_test_data(&data);
 }
 
@@ -1506,6 +1508,7 @@ static void test_acpi_oem_fields_virt(void)
 int main(int argc, char *argv[])
 {
     const char *arch = qtest_get_arch();
+    const bool has_kvm = qtest_has_accel("kvm");
     int ret;
 
     g_test_init(&argc, &argv, NULL);
@@ -1536,7 +1539,6 @@ int main(int argc, char *argv[])
         qtest_add_func("acpi/piix4/memhp", test_acpi_piix4_tcg_memhp);
         qtest_add_func("acpi/q35/memhp", test_acpi_q35_tcg_memhp);
         qtest_add_func("acpi/piix4/numamem", test_acpi_piix4_tcg_numamem);
-        qtest_add_func("acpi/q35/numamem", test_acpi_q35_tcg_numamem);
         qtest_add_func("acpi/piix4/nosmm", test_acpi_piix4_tcg_nosmm);
         qtest_add_func("acpi/piix4/smm-compat",
                        test_acpi_piix4_tcg_smm_compat);
@@ -1561,6 +1563,9 @@ int main(int argc, char *argv[])
         if (strcmp(arch, "x86_64") == 0) {
             qtest_add_func("acpi/microvm/pcie", test_acpi_microvm_pcie_tcg);
         }
+        if (has_kvm) {
+            qtest_add_func("acpi/q35/numamem", test_acpi_q35_kvm_numamem);
+        }
     } else if (strcmp(arch, "aarch64") == 0) {
         qtest_add_func("acpi/virt", test_acpi_virt_tcg);
         qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 05/53] tests: acpi: update expected tables blobs
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (3 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 04/53] tests: acpi: q35: test for x2APIC entries in SRAT Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 06/53] tests: acpi: whitelist new expected table tests/data/acpi/q35/DMAR.dmar Igor Mammedov
                   ` (49 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Update adds CPU entries to MADT/SRAT/FACP and DSDT to cover 288 CPUs.
Notable changes are that CPUs with APIC ID 255 and higher
use 'Processor Local x2APIC Affinity' structure in SRAT and
"Device" element in DSDT.

FACP:
-                 Use APIC Cluster Model (V4) : 0
+                 Use APIC Cluster Model (V4) : 1

SRAT:
...
+[1010h 4112   1]                Subtable Type : 00 [Processor Local APIC/SAPIC Affinity]
+[1011h 4113   1]                       Length : 10
+
+[1012h 4114   1]      Proximity Domain Low(8) : 00
+[1013h 4115   1]                      Apic ID : FE
+[1014h 4116   4]        Flags (decoded below) : 00000001
+                                     Enabled : 1
+[1018h 4120   1]              Local Sapic EID : 00
+[1019h 4121   3]    Proximity Domain High(24) : 000000
+[101Ch 4124   4]                 Clock Domain : 00000000
+
+[1020h 4128   1]                Subtable Type : 02 [Processor Local x2APIC Affinity]
+[1021h 4129   1]                       Length : 18
+
+[1022h 4130   2]                    Reserved1 : 0000
+[1024h 4132   4]             Proximity Domain : 00000001
+[1028h 4136   4]                      Apic ID : 000000FF
+[102Ch 4140   4]        Flags (decoded below) : 00000001
+                                     Enabled : 1
+[1030h 4144   4]                 Clock Domain : 00000000
+[1034h 4148   4]                    Reserved2 : 00000000

...

+[1320h 4896   1]                Subtable Type : 02 [Processor Local x2APIC Affinity]
+[1321h 4897   1]                       Length : 18
+
+[1322h 4898   2]                    Reserved1 : 0000
+[1324h 4900   4]             Proximity Domain : 00000001
+[1328h 4904   4]                      Apic ID : 0000011F
+[132Ch 4908   4]        Flags (decoded below) : 00000001
+                                     Enabled : 1
+[1330h 4912   4]                 Clock Domain : 00000000
+[1334h 4916   4]                    Reserved2 : 00000000

DSDT:

...
+            Processor (C0FE, 0xFE, 0x00000000, 0x00)
+            {
...
+            }
+
+            Device (C0FF)
+            {
+                Name (_HID, "ACPI0007" /* Processor Device */)  // _HID: Hardware ID
+                Name (_UID, 0xFF)  // _UID: Unique ID
...
+            }

+            Device (C11F)
+            {
+                Name (_HID, "ACPI0007" /* Processor Device */)  // _HID: Hardware ID
+                Name (_UID, 0x011F)  // _UID: Unique ID
...
+            }

APIC:
+[034h 0052   1]                Subtable Type : 00 [Processor Local APIC]
+[035h 0053   1]                       Length : 08
+[036h 0054   1]                 Processor ID : 01
+[037h 0055   1]                Local Apic ID : 01
+[038h 0056   4]        Flags (decoded below) : 00000000
+                           Processor Enabled : 0

...

+[81Ch 2076   1]                Subtable Type : 00 [Processor Local APIC]
+[81Dh 2077   1]                       Length : 08
+[81Eh 2078   1]                 Processor ID : FE
+[81Fh 2079   1]                Local Apic ID : FE
+[820h 2080   4]        Flags (decoded below) : 00000000
+                           Processor Enabled : 0
+
+[824h 2084   1]                Subtable Type : 09 [Processor Local x2APIC]
+[825h 2085   1]                       Length : 10
+[826h 2086   2]                     Reserved : 0000
+[828h 2088   4]          Processor x2Apic ID : 000000FF
+[82Ch 2092   4]        Flags (decoded below) : 00000000
+                           Processor Enabled : 0
+[830h 2096   4]                Processor UID : 000000FF

...

+[A24h 2596   1]                Subtable Type : 09 [Processor Local x2APIC]
+[A25h 2597   1]                       Length : 10
+[A26h 2598   2]                     Reserved : 0000
+[A28h 2600   4]          Processor x2Apic ID : 0000011F
+[A2Ch 2604   4]        Flags (decoded below) : 00000000
+                           Processor Enabled : 0
+[A30h 2608   4]                Processor UID : 0000011F
+
+[A34h 2612   1]                Subtable Type : 01 [I/O APIC]
+[A35h 2613   1]                       Length : 0C
+[A36h 2614   1]                  I/O Apic ID : 00
+[A37h 2615   1]                     Reserved : 00
+[A38h 2616   4]                      Address : FEC00000
+[A3Ch 2620   4]                    Interrupt : 00000000
+
+[A40h 2624   1]                Subtable Type : 02 [Interrupt Source Override]
+[A41h 2625   1]                       Length : 0A
+[A42h 2626   1]                          Bus : 00
+[A43h 2627   1]                       Source : 00
+[A44h 2628   4]                    Interrupt : 00000002
+[A48h 2632   2]        Flags (decoded below) : 0000
                                     Polarity : 0
                                 Trigger Mode : 0

-[04Ah 0074   1]                Subtable Type : 02 [Interrupt Source Override]
-[04Bh 0075   1]                       Length : 0A
-[04Ch 0076   1]                          Bus : 00
-[04Dh 0077   1]                       Source : 05
-[04Eh 0078   4]                    Interrupt : 00000005
-[052h 0082   2]        Flags (decoded below) : 000D
+[A4Ah 2634   1]                Subtable Type : 02 [Interrupt Source Override]
+[A4Bh 2635   1]                       Length : 0A
+[A4Ch 2636   1]                          Bus : 00
+[A4Dh 2637   1]                       Source : 05
+[A4Eh 2638   4]                    Interrupt : 00000005
+[A52h 2642   2]        Flags (decoded below) : 000D
                                     Polarity : 1
                                 Trigger Mode : 3

-[054h 0084   1]                Subtable Type : 02 [Interrupt Source Override]
-[055h 0085   1]                       Length : 0A
-[056h 0086   1]                          Bus : 00
-[057h 0087   1]                       Source : 09
-[058h 0088   4]                    Interrupt : 00000009
-[05Ch 0092   2]        Flags (decoded below) : 000D
+[A54h 2644   1]                Subtable Type : 02 [Interrupt Source Override]
+[A55h 2645   1]                       Length : 0A
+[A56h 2646   1]                          Bus : 00
+[A57h 2647   1]                       Source : 09
+[A58h 2648   4]                    Interrupt : 00000009
+[A5Ch 2652   2]        Flags (decoded below) : 000D
                                     Polarity : 1
                                 Trigger Mode : 3

-[05Eh 0094   1]                Subtable Type : 02 [Interrupt Source Override]
-[05Fh 0095   1]                       Length : 0A
-[060h 0096   1]                          Bus : 00
-[061h 0097   1]                       Source : 0A
-[062h 0098   4]                    Interrupt : 0000000A
-[066h 0102   2]        Flags (decoded below) : 000D
+[A5Eh 2654   1]                Subtable Type : 02 [Interrupt Source Override]
+[A5Fh 2655   1]                       Length : 0A
+[A60h 2656   1]                          Bus : 00
+[A61h 2657   1]                       Source : 0A
+[A62h 2658   4]                    Interrupt : 0000000A
+[A66h 2662   2]        Flags (decoded below) : 000D
                                     Polarity : 1
                                 Trigger Mode : 3

-[068h 0104   1]                Subtable Type : 02 [Interrupt Source Override]
-[069h 0105   1]                       Length : 0A
-[06Ah 0106   1]                          Bus : 00
-[06Bh 0107   1]                       Source : 0B
-[06Ch 0108   4]                    Interrupt : 0000000B
-[070h 0112   2]        Flags (decoded below) : 000D
+[A68h 2664   1]                Subtable Type : 02 [Interrupt Source Override]
+[A69h 2665   1]                       Length : 0A
+[A6Ah 2666   1]                          Bus : 00
+[A6Bh 2667   1]                       Source : 0B
+[A6Ch 2668   4]                    Interrupt : 0000000B
+[A70h 2672   2]        Flags (decoded below) : 000D
                                     Polarity : 1
                                 Trigger Mode : 3

-[072h 0114   1]                Subtable Type : 04 [Local APIC NMI]
-[073h 0115   1]                       Length : 06
-[074h 0116   1]                 Processor ID : FF
-[075h 0117   2]        Flags (decoded below) : 0000
+[A72h 2674   1]                Subtable Type : 0A [Local x2APIC NMI]
+[A73h 2675   1]                       Length : 0C
+[A74h 2676   2]        Flags (decoded below) : 0000
                                     Polarity : 0
                                 Trigger Mode : 0
-[077h 0119   1]         Interrupt Input LINT : 01
+[A76h 2678   4]                Processor UID : FFFFFFFF
+[A7Ah 2682   1]         Interrupt Input LINT : 01
+[A7Bh 2683   3]                     Reserved : 000000

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/qtest/bios-tables-test-allowed-diff.h |   4 ----
 tests/data/acpi/q35/APIC.numamem            | Bin 0 -> 2686 bytes
 tests/data/acpi/q35/DSDT.numamem            | Bin 7865 -> 35222 bytes
 tests/data/acpi/q35/FACP.numamem            | Bin 0 -> 244 bytes
 tests/data/acpi/q35/SRAT.numamem            | Bin 224 -> 5080 bytes
 5 files changed, 4 deletions(-)
 create mode 100644 tests/data/acpi/q35/APIC.numamem
 create mode 100644 tests/data/acpi/q35/FACP.numamem

diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index 9db598f9fe..dfb8523c8b 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1,5 +1 @@
 /* List of comma-separated changed AML files to ignore */
-"tests/data/acpi/q35/DSDT.numamem",
-"tests/data/acpi/q35/SRAT.numamem",
-"tests/data/acpi/q35/FACP",
-"tests/data/acpi/q35/APIC",
diff --git a/tests/data/acpi/q35/APIC.numamem b/tests/data/acpi/q35/APIC.numamem
new file mode 100644
index 0000000000000000000000000000000000000000..c1969c35aa12b61d25e0134bbb8d2187ba42d663
GIT binary patch
literal 2686
zcmXZeQ+OOv7=Yo~aI?wAcAeU0vPDuQZHm;k?bNny+g57ZPHkIh=b!JKoA-S43@*-G
z{Lu+<wq%Q@nWAFiZLx`wF-ZxwNPU?!O_RN-X{l+3X8k@%vx&=QJ3C3uY;TVa4(RBJ
zPEP3TjAs1}`ZBw?phf?(w5uz+xuMmH?(XQ}fu5e|<%Qnf=;MRFzUb$N{{9#cfPsM+
z6okRS7!rb^p%@m1;o%q&fsv7zE*+*%j~Oyx#*COL6K2kgS+ZbM6lTqe*|K5w?3g15
z=FEw?a$)Y=m?sbB&5QZ+VgCGBpa2#uh=mGa;lfy?2o^1h#fo9^;#i^tmMn>-N@3~J
zSf&g{M`KJ3+H6?1ES4*W<;!D*3K$!UadB9&B37z|l`CVFDp<8D#>Znq0#>Vr)vIG-
zBG#yZHEUw6T3EX_CM98=I#{<Z)~kp0>tllk*svisYJ`m&W0NM>v?(@ghRvH}ix$|j
zCAMmXty^Q8HrTc;wrhv&+hd0g*s&va>V%y;W0x-2wJUb(hTXekj~>{wC-&-vy?bMy
zKG?S}_UniJ`{RHCn4F9Q2jZYXICwA)8G=KH;;>;jd^nC6fg?xas8Kk2G>#dAW5?pS
zaX5ZFPMClbC*q_@IC(NonSxWN;<RZveLBvVfiq{~tXVjFHqM!YbLZl`c{qPQE?9sI
z7viEtxOg!xS%OQK;<9D9d^xUIfh$+ys#UmpHLh8MYuDnsb+~>#ZrFeuH{zyExOp>f
z*@9cQ;<jzLeLL>hfjf8Nu3fl$H}2Vkd-vkLeYk%=9yovp4`NCR9y)}F595&|c=RY9
zJBG)P<B1b^@+6)*g{M#BnKO9yES@`u=g;GX3wZG&Ub=*rFXNRfc=ak?yN1`V<Bc15
z^CsT9g|~0xojZ8<F5bI`_wVC_2bh|Q4<F*ANBH<LK6!#qpW?G;`20D(c!4ip;;UEq
z`Zd0JgKyvByLb5hJ%0FrA3x%!Px$#We))o5zv8!V`29Qn_<=uv;;&!$`#1jigMa^G
zTAJwMscHX=3n<MXfYNFrFqF14@qj38uUeFLP%TP3surc4REyHiszqtDYEjxnwJ2>-
zElRtp7Ny-(i_%urqO`keQQAYbDDA0Ql=f0BN_(porF~S3(!Q!iX+PDXw7+UmIzY83
z9jIEA4pJ>j2dfsPLsW~>p{hmcFx8@TxN1>4LbYgele0}R{tY{ee%8iO>pNrYvugUz
Y81RgpG2$6JW5}~=7X9ge`jQv^2Net*5C8xG

literal 0
HcmV?d00001

diff --git a/tests/data/acpi/q35/DSDT.numamem b/tests/data/acpi/q35/DSDT.numamem
index e4c4582e7f76b072ab1123c748b89ea33ea1db87..8458aad2484bc48a95f2df37109a4dbfe8cee893 100644
GIT binary patch
literal 35222
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
J<yus5@qf_;rqTca

delta 94
zcmV-k0HObulLEOt3Pe*xRJk4i00Ee>3d$G)ML(0*7_b6EG?R)MBoGlpR7P0>pbC>{
z0ER;_Fffx+C&>XulN=~47eo@1WC3shWN-msZ~$SVObn2dU;&k5qhTllv!;je0adac
Axc~qF

diff --git a/tests/data/acpi/q35/FACP.numamem b/tests/data/acpi/q35/FACP.numamem
new file mode 100644
index 0000000000000000000000000000000000000000..2d3659c9c6753d07c3d48742343cb8e8cc034de7
GIT binary patch
literal 244
zcmZ>BbPo8!z`($~)yd!4BUr&HBEVSz2pEB4AU24G0Y(N+hD|^Y6El!tgNU*~X%LSC
z$X0-fGcm9T0LA|E|L2FOWMD7?GM2WmFfej3F#P0!h{7ddihwku0+2v57svwxMxcSn
X_QAxFX+{NzJ3wNL4G8yu_%Hwf>QN2>

literal 0
HcmV?d00001

diff --git a/tests/data/acpi/q35/SRAT.numamem b/tests/data/acpi/q35/SRAT.numamem
index 56da58e2699cb13fcd41b5e1667ceeddbdd443b5..097b11d8de2cc7aa8d76154a0082252ba5b735dd 100644
GIT binary patch
literal 5080
zcmaLbd6dm{9LDkI8Ot!XVJu@`t0`@??-_-(kWnd>79~p3riHZ7CW?yoi1w8>?P!mp
zg;WZqXtlP<HlOK?nfE>4<9E(I_rBiW=g;4{=XY;Wj}AQ-=1Fc_*sWuiq85d{x_4|*
zd|6U_j`w(Ny>c^cXPjrzu0X3I?Mk#N)6S+<g?3e1Ikc<Ms!qEGt(vrJ(aNP=n^qm#
zd9>=%u1Bjr?FO{+X*Z<Rh<0OIO=vfz)r@v?S|#^J+5O;_8RxBNx2DyG_I9+kr@aHM
z0@^#$+KF~sT07I;h1RaLccZmC?RK=<)82#Dp0xL(wKwg3XzfdTKU(|KK7iJNv=5?n
zFzrKV9ZI_ctwP!*-yvo9iw?^;Kb%%4+MQ{2p?w6cuC$M&brkKRX&pnm8?ElNkEPXv
zb`h<fw2z~8Jna)`^`d<ut&?c?rgbvyQ)rz^yAQ3?XrE5&4BBVX>P!19T4&SlN9!Eg
z{b>!LeJ-u@Xb+@yKJ7uYE}%V_)`he$qIEItOK4q6dkC$|XkSk23ffoF8cKT@t*dAc
zr*$>$YiM0d`#M@9Xpf|IJ?$H4-AMZ;S~t@kMe7#YqiKzyeJicoXpf~ej`r=e?x1}q
zt?{%c(7KEE-L&qZeJ`#1Xx~rk0oo7Jnn-&Rt%qn&rZt83!?Yfu{V1)+Xg^Nt3EEH6
zdW!bbw4R~;EUo8gPo*`D_Vct}p#37PmuSCCYdY;$XuV4NHCnIJeuLJVwBMpNgZ4~X
zvuM9f>mAzf(t3~f`?Nlw{UNQ7XwRlKhxW&`KA}CA);!vu()x_{=d`|{J)hPB+F#OI
zNc$^VU(^1E)*{;9()y0}Vp>aRFQxT8?H_0@qx~bTpJ*?qwSxA~w0@!eE3MyX|4!=<
z+AC?TqP?2d8ro}Vt)u-Xt-omhP3s@p|I%7d`#)M6Xm6yosl2oD|Np(ex%dG-vzI*6
z7st#VcB02VE74<LA<<)BG0|gRDbZtJIniUEo#?TzlIXFon&`35N%YuPOZ3=RPxRQ=
zNc7m(O!U~-O7z(0CVK2^CwlDbBzo-g5<T{H6Fv6z5<T|y6Fv3~5<T|$i5~lgi5~k#
zi5~mLi5~kVi5~l=i5~lAi5~mr8Qld@%U?NLQU0WCSNz9W$+arGbjV$4-S)c+wtZfD
Fx&<~`p8)^>

delta 22
ecmcbi{(zAyILI;N0RsaA<NAqQW|J+17XScN1_uNH

-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 06/53] tests: acpi: whitelist new expected table tests/data/acpi/q35/DMAR.dmar
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (4 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 05/53] tests: acpi: update expected tables blobs Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 07/53] tests: acpi: add testcase for intel_iommu (DMAR table) Igor Mammedov
                   ` (48 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/qtest/bios-tables-test-allowed-diff.h | 1 +
 tests/data/acpi/q35/DMAR.dmar               | 0
 2 files changed, 1 insertion(+)
 create mode 100644 tests/data/acpi/q35/DMAR.dmar

diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index dfb8523c8b..a2843335c8 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1 +1,2 @@
 /* List of comma-separated changed AML files to ignore */
+"tests/data/acpi/q35/DMAR.dmar",
diff --git a/tests/data/acpi/q35/DMAR.dmar b/tests/data/acpi/q35/DMAR.dmar
new file mode 100644
index 0000000000..e69de29bb2
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 07/53] tests: acpi: add testcase for intel_iommu (DMAR table)
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (5 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 06/53] tests: acpi: whitelist new expected table tests/data/acpi/q35/DMAR.dmar Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 08/53] tests: acpi: add expected blob for DMAR table Igor Mammedov
                   ` (47 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, thuth, mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: thuth@redhat.com
CC: lvivier@redhat.com
---
 tests/qtest/bios-tables-test.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index ca496819fa..7ba208a6cc 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1079,6 +1079,18 @@ static void test_acpi_q35_tcg_nohpet(void)
     free_test_data(&data);
 }
 
+static void test_acpi_q35_tcg_dmar(void)
+{
+    test_data data;
+
+    memset(&data, 0, sizeof(data));
+    data.machine = MACHINE_Q35;
+    data.variant = ".dmar";
+    test_acpi_one("-machine kernel-irqchip=split -accel kvm"
+                  " -device intel-iommu,intremap=on,device-iotlb=on", &data);
+    free_test_data(&data);
+}
+
 static void test_acpi_piix4_tcg_numamem(void)
 {
     test_data data;
@@ -1565,6 +1577,7 @@ int main(int argc, char *argv[])
         }
         if (has_kvm) {
             qtest_add_func("acpi/q35/numamem", test_acpi_q35_kvm_numamem);
+            qtest_add_func("acpi/q35/dmar", test_acpi_q35_tcg_dmar);
         }
     } else if (strcmp(arch, "aarch64") == 0) {
         qtest_add_func("acpi/virt", test_acpi_virt_tcg);
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 08/53] tests: acpi: add expected blob for DMAR table
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (6 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 07/53] tests: acpi: add testcase for intel_iommu (DMAR table) Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 09/53] tests: acpi: whitelist expected blobs for new acpi/q35/ivrs testcase Igor Mammedov
                   ` (46 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

    [000h 0000   4]                    Signature : "DMAR"    [DMA Remapping table]
    [004h 0004   4]                 Table Length : 00000050
    [008h 0008   1]                     Revision : 01
    [009h 0009   1]                     Checksum : F4
    [00Ah 0010   6]                       Oem ID : "BOCHS "
    [010h 0016   8]                 Oem Table ID : "BXPC    "
    [018h 0024   4]                 Oem Revision : 00000001
    [01Ch 0028   4]              Asl Compiler ID : "BXPC"
    [020h 0032   4]        Asl Compiler Revision : 00000001

    [024h 0036   1]           Host Address Width : 26
    [025h 0037   1]                        Flags : 01
    [026h 0038  10]                     Reserved : 00 00 00 00 00 00 00 00 00 00

    [030h 0048   2]                Subtable Type : 0000 [Hardware Unit Definition]
    [032h 0050   2]                       Length : 0018

    [034h 0052   1]                        Flags : 01
    [035h 0053   1]                     Reserved : 00
    [036h 0054   2]           PCI Segment Number : 0000
    [038h 0056   8]        Register Base Address : 00000000FED90000

    [040h 0064   1]            Device Scope Type : 03 [IOAPIC Device]
    [041h 0065   1]                 Entry Length : 08
    [042h 0066   2]                     Reserved : 0000
    [044h 0068   1]               Enumeration ID : 00
    [045h 0069   1]               PCI Bus Number : FF

    [046h 0070   2]                     PCI Path : 00,00

    [048h 0072   2]                Subtable Type : 0002 [Root Port ATS Capability]
    [04Ah 0074   2]                       Length : 0008

    [04Ch 0076   1]                        Flags : 01
    [04Dh 0077   1]                     Reserved : 00
    [04Eh 0078   2]           PCI Segment Number : 0000

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/qtest/bios-tables-test-allowed-diff.h |   1 -
 tests/data/acpi/q35/DMAR.dmar               | Bin 0 -> 80 bytes
 2 files changed, 1 deletion(-)

diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index a2843335c8..dfb8523c8b 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1,2 +1 @@
 /* List of comma-separated changed AML files to ignore */
-"tests/data/acpi/q35/DMAR.dmar",
diff --git a/tests/data/acpi/q35/DMAR.dmar b/tests/data/acpi/q35/DMAR.dmar
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f74d25917b3ebe2914ac938e73768b83eeaa0802 100644
GIT binary patch
literal 80
zcmZ?qbqoq%U|?YU;^gn_5v<@85#X!<1dKp25F13Rfe1K|V1RIM{sRdya{!6|3=B*R
H9AI$({*?*=

literal 0
HcmV?d00001

-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 09/53] tests: acpi: whitelist expected blobs for new acpi/q35/ivrs testcase
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (7 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 08/53] tests: acpi: add expected blob for DMAR table Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 10/53] tests: acpi: add testcase for amd-iommu (IVRS table) Igor Mammedov
                   ` (45 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/qtest/bios-tables-test-allowed-diff.h | 2 ++
 tests/data/acpi/q35/IVRS.ivrs               | 0
 2 files changed, 2 insertions(+)
 create mode 100644 tests/data/acpi/q35/IVRS.ivrs

diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index dfb8523c8b..3a51c50d8f 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1 +1,3 @@
 /* List of comma-separated changed AML files to ignore */
+"tests/data/acpi/q35/DSDT",
+"tests/data/acpi/q35/IVRS.ivrs",
diff --git a/tests/data/acpi/q35/IVRS.ivrs b/tests/data/acpi/q35/IVRS.ivrs
new file mode 100644
index 0000000000..e69de29bb2
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 10/53] tests: acpi: add testcase for amd-iommu (IVRS table)
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (8 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 09/53] tests: acpi: whitelist expected blobs for new acpi/q35/ivrs testcase Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 11/53] tests: acpi: update expected blobs Igor Mammedov
                   ` (44 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, thuth, mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: thuth@redhat.com
CC: lvivier@redhat.com
---
 tests/qtest/bios-tables-test.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index 7ba208a6cc..9b36a49f96 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1091,6 +1091,18 @@ static void test_acpi_q35_tcg_dmar(void)
     free_test_data(&data);
 }
 
+static void test_acpi_q35_tcg_ivrs(void)
+{
+    test_data data;
+
+    memset(&data, 0, sizeof(data));
+    data.machine = MACHINE_Q35;
+    data.variant = ".ivrs";
+    data.tcg_only = true,
+    test_acpi_one(" -device amd-iommu", &data);
+    free_test_data(&data);
+}
+
 static void test_acpi_piix4_tcg_numamem(void)
 {
     test_data data;
@@ -1563,6 +1575,7 @@ int main(int argc, char *argv[])
         qtest_add_func("acpi/q35/smm-compat-nosmm",
                        test_acpi_q35_tcg_smm_compat_nosmm);
         qtest_add_func("acpi/q35/nohpet", test_acpi_q35_tcg_nohpet);
+        qtest_add_func("acpi/q35/ivrs", test_acpi_q35_tcg_ivrs);
         qtest_add_func("acpi/piix4/dimmpxm", test_acpi_piix4_tcg_dimm_pxm);
         qtest_add_func("acpi/q35/dimmpxm", test_acpi_q35_tcg_dimm_pxm);
         qtest_add_func("acpi/piix4/acpihmat", test_acpi_piix4_tcg_acpi_hmat);
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 11/53] tests: acpi: update expected blobs
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (9 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 10/53] tests: acpi: add testcase for amd-iommu (IVRS table) Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 12/53] tests: acpi: arm/virt: drop redudant test_acpi_one() in test_acpi_virt_tcg() Igor Mammedov
                   ` (43 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

DSDT:
+            Device (S10)
+            {
+                Name (_ADR, 0x00020000)  // _ADR: Address
+            }

New IVRS table:

[000h 0000   4]                    Signature : "IVRS"    [I/O Virtualization Reporting Structure]
[004h 0004   4]                 Table Length : 00000068
[008h 0008   1]                     Revision : 01
[009h 0009   1]                     Checksum : 43
[00Ah 0010   6]                       Oem ID : "BOCHS "
[010h 0016   8]                 Oem Table ID : "BXPC    "
[018h 0024   4]                 Oem Revision : 00000001
[01Ch 0028   4]              Asl Compiler ID : "BXPC"
[020h 0032   4]        Asl Compiler Revision : 00000001

[024h 0036   4]          Virtualization Info : 00002800
[028h 0040   8]                     Reserved : 0000000000000000

[030h 0048   1]                Subtable Type : 10 [Hardware Definition Block]
[031h 0049   1]                        Flags : D1
[032h 0050   2]                       Length : 0038
[034h 0052   2]                     DeviceId : 0010

[036h 0054   2]            Capability Offset : 0040
[038h 0056   8]                 Base Address : 00000000FED80000
[040h 0064   2]            PCI Segment Group : 0000
[042h 0066   2]          Virtualization Info : 0000
[044h 0068   4]                     Reserved : 00000044

[048h 0072   1]                   Entry Type : 02
[049h 0073   2]                    Device ID : 0000
[04Bh 0075   1]                 Data Setting : 00

[04Ch 0076   1]                   Entry Type : 02
[04Dh 0077   2]                    Device ID : 0008
[04Fh 0079   1]                 Data Setting : 00

[050h 0080   1]                   Entry Type : 02
[051h 0081   2]                    Device ID : 0010
[053h 0083   1]                 Data Setting : 00

[054h 0084   1]                   Entry Type : 02
[055h 0085   2]                    Device ID : 00F8
[057h 0087   1]                 Data Setting : 00

[058h 0088   1]                   Entry Type : 02
[059h 0089   2]                    Device ID : 00FA
[05Bh 0091   1]                 Data Setting : 00

[05Ch 0092   1]                   Entry Type : 02
[05Dh 0093   2]                    Device ID : 00FB
[05Fh 0095   1]                 Data Setting : 00

[060h 0096   1]                   Entry Type : 48
[061h 0097   2]                    Device ID : 0000
[063h 0099   1]                 Data Setting : 00
[064h 0100   1]                       Handle : 00
[065h 0101   2]        Source Used Device ID : 00A0
[067h 0103   1]                      Variety : 01

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/qtest/bios-tables-test-allowed-diff.h |   2 --
 tests/data/acpi/q35/DSDT.ivrs               | Bin 0 -> 7877 bytes
 tests/data/acpi/q35/IVRS.ivrs               | Bin 0 -> 104 bytes
 3 files changed, 2 deletions(-)
 create mode 100644 tests/data/acpi/q35/DSDT.ivrs

diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index 3a51c50d8f..dfb8523c8b 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1,3 +1 @@
 /* List of comma-separated changed AML files to ignore */
-"tests/data/acpi/q35/DSDT",
-"tests/data/acpi/q35/IVRS.ivrs",
diff --git a/tests/data/acpi/q35/DSDT.ivrs b/tests/data/acpi/q35/DSDT.ivrs
new file mode 100644
index 0000000000000000000000000000000000000000..eb5d27d95b2cdeda5f7e1f6b151cfea02e6bd907
GIT binary patch
literal 7877
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
My1vvGf*TS42iWvOY5)KL

literal 0
HcmV?d00001

diff --git a/tests/data/acpi/q35/IVRS.ivrs b/tests/data/acpi/q35/IVRS.ivrs
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..17611202e53a32f7da8e4925d6955b384670b8b1 100644
GIT binary patch
literal 104
zcmeYa3kuF)U|?W$cJg=j2v%^42yj*a0!E-1hz+6{G(ZFd2wb#a5MXcsa&G*C3Ng3<
b8B8F|0mK48`~!%80r77J1`m*;1q_S;Any(V

literal 0
HcmV?d00001

-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 12/53] tests: acpi: arm/virt: drop redudant test_acpi_one() in test_acpi_virt_tcg()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (10 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 11/53] tests: acpi: update expected blobs Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 12/53] tests: acpi: arm/virt: drop redundant " Igor Mammedov
                   ` (42 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

follow up call test_acpi_one() with smbios options generates
the same ACPI tables, so there is no need to run smbios-less
variant at all.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/qtest/bios-tables-test.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index 9b36a49f96..7084f0f795 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1416,9 +1416,6 @@ static void test_acpi_virt_tcg(void)
         .scan_len = 128ULL * 1024 * 1024,
     };
 
-    test_acpi_one("-cpu cortex-a57", &data);
-    free_test_data(&data);
-
     data.smbios_cpu_max_speed = 2900;
     data.smbios_cpu_curr_speed = 2700;
     test_acpi_one("-cpu cortex-a57 "
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 12/53] tests: acpi: arm/virt: drop redundant test_acpi_one() in test_acpi_virt_tcg()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (11 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 12/53] tests: acpi: arm/virt: drop redudant test_acpi_one() in test_acpi_virt_tcg() Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 13/53] tests: acpi: whitelist expected tables for acpi/virt/iort testcase Igor Mammedov
                   ` (41 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, drjones, qemu-arm, thuth, mst

follow up call with smbios options generates the same ACPI tables,
so there is no need to run smbios-less variant at all.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: drjones@redhat.com
CC: qemu-arm@nongnu.org
CC: thuth@redhat.com
CC: lvivier@redhat.com
---
 tests/qtest/bios-tables-test.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index 9b36a49f96..7084f0f795 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1416,9 +1416,6 @@ static void test_acpi_virt_tcg(void)
         .scan_len = 128ULL * 1024 * 1024,
     };
 
-    test_acpi_one("-cpu cortex-a57", &data);
-    free_test_data(&data);
-
     data.smbios_cpu_max_speed = 2900;
     data.smbios_cpu_curr_speed = 2700;
     test_acpi_one("-cpu cortex-a57 "
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 13/53] tests: acpi: whitelist expected tables for acpi/virt/iort testcase
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (12 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 12/53] tests: acpi: arm/virt: drop redundant " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 14/53] tests: acpi: arm/virt: use kvm to test IORT table Igor Mammedov
                   ` (40 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/qtest/bios-tables-test-allowed-diff.h | 1 +
 tests/data/acpi/virt/IORT.iort              | 0
 2 files changed, 1 insertion(+)
 create mode 100644 tests/data/acpi/virt/IORT.iort

diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index dfb8523c8b..1834a1fa2d 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1 +1,2 @@
 /* List of comma-separated changed AML files to ignore */
+"tests/data/acpi/virt/IORT.iort",
diff --git a/tests/data/acpi/virt/IORT.iort b/tests/data/acpi/virt/IORT.iort
new file mode 100644
index 0000000000..e69de29bb2
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 14/53] tests: acpi: arm/virt: use kvm to test IORT table
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (13 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 13/53] tests: acpi: whitelist expected tables for acpi/virt/iort testcase Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 15/53] tests: acpi: add expected IORT table blob Igor Mammedov
                   ` (39 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, thuth, qemu-arm, drjones, mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 - v2: switch to qtest_has_accel() API

CC: thuth@redhat.com
CC: lvivier@redhat.com
CC: drjones@redhat.com
CC: qemu-arm@nongnu.org
---
 tests/qtest/bios-tables-test.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index 7084f0f795..ebe8ec0850 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1423,6 +1423,22 @@ static void test_acpi_virt_tcg(void)
     free_test_data(&data);
 }
 
+static void test_acpi_virt_iort(void)
+{
+    test_data data = {
+        .machine = "virt",
+        .uefi_fl1 = "pc-bios/edk2-aarch64-code.fd",
+        .uefi_fl2 = "pc-bios/edk2-arm-vars.fd",
+        .cd = "tests/data/uefi-boot-images/bios-tables-test.aarch64.iso.qcow2",
+        .ram_start = 0x40000000ULL,
+        .scan_len = 128ULL * 1024 * 1024,
+    };
+
+    data.variant = ".iort";
+    test_acpi_one("-cpu host", &data);
+    free_test_data(&data);
+}
+
 static void test_oem_fields(test_data *data)
 {
     int i;
@@ -1595,6 +1611,9 @@ int main(int argc, char *argv[])
         qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
         qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
         qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
+        if (has_kvm) {
+            qtest_add_func("acpi/virt/iort", test_acpi_virt_iort);
+        }
     }
     ret = g_test_run();
     boot_sector_cleanup(disk);
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 15/53] tests: acpi: add expected IORT table blob
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (14 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 14/53] tests: acpi: arm/virt: use kvm to test IORT table Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 16/53] tests: arm-cpu-features: use qtest_has_kvm() API Igor Mammedov
                   ` (38 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/qtest/bios-tables-test-allowed-diff.h |   1 -
 tests/data/acpi/virt/IORT.iort              | Bin 0 -> 124 bytes
 2 files changed, 1 deletion(-)

diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index 1834a1fa2d..dfb8523c8b 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1,2 +1 @@
 /* List of comma-separated changed AML files to ignore */
-"tests/data/acpi/virt/IORT.iort",
diff --git a/tests/data/acpi/virt/IORT.iort b/tests/data/acpi/virt/IORT.iort
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..521acefe9ba66706c5607321a82d330586f3f280 100644
GIT binary patch
literal 124
zcmebD4+^Pa00MR=e`k+i1*eDrX9XZ&1PX!JAesq?4S*O7Bw!2(4Uz`|CKCt^;wu0#
QRGb+i3L*dhhtM#y0PN=p0RR91

literal 0
HcmV?d00001

-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 16/53] tests: arm-cpu-features: use qtest_has_kvm() API
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (15 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 15/53] tests: acpi: add expected IORT table blob Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 17/53] tests: migration-test: use qtest_has_accel() API Igor Mammedov
                   ` (37 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: lvivier, peter.maydell, thuth, mst, drjones, qemu-arm, pbonzini

and drop custom function that were doing the job

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: thuth@redhat.com
CC: lvivier@redhat.com
CC: drjones@redhat.com
CC: peter.maydell@linaro.org
CC: pbonzini@redhat.com
CC: qemu-arm@nongnu.org
---
 tests/qtest/arm-cpu-features.c | 29 +++++------------------------
 1 file changed, 5 insertions(+), 24 deletions(-)

diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
index 8252b85bb8..dbeaf59076 100644
--- a/tests/qtest/arm-cpu-features.c
+++ b/tests/qtest/arm-cpu-features.c
@@ -26,21 +26,6 @@
                     "  'arguments': { 'type': 'full', "
 #define QUERY_TAIL  "}}"
 
-static bool kvm_enabled(QTestState *qts)
-{
-    QDict *resp, *qdict;
-    bool enabled;
-
-    resp = qtest_qmp(qts, "{ 'execute': 'query-kvm' }");
-    g_assert(qdict_haskey(resp, "return"));
-    qdict = qdict_get_qdict(resp, "return");
-    g_assert(qdict_haskey(qdict, "enabled"));
-    enabled = qdict_get_bool(qdict, "enabled");
-    qobject_unref(resp);
-
-    return enabled;
-}
-
 static QDict *do_query_no_props(QTestState *qts, const char *cpu_type)
 {
     return qtest_qmp(qts, QUERY_HEAD "'model': { 'name': %s }"
@@ -493,14 +478,6 @@ static void test_query_cpu_model_expansion_kvm(const void *data)
 
     qts = qtest_init(MACHINE_KVM "-cpu max");
 
-    /*
-     * These tests target the 'host' CPU type, so KVM must be enabled.
-     */
-    if (!kvm_enabled(qts)) {
-        qtest_quit(qts);
-        return;
-    }
-
     /* Enabling and disabling kvm-no-adjvtime should always work. */
     assert_has_feature_disabled(qts, "host", "kvm-no-adjvtime");
     assert_set_feature(qts, "host", "kvm-no-adjvtime", true);
@@ -624,7 +601,11 @@ int main(int argc, char **argv)
      * order avoid attempting to run an AArch32 QEMU with KVM on
      * AArch64 hosts. That won't work and isn't easy to detect.
      */
-    if (g_str_equal(qtest_get_arch(), "aarch64")) {
+    if (g_str_equal(qtest_get_arch(), "aarch64") && qtest_has_accel("kvm")) {
+        /*
+         * This tests target the 'host' CPU type, so register it only if
+         * KVM is available.
+         */
         qtest_add_data_func("/arm/kvm/query-cpu-model-expansion",
                             NULL, test_query_cpu_model_expansion_kvm);
     }
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 17/53] tests: migration-test: use qtest_has_accel() API
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (16 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 16/53] tests: arm-cpu-features: use qtest_has_kvm() API Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 18/53] tests: bios-tables-test: use qtest_has_accel() API to register TCG only tests Igor Mammedov
                   ` (36 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, pbonzini, Thomas Huth, dgilbert, mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Suggested-by: Thomas Huth <thuth@redhat.com>
---
CC: dgilbert@redhat.com
CC: pbonzini@redhat.com
CC: thuth@redhat.com
CC: lvivier@redhat.com
---
 tests/qtest/migration-test.c | 15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
index 2b028df687..eba18433bd 100644
--- a/tests/qtest/migration-test.c
+++ b/tests/qtest/migration-test.c
@@ -1372,6 +1372,7 @@ static void test_multifd_tcp_cancel(void)
 int main(int argc, char **argv)
 {
     char template[] = "/tmp/migration-test-XXXXXX";
+    const bool has_kvm = qtest_has_accel("kvm");
     int ret;
 
     g_test_init(&argc, &argv, NULL);
@@ -1386,8 +1387,7 @@ int main(int argc, char **argv)
      * some reason)
      */
     if (g_str_equal(qtest_get_arch(), "ppc64") &&
-        (access("/sys/module/kvm_hv", F_OK) ||
-         access("/dev/kvm", R_OK | W_OK))) {
+        (!has_kvm || access("/sys/module/kvm_hv", F_OK))) {
         g_test_message("Skipping test: kvm_hv not available");
         return g_test_run();
     }
@@ -1396,16 +1396,9 @@ int main(int argc, char **argv)
      * Similar to ppc64, s390x seems to be touchy with TCG, so disable it
      * there until the problems are resolved
      */
-    if (g_str_equal(qtest_get_arch(), "s390x")) {
-#if defined(HOST_S390X)
-        if (access("/dev/kvm", R_OK | W_OK)) {
-            g_test_message("Skipping test: kvm not available");
-            return g_test_run();
-        }
-#else
-        g_test_message("Skipping test: Need s390x host to work properly");
+    if (g_str_equal(qtest_get_arch(), "s390x") && !has_kvm) {
+        g_test_message("Skipping test: s390x host with KVM is required");
         return g_test_run();
-#endif
     }
 
     tmpfs = mkdtemp(template);
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 18/53] tests: bios-tables-test: use qtest_has_accel() API to register TCG only tests
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (17 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 17/53] tests: migration-test: use qtest_has_accel() API Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 19/53] acpi: add helper routines to initialize ACPI tables Igor Mammedov
                   ` (35 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: lvivier, thuth, f4bug, mst

 .. only if TCG is available

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: thuth@redhat.com
CC: lvivier@redhat.com
CC: f4bug@amsat.org
---
 tests/qtest/bios-tables-test.c | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index ebe8ec0850..550450c5c3 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -722,13 +722,6 @@ static void test_acpi_one(const char *params, test_data *data)
     char *args;
     bool use_uefi = data->uefi_fl1 && data->uefi_fl2;
 
-#ifndef CONFIG_TCG
-    if (data->tcg_only) {
-        g_test_skip("TCG disabled, skipping ACPI tcg_only test");
-        return;
-    }
-#endif /* CONFIG_TCG */
-
     args = test_acpi_create_args(data, params, use_uefi);
     data->qts = qtest_init(args);
     test_acpi_load_tables(data, use_uefi);
@@ -1546,6 +1539,7 @@ int main(int argc, char *argv[])
 {
     const char *arch = qtest_get_arch();
     const bool has_kvm = qtest_has_accel("kvm");
+    const bool has_tcg = qtest_has_accel("tcg");
     int ret;
 
     g_test_init(&argc, &argv, NULL);
@@ -1588,7 +1582,6 @@ int main(int argc, char *argv[])
         qtest_add_func("acpi/q35/smm-compat-nosmm",
                        test_acpi_q35_tcg_smm_compat_nosmm);
         qtest_add_func("acpi/q35/nohpet", test_acpi_q35_tcg_nohpet);
-        qtest_add_func("acpi/q35/ivrs", test_acpi_q35_tcg_ivrs);
         qtest_add_func("acpi/piix4/dimmpxm", test_acpi_piix4_tcg_dimm_pxm);
         qtest_add_func("acpi/q35/dimmpxm", test_acpi_q35_tcg_dimm_pxm);
         qtest_add_func("acpi/piix4/acpihmat", test_acpi_piix4_tcg_acpi_hmat);
@@ -1598,19 +1591,24 @@ int main(int argc, char *argv[])
         qtest_add_func("acpi/microvm/rtc", test_acpi_microvm_rtc_tcg);
         qtest_add_func("acpi/microvm/ioapic2", test_acpi_microvm_ioapic2_tcg);
         qtest_add_func("acpi/microvm/oem-fields", test_acpi_oem_fields_microvm);
-        if (strcmp(arch, "x86_64") == 0) {
-            qtest_add_func("acpi/microvm/pcie", test_acpi_microvm_pcie_tcg);
+        if (has_tcg) {
+            qtest_add_func("acpi/q35/ivrs", test_acpi_q35_tcg_ivrs);
+            if (strcmp(arch, "x86_64") == 0) {
+                qtest_add_func("acpi/microvm/pcie", test_acpi_microvm_pcie_tcg);
+            }
         }
         if (has_kvm) {
             qtest_add_func("acpi/q35/numamem", test_acpi_q35_kvm_numamem);
             qtest_add_func("acpi/q35/dmar", test_acpi_q35_tcg_dmar);
         }
     } else if (strcmp(arch, "aarch64") == 0) {
-        qtest_add_func("acpi/virt", test_acpi_virt_tcg);
-        qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
-        qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
-        qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
-        qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
+        if (has_tcg) {
+            qtest_add_func("acpi/virt", test_acpi_virt_tcg);
+            qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
+            qtest_add_func("acpi/virt/memhp", test_acpi_virt_tcg_memhp);
+            qtest_add_func("acpi/virt/pxb", test_acpi_virt_tcg_pxb);
+            qtest_add_func("acpi/virt/oem-fields", test_acpi_oem_fields_virt);
+        }
         if (has_kvm) {
             qtest_add_func("acpi/virt/iort", test_acpi_virt_iort);
         }
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 19/53] acpi: add helper routines to initialize ACPI tables
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (18 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 18/53] tests: bios-tables-test: use qtest_has_accel() API to register TCG only tests Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-29 19:16   ` Michael S. Tsirkin
  2021-06-25  9:17 ` [PATCH 20/53] acpi: build_rsdt: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
                   ` (34 subsequent siblings)
  54 siblings, 1 reply; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

   acpi_init_table():
      initializes table header and keeps track of
      table data/offsets
   acpi_table_composed():
      sets actual table length and tells bios loader
      where it's for later initialization on guest side.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/acpi/aml-build.h | 14 ++++++++++
 hw/acpi/aml-build.c         | 53 +++++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)

diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index 471266d739..d590660bd2 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -413,6 +413,20 @@ Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target);
 Aml *aml_object_type(Aml *object);
 
 void build_append_int_noprefix(GArray *table, uint64_t value, int size);
+
+typedef struct AcpiTable {
+    const char *sig;
+    const uint8_t rev;
+    const char *oem_id;
+    const char *oem_table_id;
+    /* private vars tracking table state */
+    GArray *array;
+    unsigned table_offset;
+} AcpiTable;
+
+void acpi_init_table(AcpiTable *desc, GArray *array);
+void acpi_table_composed(BIOSLinker *linker, AcpiTable *table);
+
 void
 build_header(BIOSLinker *linker, GArray *table_data,
              AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index d5103e6d7b..576fc0238c 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -52,6 +52,19 @@ static void build_append_byte(GArray *array, uint8_t val)
     g_array_append_val(array, val);
 }
 
+static void build_append_padded_str(GArray *array, const char *str,
+                                    size_t maxlen, char pad)
+{
+    size_t i;
+    size_t len = strlen(str);
+
+    g_assert(len <= maxlen);
+    g_array_append_vals(array, str, len);
+    for (i = maxlen - len; i > 0; i--) {
+        g_array_append_val(array, pad);
+    }
+}
+
 static void build_append_array(GArray *array, GArray *val)
 {
     g_array_append_vals(array, val->data, val->len);
@@ -1692,6 +1705,46 @@ Aml *aml_object_type(Aml *object)
     return var;
 }
 
+void acpi_init_table(AcpiTable *desc, GArray *array)
+{
+
+    desc->array = array;
+    desc->table_offset = array->len;
+
+    /*
+     * ACPI spec 1.0b
+     * 5.2.3 System Description Table Header
+     */
+    g_assert(strlen(desc->sig) == 4);
+    g_array_append_vals(array, desc->sig, 4); /* Signature */
+    build_append_int_noprefix(array, 0, 4); /* Length */
+    build_append_int_noprefix(array, desc->rev, 1); /* Revision */
+    build_append_int_noprefix(array, 0, 1); /* Checksum */
+    build_append_padded_str(array, desc->oem_id, 6, ' '); /* OEMID */
+    /* OEM Table ID */
+    build_append_padded_str(array, desc->oem_table_id, 8, ' ');
+    build_append_int_noprefix(array, 1, 4); /* OEM Revision */
+    g_array_append_vals(array, ACPI_BUILD_APPNAME8, 4); /* Creator ID */
+    build_append_int_noprefix(array, 1, 4); /* Creator Revision */
+}
+
+void acpi_table_composed(BIOSLinker *linker, AcpiTable *desc)
+{
+    /*
+     * ACPI spec 1.0b
+     * 5.2.3 System Description Table Header
+     * Table 5-2 DESCRIPTION_HEADER Fields
+     */
+    const unsigned checksum_offset = 9;
+    uint32_t table_len = desc->array->len - desc->table_offset;
+    uint32_t table_len_le = cpu_to_le32(table_len);
+    gchar *len_ptr = &desc->array->data[desc->table_offset + 4];
+
+    memcpy(len_ptr, &table_len_le, sizeof table_len_le);
+    bios_linker_loader_add_checksum(linker, ACPI_BUILD_TABLE_FILE,
+        desc->table_offset, table_len, desc->table_offset + checksum_offset);
+}
+
 void
 build_header(BIOSLinker *linker, GArray *table_data,
              AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 20/53] acpi: build_rsdt: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (19 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 19/53] acpi: add helper routines to initialize ACPI tables Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 21/53] acpi: build_xsdt: " Igor Mammedov
                   ` (33 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offests magic from API user.

While at it switch to build_append_int_noprefix() to build
entries to other tables (which also removes some manual offset
calculations).

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/acpi/acpi-defs.h | 10 ----------
 hw/acpi/aml-build.c         | 27 ++++++++++++---------------
 2 files changed, 12 insertions(+), 25 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index cf9f44299c..ccfa3382aa 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -149,16 +149,6 @@ struct AcpiSerialPortConsoleRedirection {
 typedef struct AcpiSerialPortConsoleRedirection
                AcpiSerialPortConsoleRedirection;
 
-/*
- * ACPI 1.0 Root System Description Table (RSDT)
- */
-struct AcpiRsdtDescriptorRev1 {
-    ACPI_TABLE_HEADER_DEF       /* ACPI common table header */
-    uint32_t table_offset_entry[];  /* Array of pointers to other */
-    /* ACPI tables */
-} QEMU_PACKED;
-typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1;
-
 /*
  * ACPI 2.0 eXtended System Description Table (XSDT)
  */
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 576fc0238c..f7241ea5ec 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1881,27 +1881,24 @@ build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
            const char *oem_id, const char *oem_table_id)
 {
     int i;
-    unsigned rsdt_entries_offset;
-    AcpiRsdtDescriptorRev1 *rsdt;
-    int rsdt_start = table_data->len;
-    const unsigned table_data_len = (sizeof(uint32_t) * table_offsets->len);
-    const unsigned rsdt_entry_size = sizeof(rsdt->table_offset_entry[0]);
-    const size_t rsdt_len = sizeof(*rsdt) + table_data_len;
-
-    rsdt = acpi_data_push(table_data, rsdt_len);
-    rsdt_entries_offset = (char *)rsdt->table_offset_entry - table_data->data;
+    AcpiTable table = { .sig = "RSDT", .rev = 1,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
+
+    acpi_init_table(&table, table_data);
     for (i = 0; i < table_offsets->len; ++i) {
         uint32_t ref_tbl_offset = g_array_index(table_offsets, uint32_t, i);
-        uint32_t rsdt_entry_offset = rsdt_entries_offset + rsdt_entry_size * i;
+        uint32_t rsdt_entry_offset = table.array->len;
+
+        /* reserve space for entry */
+        build_append_int_noprefix(table.array, 0, 4);
 
-        /* rsdt->table_offset_entry to be filled by Guest linker */
+        /* mark position of RSDT entry to be filled by Guest linker */
         bios_linker_loader_add_pointer(linker,
-            ACPI_BUILD_TABLE_FILE, rsdt_entry_offset, rsdt_entry_size,
+            ACPI_BUILD_TABLE_FILE, rsdt_entry_offset, 4,
             ACPI_BUILD_TABLE_FILE, ref_tbl_offset);
+
     }
-    build_header(linker, table_data,
-                 (void *)(table_data->data + rsdt_start),
-                 "RSDT", rsdt_len, 1, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 /* Build xsdt table */
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 21/53] acpi: build_xsdt: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (20 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 20/53] acpi: build_rsdt: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 22/53] acpi: build_slit: " Igor Mammedov
                   ` (32 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

While at it switch to build_append_int_noprefix() to build
entries to other tables (which also removes some manual offset
calculations).

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/acpi/acpi-defs.h | 10 ----------
 hw/acpi/aml-build.c         | 27 ++++++++++++---------------
 2 files changed, 12 insertions(+), 25 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index ccfa3382aa..f6d2ca172b 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -149,16 +149,6 @@ struct AcpiSerialPortConsoleRedirection {
 typedef struct AcpiSerialPortConsoleRedirection
                AcpiSerialPortConsoleRedirection;
 
-/*
- * ACPI 2.0 eXtended System Description Table (XSDT)
- */
-struct AcpiXsdtDescriptorRev2 {
-    ACPI_TABLE_HEADER_DEF       /* ACPI common table header */
-    uint64_t table_offset_entry[];  /* Array of pointers to other */
-    /* ACPI tables */
-} QEMU_PACKED;
-typedef struct AcpiXsdtDescriptorRev2 AcpiXsdtDescriptorRev2;
-
 /*
  * ACPI 1.0 Firmware ACPI Control Structure (FACS)
  */
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index f7241ea5ec..e4089edc6c 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1907,27 +1907,24 @@ build_xsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
            const char *oem_id, const char *oem_table_id)
 {
     int i;
-    unsigned xsdt_entries_offset;
-    AcpiXsdtDescriptorRev2 *xsdt;
-    int xsdt_start = table_data->len;
-    const unsigned table_data_len = (sizeof(uint64_t) * table_offsets->len);
-    const unsigned xsdt_entry_size = sizeof(xsdt->table_offset_entry[0]);
-    const size_t xsdt_len = sizeof(*xsdt) + table_data_len;
-
-    xsdt = acpi_data_push(table_data, xsdt_len);
-    xsdt_entries_offset = (char *)xsdt->table_offset_entry - table_data->data;
+    AcpiTable table = { .sig = "XSDT", .rev = 1,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
+
+    acpi_init_table(&table, table_data);
+
     for (i = 0; i < table_offsets->len; ++i) {
         uint64_t ref_tbl_offset = g_array_index(table_offsets, uint32_t, i);
-        uint64_t xsdt_entry_offset = xsdt_entries_offset + xsdt_entry_size * i;
+        uint64_t xsdt_entry_offset = table.array->len;
 
-        /* xsdt->table_offset_entry to be filled by Guest linker */
+        /* reserve space for entry */
+        build_append_int_noprefix(table.array, 0, 8);
+
+        /* mark position of RSDT entry to be filled by Guest linker */
         bios_linker_loader_add_pointer(linker,
-            ACPI_BUILD_TABLE_FILE, xsdt_entry_offset, xsdt_entry_size,
+            ACPI_BUILD_TABLE_FILE, xsdt_entry_offset, 8,
             ACPI_BUILD_TABLE_FILE, ref_tbl_offset);
     }
-    build_header(linker, table_data,
-                 (void *)(table_data->data + xsdt_start),
-                 "XSDT", xsdt_len, 1, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 void build_srat_memory(AcpiSratMemoryAffinity *numamem, uint64_t base,
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 22/53] acpi: build_slit: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (21 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 21/53] acpi: build_xsdt: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 23/53] acpi: build_fadt: " Igor Mammedov
                   ` (31 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/acpi/aml-build.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index e4089edc6c..5f8f98cfc0 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1945,11 +1945,12 @@ void build_srat_memory(AcpiSratMemoryAffinity *numamem, uint64_t base,
 void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
                 const char *oem_id, const char *oem_table_id)
 {
-    int slit_start, i, j;
-    slit_start = table_data->len;
+    int i, j;
     int nb_numa_nodes = ms->numa_state->num_nodes;
+    AcpiTable table = { .sig = "SLIT", .rev = 1,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
 
-    acpi_data_push(table_data, sizeof(AcpiTableHeader));
+    acpi_init_table(&table, table_data);
 
     build_append_int_noprefix(table_data, nb_numa_nodes, 8);
     for (i = 0; i < nb_numa_nodes; i++) {
@@ -1960,11 +1961,7 @@ void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
                                       1);
         }
     }
-
-    build_header(linker, table_data,
-                 (void *)(table_data->data + slit_start),
-                 "SLIT",
-                 table_data->len - slit_start, 1, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 /* build rev1/rev3/rev5.1 FADT */
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 23/53] acpi: build_fadt: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (22 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 22/53] acpi: build_slit: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 24/53] acpi: build_tpm2: " Igor Mammedov
                   ` (30 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/acpi/aml-build.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 5f8f98cfc0..3da32301b6 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1969,9 +1969,10 @@ void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
                 const char *oem_id, const char *oem_table_id)
 {
     int off;
-    int fadt_start = tbl->len;
+    AcpiTable table = { .sig = "FACP", .rev = f->rev,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
 
-    acpi_data_push(tbl, sizeof(AcpiTableHeader));
+    acpi_init_table(&table, tbl);
 
     /* FACS address to be filled by Guest linker at runtime */
     off = tbl->len;
@@ -2035,7 +2036,7 @@ void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
     build_append_int_noprefix(tbl, f->flags, 4); /* Flags */
 
     if (f->rev == 1) {
-        goto build_hdr;
+        goto done;
     }
 
     build_append_gas_from_struct(tbl, &f->reset_reg); /* RESET_REG */
@@ -2072,7 +2073,7 @@ void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
     build_append_gas(tbl, AML_AS_SYSTEM_MEMORY, 0 , 0, 0, 0); /* X_GPE1_BLK */
 
     if (f->rev <= 4) {
-        goto build_hdr;
+        goto done;
     }
 
     /* SLEEP_CONTROL_REG */
@@ -2083,9 +2084,8 @@ void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f,
     /* TODO: extra fields need to be added to support revisions above rev5 */
     assert(f->rev == 5);
 
-build_hdr:
-    build_header(linker, tbl, (void *)(tbl->data + fadt_start),
-                 "FACP", tbl->len - fadt_start, f->rev, oem_id, oem_table_id);
+done:
+    acpi_table_composed(linker, &table);
 }
 
 #ifdef CONFIG_TPM
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 24/53] acpi: build_tpm2: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (23 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 23/53] acpi: build_fadt: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-29 14:56   ` Stefan Berger
  2021-06-25  9:17 ` [PATCH 25/53] acpi: acpi_build_hest: " Igor Mammedov
                   ` (29 subsequent siblings)
  54 siblings, 1 reply; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: stefanb, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: stefanb@linux.vnet.ibm.com
---
 hw/acpi/aml-build.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 3da32301b6..159f998187 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -2098,13 +2098,14 @@ void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
                 const char *oem_id, const char *oem_table_id)
 {
     uint8_t start_method_params[12] = {};
-    unsigned log_addr_offset, tpm2_start;
+    unsigned log_addr_offset;
     uint64_t control_area_start_address;
     TPMIf *tpmif = tpm_find();
     uint32_t start_method;
+    AcpiTable table = { .sig = "TPM2", .rev = 4,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
 
-    tpm2_start = table_data->len;
-    acpi_data_push(table_data, sizeof(AcpiTableHeader));
+    acpi_init_table(&table, table_data);
 
     /* Platform Class */
     build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2);
@@ -2142,9 +2143,7 @@ void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
     bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
                                    log_addr_offset, 8,
                                    ACPI_BUILD_TPMLOG_FILE, 0);
-    build_header(linker, table_data,
-                 (void *)(table_data->data + tpm2_start),
-                 "TPM2", table_data->len - tpm2_start, 4, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 #endif
 
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 25/53] acpi: acpi_build_hest: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (24 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 24/53] acpi: build_tpm2: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-07-02 12:21   ` Dongjiu Geng
  2021-06-25  9:17 ` [PATCH 26/53] acpi: build_mcfg: " Igor Mammedov
                   ` (28 subsequent siblings)
  54 siblings, 1 reply; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: gengdongjiu1, drjones, qemu-arm, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: qemu-arm@nongnu.org
CC: drjones@redhat.com
CC: gengdongjiu1@gmail.com
---
 hw/acpi/ghes.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c
index a4dac6bf15..ae577c08e4 100644
--- a/hw/acpi/ghes.c
+++ b/hw/acpi/ghes.c
@@ -362,18 +362,16 @@ static void build_ghes_v2(GArray *table_data, int source_id, BIOSLinker *linker)
 void acpi_build_hest(GArray *table_data, BIOSLinker *linker,
                      const char *oem_id, const char *oem_table_id)
 {
-    uint64_t hest_start = table_data->len;
+    AcpiTable table = { .sig = "HEST", .rev = 1,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
 
-    /* Hardware Error Source Table header*/
-    acpi_data_push(table_data, sizeof(AcpiTableHeader));
+    acpi_init_table(&table, table_data);
 
     /* Error Source Count */
     build_append_int_noprefix(table_data, ACPI_GHES_ERROR_SOURCE_COUNT, 4);
-
     build_ghes_v2(table_data, ACPI_HEST_SRC_ID_SEA, linker);
 
-    build_header(linker, table_data, (void *)(table_data->data + hest_start),
-                 "HEST", table_data->len - hest_start, 1, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgState *s,
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 26/53] acpi: build_mcfg: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (25 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 25/53] acpi: acpi_build_hest: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 27/53] acpi: build_hmat: " Igor Mammedov
                   ` (27 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/acpi/pci.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/hw/acpi/pci.c b/hw/acpi/pci.c
index 75b1103ec4..81ab83e636 100644
--- a/hw/acpi/pci.c
+++ b/hw/acpi/pci.c
@@ -28,19 +28,20 @@
 #include "hw/acpi/pci.h"
 #include "hw/pci/pcie_host.h"
 
+/*
+ * PCI Firmware Specification, Revision 3.0
+ * 4.1.2 MCFG Table Description.
+ */
 void build_mcfg(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info,
                 const char *oem_id, const char *oem_table_id)
 {
-    int mcfg_start = table_data->len;
+    AcpiTable table = { .sig = "MCFG", .rev = 1,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
+
+    acpi_init_table(&table, table_data);
 
-    /*
-     * PCI Firmware Specification, Revision 3.0
-     * 4.1.2 MCFG Table Description.
-     */
-    acpi_data_push(table_data, sizeof(AcpiTableHeader));
     /* Reserved */
     build_append_int_noprefix(table_data, 0, 8);
-
     /*
      * Memory Mapped Enhanced Configuration Space Base Address Allocation
      * Structure
@@ -56,6 +57,5 @@ void build_mcfg(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info,
     /* Reserved */
     build_append_int_noprefix(table_data, 0, 4);
 
-    build_header(linker, table_data, (void *)(table_data->data + mcfg_start),
-                 "MCFG", table_data->len - mcfg_start, 1, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 27/53] acpi: build_hmat: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (26 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 26/53] acpi: build_mcfg: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 28/53] acpi: nvdimm_build_nfit: " Igor Mammedov
                   ` (26 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Also since acpi_init_table() reserves space only for standard header
while previous acpi_data_push() reserved the header + 4 bytes field,
add 4 bytes 'Reserved' field into hmat_build_table_structs()
which didn have it.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/acpi/hmat.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/hw/acpi/hmat.c b/hw/acpi/hmat.c
index edb3fd91b2..5df4485298 100644
--- a/hw/acpi/hmat.c
+++ b/hw/acpi/hmat.c
@@ -200,6 +200,8 @@ static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
     HMAT_LB_Info *hmat_lb;
     NumaHmatCacheOptions *hmat_cache;
 
+    build_append_int_noprefix(table_data, 0, 4); /* Reserved */
+
     for (i = 0; i < numa_state->num_nodes; i++) {
         flags = 0;
 
@@ -256,14 +258,10 @@ static void hmat_build_table_structs(GArray *table_data, NumaState *numa_state)
 void build_hmat(GArray *table_data, BIOSLinker *linker, NumaState *numa_state,
                 const char *oem_id, const char *oem_table_id)
 {
-    int hmat_start = table_data->len;
-
-    /* reserve space for HMAT header  */
-    acpi_data_push(table_data, 40);
+    AcpiTable table = { .sig = "HMAT", .rev = 2,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
 
+    acpi_init_table(&table, table_data);
     hmat_build_table_structs(table_data, numa_state);
-
-    build_header(linker, table_data,
-                 (void *)(table_data->data + hmat_start),
-                 "HMAT", table_data->len - hmat_start, 2, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 28/53] acpi: nvdimm_build_nfit: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (27 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 27/53] acpi: build_hmat: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 29/53] acpi: nvdimm_build_ssdt: " Igor Mammedov
                   ` (25 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: xiaoguangrong.eric, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Also since acpi_init_table() reserves space only for standard header
while previous acpi_data_push() reserved the header + 4 bytes field,
add 4 bytes 'Reserved' field into nvdimm_build_nfit() which didn't
have it.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: xiaoguangrong.eric@gmail.com
---
 hw/acpi/nvdimm.c | 42 +++++++++++++++++-------------------------
 1 file changed, 17 insertions(+), 25 deletions(-)

diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index e3d5fe1939..6a144b4542 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -44,22 +44,6 @@ static const uint8_t nvdimm_nfit_spa_uuid[] =
       UUID_LE(0x66f0d379, 0xb4f3, 0x4074, 0xac, 0x43, 0x0d, 0x33,
               0x18, 0xb7, 0x8c, 0xdb);
 
-/*
- * NVDIMM Firmware Interface Table
- * @signature: "NFIT"
- *
- * It provides information that allows OSPM to enumerate NVDIMM present in
- * the platform and associate system physical address ranges created by the
- * NVDIMMs.
- *
- * It is defined in ACPI 6.0: 5.2.25 NVDIMM Firmware Interface Table (NFIT)
- */
-struct NvdimmNfitHeader {
-    ACPI_TABLE_HEADER_DEF
-    uint32_t reserved;
-} QEMU_PACKED;
-typedef struct NvdimmNfitHeader NvdimmNfitHeader;
-
 /*
  * define NFIT structures according to ACPI 6.0: 5.2.25 NVDIMM Firmware
  * Interface Table (NFIT).
@@ -401,25 +385,33 @@ void nvdimm_plug(NVDIMMState *state)
     nvdimm_build_fit_buffer(state);
 }
 
+/*
+ * NVDIMM Firmware Interface Table
+ * @signature: "NFIT"
+ *
+ * It provides information that allows OSPM to enumerate NVDIMM present in
+ * the platform and associate system physical address ranges created by the
+ * NVDIMMs.
+ *
+ * It is defined in ACPI 6.0: 5.2.25 NVDIMM Firmware Interface Table (NFIT)
+ */
+
 static void nvdimm_build_nfit(NVDIMMState *state, GArray *table_offsets,
                               GArray *table_data, BIOSLinker *linker,
                               const char *oem_id, const char *oem_table_id)
 {
     NvdimmFitBuffer *fit_buf = &state->fit_buf;
-    unsigned int header;
+    AcpiTable table = { .sig = "NFIT", .rev = 1,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
 
     acpi_add_table(table_offsets, table_data);
 
-    /* NFIT header. */
-    header = table_data->len;
-    acpi_data_push(table_data, sizeof(NvdimmNfitHeader));
+    acpi_init_table(&table, table_data);
+    /* Reserved */
+    build_append_int_noprefix(table_data, 0, 4);
     /* NVDIMM device structures. */
     g_array_append_vals(table_data, fit_buf->fit->data, fit_buf->fit->len);
-
-    build_header(linker, table_data,
-                 (void *)(table_data->data + header), "NFIT",
-                 sizeof(NvdimmNfitHeader) + fit_buf->fit->len, 1, oem_id,
-                 oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 #define NVDIMM_DSM_MEMORY_SIZE      4096
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 29/53] acpi: nvdimm_build_ssdt: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (28 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 28/53] acpi: nvdimm_build_nfit: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 30/53] acpi: vmgenid_build_acpi: " Igor Mammedov
                   ` (24 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: xiaoguangrong.eric, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: xiaoguangrong.eric@gmail.com
---
 hw/acpi/nvdimm.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index 6a144b4542..b61bd681a1 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -1274,14 +1274,15 @@ static void nvdimm_build_ssdt(GArray *table_offsets, GArray *table_data,
                               NVDIMMState *nvdimm_state,
                               uint32_t ram_slots, const char *oem_id)
 {
+    int mem_addr_offset;
     Aml *ssdt, *sb_scope, *dev;
-    int mem_addr_offset, nvdimm_ssdt;
+    AcpiTable table = { .sig = "SSDT", .rev = 1,
+                        .oem_id = oem_id, .oem_table_id = "NVDIMM" };
 
     acpi_add_table(table_offsets, table_data);
 
+    acpi_init_table(&table, table_data);
     ssdt = init_aml_allocator();
-    acpi_data_push(ssdt->buf, sizeof(AcpiTableHeader));
-
     sb_scope = aml_scope("\\_SB");
 
     dev = aml_device("NVDR");
@@ -1310,8 +1311,6 @@ static void nvdimm_build_ssdt(GArray *table_offsets, GArray *table_data,
     aml_append(sb_scope, dev);
     aml_append(ssdt, sb_scope);
 
-    nvdimm_ssdt = table_data->len;
-
     /* copy AML table into ACPI tables blob and patch header there */
     g_array_append_vals(table_data, ssdt->buf->data, ssdt->buf->len);
     mem_addr_offset = build_append_named_dword(table_data,
@@ -1323,10 +1322,13 @@ static void nvdimm_build_ssdt(GArray *table_offsets, GArray *table_data,
     bios_linker_loader_add_pointer(linker,
         ACPI_BUILD_TABLE_FILE, mem_addr_offset, sizeof(uint32_t),
         NVDIMM_DSM_MEM_FILE, 0);
-    build_header(linker, table_data,
-        (void *)(table_data->data + nvdimm_ssdt),
-                 "SSDT", table_data->len - nvdimm_ssdt, 1, oem_id, "NVDIMM");
     free_aml_allocator();
+    /*
+     * must be executed as the last so that pointer patching command above
+     * would be executed by guest before it recalculates checksum which were
+     * scheduled by acpi_table_composed()
+     */
+    acpi_table_composed(linker, &table);
 }
 
 void nvdimm_build_srat(GArray *table_data)
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 30/53] acpi: vmgenid_build_acpi: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (29 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 29/53] acpi: nvdimm_build_ssdt: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 31/53] acpi: x86: build_dsdt: " Igor Mammedov
                   ` (23 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 hw/acpi/vmgenid.c | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/hw/acpi/vmgenid.c b/hw/acpi/vmgenid.c
index 4f41a13ea0..1801e8badf 100644
--- a/hw/acpi/vmgenid.c
+++ b/hw/acpi/vmgenid.c
@@ -29,6 +29,8 @@ void vmgenid_build_acpi(VmGenIdState *vms, GArray *table_data, GArray *guid,
     Aml *ssdt, *dev, *scope, *method, *addr, *if_ctx;
     uint32_t vgia_offset;
     QemuUUID guid_le;
+    AcpiTable table = { .sig = "SSDT", .rev = 1,
+                        .oem_id = oem_id, .oem_table_id = "VMGENID" };
 
     /* Fill in the GUID values.  These need to be converted to little-endian
      * first, since that's what the guest expects
@@ -42,15 +44,12 @@ void vmgenid_build_acpi(VmGenIdState *vms, GArray *table_data, GArray *guid,
     g_array_insert_vals(guid, VMGENID_GUID_OFFSET, guid_le.data,
                         ARRAY_SIZE(guid_le.data));
 
-    /* Put this in a separate SSDT table */
+    /* Put VMGNEID into a separate SSDT table */
+    acpi_init_table(&table, table_data);
     ssdt = init_aml_allocator();
 
-    /* Reserve space for header */
-    acpi_data_push(ssdt->buf, sizeof(AcpiTableHeader));
-
     /* Storage for the GUID address */
-    vgia_offset = table_data->len +
-        build_append_named_dword(ssdt->buf, "VGIA");
+    vgia_offset = table_data->len + build_append_named_dword(ssdt->buf, "VGIA");
     scope = aml_scope("\\_SB");
     dev = aml_device("VGEN");
     aml_append(dev, aml_name_decl("_HID", aml_string("QEMUVGID")));
@@ -116,9 +115,8 @@ void vmgenid_build_acpi(VmGenIdState *vms, GArray *table_data, GArray *guid,
         ACPI_BUILD_TABLE_FILE, vgia_offset, sizeof(uint32_t),
         VMGENID_GUID_FW_CFG_FILE, 0);
 
-    build_header(linker, table_data,
-        (void *)(table_data->data + table_data->len - ssdt->buf->len),
-        "SSDT", ssdt->buf->len, 1, oem_id, "VMGENID");
+    /* must be called after above command to ensure correct table checksum */
+    acpi_table_composed(linker, &table);
     free_aml_allocator();
 }
 
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 31/53] acpi: x86: build_dsdt: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (30 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 30/53] acpi: vmgenid_build_acpi: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 32/53] acpi: build_hpet: " Igor Mammedov
                   ` (22 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
---
 hw/i386/acpi-build.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 796ffc6f5c..538af9d944 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1380,12 +1380,12 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
 #endif
     int i;
     VMBusBridge *vmbus_bridge = vmbus_bridge_find();
+    AcpiTable table = { .sig = "DSDT", .rev = 1, .oem_id = x86ms->oem_id,
+                        .oem_table_id = x86ms->oem_table_id };
 
+    acpi_init_table(&table, table_data);
     dsdt = init_aml_allocator();
 
-    /* Reserve space for header */
-    acpi_data_push(dsdt->buf, sizeof(AcpiTableHeader));
-
     build_dbg_aml(dsdt);
     if (misc->is_piix4) {
         sb_scope = aml_scope("_SB");
@@ -1816,9 +1816,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
 
     /* copy AML table into ACPI tables blob and patch header there */
     g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
-    build_header(linker, table_data,
-        (void *)(table_data->data + table_data->len - dsdt->buf->len),
-                 "DSDT", dsdt->buf->len, 1, x86ms->oem_id, x86ms->oem_table_id);
+    acpi_table_composed(linker, &table);
     free_aml_allocator();
 }
 
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 32/53] acpi: build_hpet: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (31 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 31/53] acpi: x86: build_dsdt: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:17 ` [PATCH 33/53] acpi: build_tpm_tcpa: " Igor Mammedov
                   ` (21 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

while at it convert build_hpet() to endian agnostic
build_append_FOO() API

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
---
 include/hw/acpi/acpi-defs.h | 13 -------------
 hw/i386/acpi-build.c        | 26 ++++++++++++++++++--------
 2 files changed, 18 insertions(+), 21 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index f6d2ca172b..4d8f8b34b0 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -358,19 +358,6 @@ struct AcpiGenericTimerTable {
 } QEMU_PACKED;
 typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
 
-/*
- * HPET Description Table
- */
-struct Acpi20Hpet {
-    ACPI_TABLE_HEADER_DEF                    /* ACPI common table header */
-    uint32_t           timer_block_id;
-    struct AcpiGenericAddress addr;
-    uint8_t            hpet_number;
-    uint16_t           min_tick;
-    uint8_t            page_protect;
-} QEMU_PACKED;
-typedef struct Acpi20Hpet Acpi20Hpet;
-
 /*
  * SRAT (NUMA topology description) table
  */
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 538af9d944..96ad3e1b9d 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1820,22 +1820,32 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
     free_aml_allocator();
 }
 
+/*
+ * IA-PC HPET (High Precision Event Timers) Specification (Revision: 1.0a)
+ * 3.2.4The ACPI 2.0 HPET Description Table (HPET)
+ */
 static void
 build_hpet(GArray *table_data, BIOSLinker *linker, const char *oem_id,
            const char *oem_table_id)
 {
-    Acpi20Hpet *hpet;
-    int hpet_start = table_data->len;
+    AcpiTable table = { .sig = "HPET", .rev = 1,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
 
-    hpet = acpi_data_push(table_data, sizeof(*hpet));
+    acpi_init_table(&table, table_data);
     /* Note timer_block_id value must be kept in sync with value advertised by
      * emulated hpet
      */
-    hpet->timer_block_id = cpu_to_le32(0x8086a201);
-    hpet->addr.address = cpu_to_le64(HPET_BASE);
-    build_header(linker, table_data,
-                 (void *)(table_data->data + hpet_start),
-                 "HPET", sizeof(*hpet), 1, oem_id, oem_table_id);
+    /* Event Timer Block ID */
+    build_append_int_noprefix(table_data, 0x8086a201, 4);
+    /* BASE_ADDRESS */
+    build_append_gas(table_data, AML_AS_SYSTEM_MEMORY, 0, 0, 0, HPET_BASE);
+    /* HPET Number */
+    build_append_int_noprefix(table_data, 0, 1);
+    /* Main Counter Minimum Clock_tick in Periodic Mode */
+    build_append_int_noprefix(table_data, 0, 2);
+    /* Page Protection And OEM Attribute */
+    build_append_int_noprefix(table_data, 0, 1);
+    acpi_table_composed(linker, &table);
 }
 
 #ifdef CONFIG_TPM
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 33/53] acpi: build_tpm_tcpa: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (32 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 32/53] acpi: build_hpet: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-29 15:19   ` Stefan Berger
  2021-06-30  7:25   ` [PATCH v2 " Igor Mammedov
  2021-06-25  9:17 ` [PATCH 34/53] acpi: arm/x86: build_srat: " Igor Mammedov
                   ` (20 subsequent siblings)
  54 siblings, 2 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: stefanb, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

While at it switch to build_append_int_noprefix() to build
table entries (which also removes some manual offset
calculations).

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
CC: stefanb@linux.vnet.ibm.com
---
 include/hw/acpi/acpi-defs.h | 14 -------------
 hw/i386/acpi-build.c        | 39 +++++++++++++++++++++----------------
 2 files changed, 22 insertions(+), 31 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 4d8f8b34b0..3b42b138f0 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -418,20 +418,6 @@ struct AcpiSratProcessorGiccAffinity {
 
 typedef struct AcpiSratProcessorGiccAffinity AcpiSratProcessorGiccAffinity;
 
-/*
- * TCPA Description Table
- *
- * Following Level 00, Rev 00.37 of specs:
- * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification
- */
-struct Acpi20Tcpa {
-    ACPI_TABLE_HEADER_DEF                    /* ACPI common table header */
-    uint16_t platform_class;
-    uint32_t log_area_minimum_length;
-    uint64_t log_area_start_address;
-} QEMU_PACKED;
-typedef struct Acpi20Tcpa Acpi20Tcpa;
-
 /* DMAR - DMA Remapping table r2.2 */
 struct AcpiTableDmar {
     ACPI_TABLE_HEADER_DEF
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 96ad3e1b9d..bc45a666f6 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1849,31 +1849,36 @@ build_hpet(GArray *table_data, BIOSLinker *linker, const char *oem_id,
 }
 
 #ifdef CONFIG_TPM
+/*
+ * TCPA Description Table
+ *
+ * Following Level 00, Rev 00.37 of specs:
+ * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification
+ * 7.1.2 ACPI Table Layout
+ */
 static void
 build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
                const char *oem_id, const char *oem_table_id)
 {
-    int tcpa_start = table_data->len;
-    Acpi20Tcpa *tcpa = acpi_data_push(table_data, sizeof *tcpa);
-    unsigned log_addr_size = sizeof(tcpa->log_area_start_address);
-    unsigned log_addr_offset =
-        (char *)&tcpa->log_area_start_address - table_data->data;
+    AcpiTable table = { .sig = "TCPA", .rev = 2,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
 
-    tcpa->platform_class = cpu_to_le16(TPM_TCPA_ACPI_CLASS_CLIENT);
-    tcpa->log_area_minimum_length = cpu_to_le32(TPM_LOG_AREA_MINIMUM_SIZE);
-    acpi_data_push(tcpalog, le32_to_cpu(tcpa->log_area_minimum_length));
+    acpi_init_table(&table, table_data);
+    /* Platform Class */
+    build_append_int_noprefix(table_data, TPM_TCPA_ACPI_CLASS_CLIENT, 2);
+    /* Log Area Minimum Length (LAML) */
+    build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4);
+    /* Log Area Start Address (LASA) */
+    /* log area start address to be filled by Guest linker */
+    bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
+        table_data->len, 8, ACPI_BUILD_TPMLOG_FILE, 0);
+    build_append_int_noprefix(table_data, 0, 8);
+    acpi_table_composed(linker, &table);
 
+    /* allocate/reserve space for TPM log area */
+    acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE);
     bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1,
                              false /* high memory */);
-
-    /* log area start address to be filled by Guest linker */
-    bios_linker_loader_add_pointer(linker,
-        ACPI_BUILD_TABLE_FILE, log_addr_offset, log_addr_size,
-        ACPI_BUILD_TPMLOG_FILE, 0);
-
-    build_header(linker, table_data,
-                 (void *)(table_data->data + tcpa_start),
-                 "TCPA", sizeof(*tcpa), 2, oem_id, oem_table_id);
 }
 #endif
 
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 34/53] acpi: arm/x86: build_srat: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (33 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 33/53] acpi: build_tpm_tcpa: " Igor Mammedov
@ 2021-06-25  9:17 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 35/53] acpi: use build_append_int_noprefix() API to compose SRAT table Igor Mammedov
                   ` (19 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:17 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, mst, shannon.zhaosl, qemu-arm

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: shannon.zhaosl@gmail.com
CC: peter.maydell@linaro.org
CC: marcel.apfelbaum@gmail.com
CC: qemu-arm@nongnu.org
CC: drjones@redhat.com
---
 include/hw/acpi/acpi-defs.h | 11 -----------
 hw/arm/virt-acpi-build.c    | 15 +++++++--------
 hw/i386/acpi-build.c        | 18 +++++++-----------
 3 files changed, 14 insertions(+), 30 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 3b42b138f0..5826ee04b6 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -358,17 +358,6 @@ struct AcpiGenericTimerTable {
 } QEMU_PACKED;
 typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
 
-/*
- * SRAT (NUMA topology description) table
- */
-
-struct AcpiSystemResourceAffinityTable {
-    ACPI_TABLE_HEADER_DEF
-    uint32_t    reserved1;
-    uint32_t    reserved2[2];
-} QEMU_PACKED;
-typedef struct AcpiSystemResourceAffinityTable AcpiSystemResourceAffinityTable;
-
 #define ACPI_SRAT_PROCESSOR_APIC     0
 #define ACPI_SRAT_MEMORY             1
 #define ACPI_SRAT_PROCESSOR_x2APIC   2
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index f1024843dd..c4416ac696 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -385,18 +385,19 @@ build_spcr(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 static void
 build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
-    AcpiSystemResourceAffinityTable *srat;
     AcpiSratProcessorGiccAffinity *core;
     AcpiSratMemoryAffinity *numamem;
-    int i, srat_start;
+    int i;
     uint64_t mem_base;
     MachineClass *mc = MACHINE_GET_CLASS(vms);
     MachineState *ms = MACHINE(vms);
     const CPUArchIdList *cpu_list = mc->possible_cpu_arch_ids(ms);
+    AcpiTable table = { .sig = "SRAT", .rev = 3, .oem_id = vms->oem_id,
+                        .oem_table_id = vms->oem_table_id };
 
-    srat_start = table_data->len;
-    srat = acpi_data_push(table_data, sizeof(*srat));
-    srat->reserved1 = cpu_to_le32(1);
+    acpi_init_table(&table, table_data);
+    build_append_int_noprefix(table_data, 1, 4); /* Reserved */
+    build_append_int_noprefix(table_data, 0, 8); /* Reserved */
 
     for (i = 0; i < cpu_list->len; ++i) {
         core = acpi_data_push(table_data, sizeof(*core));
@@ -430,9 +431,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
                           MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
     }
 
-    build_header(linker, table_data, (void *)(table_data->data + srat_start),
-                 "SRAT", table_data->len - srat_start, 3, vms->oem_id,
-                 vms->oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 /* GTDT */
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index bc45a666f6..e66859b8e5 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1888,11 +1888,10 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
 static void
 build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
 {
-    AcpiSystemResourceAffinityTable *srat;
     AcpiSratMemoryAffinity *numamem;
 
     int i;
-    int srat_start, numa_start, slots;
+    int numa_start, slots;
     uint64_t mem_len, mem_base, next_base;
     MachineClass *mc = MACHINE_GET_CLASS(machine);
     X86MachineState *x86ms = X86_MACHINE(machine);
@@ -1901,11 +1900,12 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
     ram_addr_t hotplugabble_address_space_size =
         object_property_get_int(OBJECT(pcms), PC_MACHINE_DEVMEM_REGION_SIZE,
                                 NULL);
+    AcpiTable table = { .sig = "SRAT", .rev = 1, .oem_id = x86ms->oem_id,
+                        .oem_table_id = x86ms->oem_table_id };
 
-    srat_start = table_data->len;
-
-    srat = acpi_data_push(table_data, sizeof *srat);
-    srat->reserved1 = cpu_to_le32(1);
+    acpi_init_table(&table, table_data);
+    build_append_int_noprefix(table_data, 1, 4); /* Reserved */
+    build_append_int_noprefix(table_data, 0, 8); /* Reserved */
 
     for (i = 0; i < apic_ids->len; i++) {
         int node_id = apic_ids->cpus[i].props.node_id;
@@ -2011,11 +2011,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
                           MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
     }
 
-    build_header(linker, table_data,
-                 (void *)(table_data->data + srat_start),
-                 "SRAT",
-                 table_data->len - srat_start, 1, x86ms->oem_id,
-                 x86ms->oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 /*
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 35/53] acpi: use build_append_int_noprefix() API to compose SRAT table
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (34 preceding siblings ...)
  2021-06-25  9:17 ` [PATCH 34/53] acpi: arm/x86: build_srat: " Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 36/53] acpi: build_dmar_q35: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
                   ` (18 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, drjones, xiaoguangrong.eric, mst, shannon.zhaosl,
	qemu-arm

Drop usage of packed structures and explicit endian conversions
when building SRAT tables for arm/x86 and use endian agnostic
build_append_int_noprefix() API to build it.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: xiaoguangrong.eric@gmail.com
CC: shannon.zhaosl@gmail.com
CC: peter.maydell@linaro.org
CC: marcel.apfelbaum@gmail.com
CC: qemu-arm@nongnu.org
CC: drjones@redhat.com
---
 include/hw/acpi/acpi-defs.h | 49 -----------------------
 include/hw/acpi/aml-build.h |  2 +-
 hw/acpi/aml-build.c         | 24 ++++++++----
 hw/acpi/nvdimm.c            |  4 +-
 hw/arm/virt-acpi-build.c    | 29 ++++++++------
 hw/i386/acpi-build.c        | 78 +++++++++++++++++++++----------------
 6 files changed, 80 insertions(+), 106 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 5826ee04b6..d293304f9c 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -358,55 +358,6 @@ struct AcpiGenericTimerTable {
 } QEMU_PACKED;
 typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
 
-#define ACPI_SRAT_PROCESSOR_APIC     0
-#define ACPI_SRAT_MEMORY             1
-#define ACPI_SRAT_PROCESSOR_x2APIC   2
-#define ACPI_SRAT_PROCESSOR_GICC     3
-
-struct AcpiSratProcessorAffinity {
-    ACPI_SUB_HEADER_DEF
-    uint8_t     proximity_lo;
-    uint8_t     local_apic_id;
-    uint32_t    flags;
-    uint8_t     local_sapic_eid;
-    uint8_t     proximity_hi[3];
-    uint32_t    reserved;
-} QEMU_PACKED;
-typedef struct AcpiSratProcessorAffinity AcpiSratProcessorAffinity;
-
-struct AcpiSratProcessorX2ApicAffinity {
-    ACPI_SUB_HEADER_DEF
-    uint16_t    reserved;
-    uint32_t    proximity_domain;
-    uint32_t    x2apic_id;
-    uint32_t    flags;
-    uint32_t    clk_domain;
-    uint32_t    reserved2;
-} QEMU_PACKED;
-typedef struct AcpiSratProcessorX2ApicAffinity AcpiSratProcessorX2ApicAffinity;
-
-struct AcpiSratMemoryAffinity {
-    ACPI_SUB_HEADER_DEF
-    uint32_t    proximity;
-    uint16_t    reserved1;
-    uint64_t    base_addr;
-    uint64_t    range_length;
-    uint32_t    reserved2;
-    uint32_t    flags;
-    uint32_t    reserved3[2];
-} QEMU_PACKED;
-typedef struct AcpiSratMemoryAffinity AcpiSratMemoryAffinity;
-
-struct AcpiSratProcessorGiccAffinity {
-    ACPI_SUB_HEADER_DEF
-    uint32_t    proximity;
-    uint32_t    acpi_processor_uid;
-    uint32_t    flags;
-    uint32_t    clock_domain;
-} QEMU_PACKED;
-
-typedef struct AcpiSratProcessorGiccAffinity AcpiSratProcessorGiccAffinity;
-
 /* DMAR - DMA Remapping table r2.2 */
 struct AcpiTableDmar {
     ACPI_TABLE_HEADER_DEF
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index d590660bd2..dcb7ce11a8 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -470,7 +470,7 @@ Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set, uint32_t io_offset,
                uint32_t mmio32_offset, uint64_t mmio64_offset,
                uint16_t bus_nr_offset);
 
-void build_srat_memory(AcpiSratMemoryAffinity *numamem, uint64_t base,
+void build_srat_memory(GArray *table_data, uint64_t base,
                        uint64_t len, int node, MemoryAffinityFlags flags);
 
 void build_slit(GArray *table_data, BIOSLinker *linker, MachineState *ms,
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 159f998187..813542b081 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1927,15 +1927,25 @@ build_xsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets,
     acpi_table_composed(linker, &table);
 }
 
-void build_srat_memory(AcpiSratMemoryAffinity *numamem, uint64_t base,
+/*
+ * ACPI spec, Revision 4.0
+ * 5.2.16.2 Memory Affinity Structure
+ */
+void build_srat_memory(GArray *table_data, uint64_t base,
                        uint64_t len, int node, MemoryAffinityFlags flags)
 {
-    numamem->type = ACPI_SRAT_MEMORY;
-    numamem->length = sizeof(*numamem);
-    numamem->proximity = cpu_to_le32(node);
-    numamem->flags = cpu_to_le32(flags);
-    numamem->base_addr = cpu_to_le64(base);
-    numamem->range_length = cpu_to_le64(len);
+    build_append_int_noprefix(table_data, 1, 1); /* Type */
+    build_append_int_noprefix(table_data, 40, 1); /* Length */
+    build_append_int_noprefix(table_data, node, 4); /* Proximity Domain */
+    build_append_int_noprefix(table_data, 0, 2); /* Reserved */
+    build_append_int_noprefix(table_data, base, 4); /* Base Address Low */
+    /* Base Address High */
+    build_append_int_noprefix(table_data, base >> 32, 4);
+    build_append_int_noprefix(table_data, len, 4); /* Length Low */
+    build_append_int_noprefix(table_data, len >> 32, 4); /* Length High */
+    build_append_int_noprefix(table_data, 0, 4); /* Reserved */
+    build_append_int_noprefix(table_data, flags, 4); /* Flags */
+    build_append_int_noprefix(table_data, 0, 8); /* Reserved */
 }
 
 /*
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index b61bd681a1..8753616322 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -1336,7 +1336,6 @@ void nvdimm_build_srat(GArray *table_data)
     GSList *device_list = nvdimm_get_device_list();
 
     for (; device_list; device_list = device_list->next) {
-        AcpiSratMemoryAffinity *numamem = NULL;
         DeviceState *dev = device_list->data;
         Object *obj = OBJECT(dev);
         uint64_t addr, size;
@@ -1346,8 +1345,7 @@ void nvdimm_build_srat(GArray *table_data)
         addr = object_property_get_uint(obj, PC_DIMM_ADDR_PROP, &error_abort);
         size = object_property_get_uint(obj, PC_DIMM_SIZE_PROP, &error_abort);
 
-        numamem = acpi_data_push(table_data, sizeof *numamem);
-        build_srat_memory(numamem, addr, size, node,
+        build_srat_memory(table_data, addr, size, node,
                           MEM_AFFINITY_ENABLED | MEM_AFFINITY_NON_VOLATILE);
     }
     g_slist_free(device_list);
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index c4416ac696..159e71dbdd 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -382,11 +382,13 @@ build_spcr(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
                  vms->oem_table_id);
 }
 
+/*
+ * ACPI spec, Revision 5.1
+ * 5.2.16 System Resource Affinity Table (SRAT)
+ */
 static void
 build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
-    AcpiSratProcessorGiccAffinity *core;
-    AcpiSratMemoryAffinity *numamem;
     int i;
     uint64_t mem_base;
     MachineClass *mc = MACHINE_GET_CLASS(vms);
@@ -400,19 +402,23 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
     build_append_int_noprefix(table_data, 0, 8); /* Reserved */
 
     for (i = 0; i < cpu_list->len; ++i) {
-        core = acpi_data_push(table_data, sizeof(*core));
-        core->type = ACPI_SRAT_PROCESSOR_GICC;
-        core->length = sizeof(*core);
-        core->proximity = cpu_to_le32(cpu_list->cpus[i].props.node_id);
-        core->acpi_processor_uid = cpu_to_le32(i);
-        core->flags = cpu_to_le32(1);
+        uint32_t nodeid = cpu_list->cpus[i].props.node_id;
+        /*
+         * 5.2.16.4 GICC Affinity Structure
+         */
+        build_append_int_noprefix(table_data, 3, 1);      /* Type */
+        build_append_int_noprefix(table_data, 18, 1);     /* Length */
+        build_append_int_noprefix(table_data, nodeid, 4); /* Proximity Domain */
+        build_append_int_noprefix(table_data, i, 4); /* ACPI Processor UID */
+        /* Flags, Table 5-76 */
+        build_append_int_noprefix(table_data, 1 /* Enabled */, 4);
+        build_append_int_noprefix(table_data, 0, 4); /* Clock Domain */
     }
 
     mem_base = vms->memmap[VIRT_MEM].base;
     for (i = 0; i < ms->numa_state->num_nodes; ++i) {
         if (ms->numa_state->nodes[i].node_mem > 0) {
-            numamem = acpi_data_push(table_data, sizeof(*numamem));
-            build_srat_memory(numamem, mem_base,
+            build_srat_memory(table_data, mem_base,
                               ms->numa_state->nodes[i].node_mem, i,
                               MEM_AFFINITY_ENABLED);
             mem_base += ms->numa_state->nodes[i].node_mem;
@@ -424,8 +430,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
     }
 
     if (ms->device_memory) {
-        numamem = acpi_data_push(table_data, sizeof *numamem);
-        build_srat_memory(numamem, ms->device_memory->base,
+        build_srat_memory(table_data, ms->device_memory->base,
                           memory_region_size(&ms->device_memory->mr),
                           ms->numa_state->num_nodes - 1,
                           MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index e66859b8e5..9d5df3161f 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1885,13 +1885,15 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
 #define HOLE_640K_START  (640 * KiB)
 #define HOLE_640K_END   (1 * MiB)
 
+/*
+ * ACPI spec, Revision 3.0
+ * 5.2.15 System Resource Affinity Table (SRAT)
+ */
 static void
 build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
 {
-    AcpiSratMemoryAffinity *numamem;
-
     int i;
-    int numa_start, slots;
+    int numa_mem_start, slots;
     uint64_t mem_len, mem_base, next_base;
     MachineClass *mc = MACHINE_GET_CLASS(machine);
     X86MachineState *x86ms = X86_MACHINE(machine);
@@ -1912,34 +1914,41 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
         uint32_t apic_id = apic_ids->cpus[i].arch_id;
 
         if (apic_id < 255) {
-            AcpiSratProcessorAffinity *core;
-
-            core = acpi_data_push(table_data, sizeof *core);
-            core->type = ACPI_SRAT_PROCESSOR_APIC;
-            core->length = sizeof(*core);
-            core->local_apic_id = apic_id;
-            core->proximity_lo = node_id;
-            memset(core->proximity_hi, 0, 3);
-            core->local_sapic_eid = 0;
-            core->flags = cpu_to_le32(1);
+            /* 5.2.15.1 Processor Local APIC/SAPIC Affinity Structure */
+            build_append_int_noprefix(table_data, 0, 1);  /* Type  */
+            build_append_int_noprefix(table_data, 16, 1); /* Length */
+            /* Proximity Domain [7:0] */
+            build_append_int_noprefix(table_data, node_id, 1);
+            build_append_int_noprefix(table_data, apic_id, 1); /* APIC ID */
+            /* Flags, Table 5-36 */
+            build_append_int_noprefix(table_data, 1, 4);
+            build_append_int_noprefix(table_data, 0, 1); /* Local SAPIC EID */
+            /* Proximity Domain [31:8] */
+            build_append_int_noprefix(table_data, 0, 3);
+            build_append_int_noprefix(table_data, 0, 4); /* Reserved */
         } else {
-            AcpiSratProcessorX2ApicAffinity *core;
-
-            core = acpi_data_push(table_data, sizeof *core);
-            core->type = ACPI_SRAT_PROCESSOR_x2APIC;
-            core->length = sizeof(*core);
-            core->x2apic_id = cpu_to_le32(apic_id);
-            core->proximity_domain = cpu_to_le32(node_id);
-            core->flags = cpu_to_le32(1);
+            /*
+             * ACPI spec, Revision 4.0
+             * 5.2.16.3 Processor Local x2APIC Affinity Structure
+             */
+            build_append_int_noprefix(table_data, 2, 1);  /* Type  */
+            build_append_int_noprefix(table_data, 24, 1); /* Length */
+            build_append_int_noprefix(table_data, 0, 2); /* Reserved */
+            /* Proximity Domain */
+            build_append_int_noprefix(table_data, node_id, 4);
+            build_append_int_noprefix(table_data, apic_id, 4); /* X2APIC ID */
+            /* Flags, Table 5-39 */
+            build_append_int_noprefix(table_data, 1 /* Enabled */, 4);
+            build_append_int_noprefix(table_data, 0, 4); /* Clock Domain */
+            build_append_int_noprefix(table_data, 0, 4); /* Reserved */
         }
     }
 
-
     /* the memory map is a bit tricky, it contains at least one hole
      * from 640k-1M and possibly another one from 3.5G-4G.
      */
     next_base = 0;
-    numa_start = table_data->len;
+    numa_mem_start = table_data->len;
 
     for (i = 1; i < pcms->numa_nodes + 1; ++i) {
         mem_base = next_base;
@@ -1951,8 +1960,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
             next_base > HOLE_640K_START) {
             mem_len -= next_base - HOLE_640K_START;
             if (mem_len > 0) {
-                numamem = acpi_data_push(table_data, sizeof *numamem);
-                build_srat_memory(numamem, mem_base, mem_len, i - 1,
+                build_srat_memory(table_data, mem_base, mem_len, i - 1,
                                   MEM_AFFINITY_ENABLED);
             }
 
@@ -1970,8 +1978,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
             next_base > x86ms->below_4g_mem_size) {
             mem_len -= next_base - x86ms->below_4g_mem_size;
             if (mem_len > 0) {
-                numamem = acpi_data_push(table_data, sizeof *numamem);
-                build_srat_memory(numamem, mem_base, mem_len, i - 1,
+                build_srat_memory(table_data, mem_base, mem_len, i - 1,
                                   MEM_AFFINITY_ENABLED);
             }
             mem_base = 1ULL << 32;
@@ -1980,8 +1987,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
         }
 
         if (mem_len > 0) {
-            numamem = acpi_data_push(table_data, sizeof *numamem);
-            build_srat_memory(numamem, mem_base, mem_len, i - 1,
+            build_srat_memory(table_data, mem_base, mem_len, i - 1,
                               MEM_AFFINITY_ENABLED);
         }
     }
@@ -1990,10 +1996,15 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
         nvdimm_build_srat(table_data);
     }
 
-    slots = (table_data->len - numa_start) / sizeof *numamem;
+    /*
+     * TODO: this part is not in ACPI spec and current linux kernel boots fine
+     * without these entries. But I recall there were issues the last time I
+     * tried to remove it with some ancient guest OS, however I can't remember
+     * what that was so keep this around for now
+     */
+    slots = (table_data->len - numa_mem_start) / 40 /* mem affinity len */;
     for (; slots < pcms->numa_nodes + 2; slots++) {
-        numamem = acpi_data_push(table_data, sizeof *numamem);
-        build_srat_memory(numamem, 0, 0, 0, MEM_AFFINITY_NOFLAGS);
+        build_srat_memory(table_data, 0, 0, 0, MEM_AFFINITY_NOFLAGS);
     }
 
     /*
@@ -2005,8 +2016,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
      * providing _PXM method if necessary.
      */
     if (hotplugabble_address_space_size) {
-        numamem = acpi_data_push(table_data, sizeof *numamem);
-        build_srat_memory(numamem, machine->device_memory->base,
+        build_srat_memory(table_data, machine->device_memory->base,
                           hotplugabble_address_space_size, pcms->numa_nodes - 1,
                           MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
     }
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 36/53] acpi: build_dmar_q35: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (35 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 35/53] acpi: use build_append_int_noprefix() API to compose SRAT table Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 37/53] acpi: build_waet: " Igor Mammedov
                   ` (17 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

While at it switch to build_append_int_noprefix() to build
table entries tables.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
---
 include/hw/acpi/acpi-defs.h | 68 --------------------------------
 hw/i386/acpi-build.c        | 77 ++++++++++++++++++++-----------------
 2 files changed, 42 insertions(+), 103 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index d293304f9c..c4f0a202e8 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -358,74 +358,6 @@ struct AcpiGenericTimerTable {
 } QEMU_PACKED;
 typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
 
-/* DMAR - DMA Remapping table r2.2 */
-struct AcpiTableDmar {
-    ACPI_TABLE_HEADER_DEF
-    uint8_t host_address_width; /* Maximum DMA physical addressability */
-    uint8_t flags;
-    uint8_t reserved[10];
-} QEMU_PACKED;
-typedef struct AcpiTableDmar AcpiTableDmar;
-
-/* Masks for Flags field above */
-#define ACPI_DMAR_INTR_REMAP        1
-#define ACPI_DMAR_X2APIC_OPT_OUT    (1 << 1)
-
-/* Values for sub-structure type for DMAR */
-enum {
-    ACPI_DMAR_TYPE_HARDWARE_UNIT = 0,       /* DRHD */
-    ACPI_DMAR_TYPE_RESERVED_MEMORY = 1,     /* RMRR */
-    ACPI_DMAR_TYPE_ATSR = 2,                /* ATSR */
-    ACPI_DMAR_TYPE_HARDWARE_AFFINITY = 3,   /* RHSR */
-    ACPI_DMAR_TYPE_ANDD = 4,                /* ANDD */
-    ACPI_DMAR_TYPE_RESERVED = 5             /* Reserved for furture use */
-};
-
-/*
- * Sub-structures for DMAR
- */
-
-/* Device scope structure for DRHD. */
-struct AcpiDmarDeviceScope {
-    uint8_t entry_type;
-    uint8_t length;
-    uint16_t reserved;
-    uint8_t enumeration_id;
-    uint8_t bus;
-    struct {
-        uint8_t device;
-        uint8_t function;
-    } path[];
-} QEMU_PACKED;
-typedef struct AcpiDmarDeviceScope AcpiDmarDeviceScope;
-
-/* Type 0: Hardware Unit Definition */
-struct AcpiDmarHardwareUnit {
-    uint16_t type;
-    uint16_t length;
-    uint8_t flags;
-    uint8_t reserved;
-    uint16_t pci_segment;   /* The PCI Segment associated with this unit */
-    uint64_t address;   /* Base address of remapping hardware register-set */
-    AcpiDmarDeviceScope scope[];
-} QEMU_PACKED;
-typedef struct AcpiDmarHardwareUnit AcpiDmarHardwareUnit;
-
-/* Type 2: Root Port ATS Capability Reporting Structure */
-struct AcpiDmarRootPortATS {
-    uint16_t type;
-    uint16_t length;
-    uint8_t flags;
-    uint8_t reserved;
-    uint16_t pci_segment;
-    AcpiDmarDeviceScope scope[];
-} QEMU_PACKED;
-typedef struct AcpiDmarRootPortATS AcpiDmarRootPortATS;
-
-/* Masks for Flags field above */
-#define ACPI_DMAR_INCLUDE_PCI_ALL   1
-#define ACPI_DMAR_ATSR_ALL_PORTS    1
-
 /*
  * Input Output Remapping Table (IORT)
  * Conforms to "IO Remapping Table System Software on ARM Platforms",
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 9d5df3161f..2fe6bffbe8 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2025,62 +2025,69 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
 }
 
 /*
- * VT-d spec 8.1 DMA Remapping Reporting Structure
- * (version Oct. 2014 or later)
+ * Intel ® Virtualization Technology for Directed I/O
+ * Architecture Specification. Revision 3.3
+ * 8.1 DMA Remapping Reporting Structure
  */
 static void
 build_dmar_q35(GArray *table_data, BIOSLinker *linker, const char *oem_id,
                const char *oem_table_id)
 {
-    int dmar_start = table_data->len;
-
-    AcpiTableDmar *dmar;
-    AcpiDmarHardwareUnit *drhd;
-    AcpiDmarRootPortATS *atsr;
     uint8_t dmar_flags = 0;
+    uint8_t rsvd10[10] = {};
+    /* Root complex IOAPIC uses one path only */
+    const size_t ioapic_scope_size = 6 /* device scope structure */ +
+                                     2 /* 1 path entry */;
     X86IOMMUState *iommu = x86_iommu_get_default();
-    AcpiDmarDeviceScope *scope = NULL;
-    /* Root complex IOAPIC use one path[0] only */
-    size_t ioapic_scope_size = sizeof(*scope) + sizeof(scope->path[0]);
     IntelIOMMUState *intel_iommu = INTEL_IOMMU_DEVICE(iommu);
+    AcpiTable table = { .sig = "DMAR", .rev = 1, .oem_id = oem_id,
+                        .oem_table_id = oem_table_id };
 
     assert(iommu);
     if (x86_iommu_ir_supported(iommu)) {
         dmar_flags |= 0x1;      /* Flags: 0x1: INT_REMAP */
     }
 
-    dmar = acpi_data_push(table_data, sizeof(*dmar));
-    dmar->host_address_width = intel_iommu->aw_bits - 1;
-    dmar->flags = dmar_flags;
-
-    /* DMAR Remapping Hardware Unit Definition structure */
-    drhd = acpi_data_push(table_data, sizeof(*drhd) + ioapic_scope_size);
-    drhd->type = cpu_to_le16(ACPI_DMAR_TYPE_HARDWARE_UNIT);
-    drhd->length = cpu_to_le16(sizeof(*drhd) + ioapic_scope_size);
-    drhd->flags = ACPI_DMAR_INCLUDE_PCI_ALL;
-    drhd->pci_segment = cpu_to_le16(0);
-    drhd->address = cpu_to_le64(Q35_HOST_BRIDGE_IOMMU_ADDR);
+    acpi_init_table(&table, table_data);
+    /* Host Address Width */
+    build_append_int_noprefix(table_data, intel_iommu->aw_bits - 1, 1);
+    build_append_int_noprefix(table_data, dmar_flags, 1); /* Flags */
+    g_array_append_vals(table_data, rsvd10, sizeof(rsvd10)); /* Reserved */
+
+    /* 8.3 DMAR Remapping Hardware Unit Definition structure */
+    build_append_int_noprefix(table_data, 0, 2); /* Type */
+    /* Length */
+    build_append_int_noprefix(table_data, 16 + ioapic_scope_size, 2);
+    /* Flags */
+    build_append_int_noprefix(table_data, 1 /* INCLUDE_PCI_ALL */ , 1);
+    build_append_int_noprefix(table_data, 0 , 1); /* Reserved */
+    build_append_int_noprefix(table_data, 0 , 2); /* Segment Number */
+    /* Register Base Address */
+    build_append_int_noprefix(table_data, Q35_HOST_BRIDGE_IOMMU_ADDR , 8);
 
     /* Scope definition for the root-complex IOAPIC. See VT-d spec
      * 8.3.1 (version Oct. 2014 or later). */
-    scope = &drhd->scope[0];
-    scope->entry_type = 0x03;   /* Type: 0x03 for IOAPIC */
-    scope->length = ioapic_scope_size;
-    scope->enumeration_id = ACPI_BUILD_IOAPIC_ID;
-    scope->bus = Q35_PSEUDO_BUS_PLATFORM;
-    scope->path[0].device = PCI_SLOT(Q35_PSEUDO_DEVFN_IOAPIC);
-    scope->path[0].function = PCI_FUNC(Q35_PSEUDO_DEVFN_IOAPIC);
+    build_append_int_noprefix(table_data, 0x03 /* IOAPIC */, 1); /* Type */
+    build_append_int_noprefix(table_data, ioapic_scope_size, 1); /* Length */
+    build_append_int_noprefix(table_data, 0, 2); /* Reserved */
+    /* Enumeration ID */
+    build_append_int_noprefix(table_data, ACPI_BUILD_IOAPIC_ID, 1);
+    /* Start Bus Number */
+    build_append_int_noprefix(table_data, Q35_PSEUDO_BUS_PLATFORM, 1);
+    /* Path, {Device, Function} pair */
+    build_append_int_noprefix(table_data, PCI_SLOT(Q35_PSEUDO_DEVFN_IOAPIC), 1);
+    build_append_int_noprefix(table_data, PCI_FUNC(Q35_PSEUDO_DEVFN_IOAPIC), 1);
 
     if (iommu->dt_supported) {
-        atsr = acpi_data_push(table_data, sizeof(*atsr));
-        atsr->type = cpu_to_le16(ACPI_DMAR_TYPE_ATSR);
-        atsr->length = cpu_to_le16(sizeof(*atsr));
-        atsr->flags = ACPI_DMAR_ATSR_ALL_PORTS;
-        atsr->pci_segment = cpu_to_le16(0);
+        /* 8.5 Root Port ATS Capability Reporting Structure */
+        build_append_int_noprefix(table_data, 2, 2); /* Type */
+        build_append_int_noprefix(table_data, 8, 2); /* Length */
+        build_append_int_noprefix(table_data, 1 /* ALL_PORTS */, 1); /* Flags */
+        build_append_int_noprefix(table_data, 0, 1); /* Reserved */
+        build_append_int_noprefix(table_data, 0, 2); /* Segment Number */
     }
 
-    build_header(linker, table_data, (void *)(table_data->data + dmar_start),
-                 "DMAR", table_data->len - dmar_start, 1, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 /*
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 37/53] acpi: build_waet: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (36 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 36/53] acpi: build_dmar_q35: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 38/53] acpi: build_amd_iommu: " Igor Mammedov
                   ` (16 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
---
 hw/i386/acpi-build.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 2fe6bffbe8..739f555310 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2101,10 +2101,10 @@ static void
 build_waet(GArray *table_data, BIOSLinker *linker, const char *oem_id,
            const char *oem_table_id)
 {
-    int waet_start = table_data->len;
+    AcpiTable table = { .sig = "WAET", .rev = 1, .oem_id = oem_id,
+                        .oem_table_id = oem_table_id };
 
-    /* WAET header */
-    acpi_data_push(table_data, sizeof(AcpiTableHeader));
+    acpi_init_table(&table, table_data);
     /*
      * Set "ACPI PM timer good" flag.
      *
@@ -2113,9 +2113,7 @@ build_waet(GArray *table_data, BIOSLinker *linker, const char *oem_id,
      * Which avoids costly VMExits caused by guest re-reading it unnecessarily.
      */
     build_append_int_noprefix(table_data, 1 << 1 /* ACPI PM timer good */, 4);
-
-    build_header(linker, table_data, (void *)(table_data->data + waet_start),
-                 "WAET", table_data->len - waet_start, 1, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 /*
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 38/53] acpi: build_amd_iommu: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (37 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 37/53] acpi: build_waet: " Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 39/53] acpi: madt: arm/x86: " Igor Mammedov
                   ` (15 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
---
 hw/i386/acpi-build.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 739f555310..ea6bfff5b7 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2219,12 +2219,12 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
                 const char *oem_table_id)
 {
     int ivhd_table_len = 24;
-    int iommu_start = table_data->len;
     AMDVIState *s = AMD_IOMMU_DEVICE(x86_iommu_get_default());
     GArray *ivhd_blob = g_array_new(false, true, 1);
+    AcpiTable table = { .sig = "IVRS", .rev = 1, .oem_id = oem_id,
+                        .oem_table_id = oem_table_id };
 
-    /* IVRS header */
-    acpi_data_push(table_data, sizeof(AcpiTableHeader));
+    acpi_init_table(&table, table_data);
     /* IVinfo - IO virtualization information common to all
      * IOMMU units in a system
      */
@@ -2309,10 +2309,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
                                  0x48,                      /* special device */
                                  8);
     }
-
-    build_header(linker, table_data, (void *)(table_data->data + iommu_start),
-                 "IVRS", table_data->len - iommu_start, 1, oem_id,
-                 oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 typedef
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 39/53] acpi: madt: arm/x86: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (38 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 38/53] acpi: build_amd_iommu: " Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 40/53] acpi: x86: remove dead code Igor Mammedov
                   ` (14 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, mst, shannon.zhaosl, qemu-arm

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
CC: shannon.zhaosl@gmail.com
CC: peter.maydell@linaro.org
CC: qemu-arm@nongnu.org
CC: drjones@redhat.com
---
 include/hw/acpi/acpi-defs.h |  9 ---------
 hw/arm/virt-acpi-build.c    | 19 +++++++++++--------
 hw/i386/acpi-common.c       | 19 +++++++++++--------
 3 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index c4f0a202e8..c7fa5caa06 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -176,15 +176,6 @@ typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
 #define ACPI_DUAL_PIC                0
 #define ACPI_MULTIPLE_APIC           1
 
-/* Master MADT */
-
-struct AcpiMultipleApicTable {
-    ACPI_TABLE_HEADER_DEF     /* ACPI common table header */
-    uint32_t local_apic_address;     /* Physical address of local APIC */
-    uint32_t flags;
-} QEMU_PACKED;
-typedef struct AcpiMultipleApicTable AcpiMultipleApicTable;
-
 /* Values for Type in APIC sub-headers */
 
 #define ACPI_APIC_PROCESSOR          0
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 159e71dbdd..cd8b73dde9 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -475,19 +475,26 @@ build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
                  vms->oem_table_id);
 }
 
-/* MADT */
+/*
+ * ACPI spec, Revision 5.0
+ * 5.2.12 Multiple APIC Description Table (MADT)
+ */
 static void
 build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
     VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
-    int madt_start = table_data->len;
     const MemMapEntry *memmap = vms->memmap;
     const int *irqmap = vms->irqmap;
     AcpiMadtGenericDistributor *gicd;
     AcpiMadtGenericMsiFrame *gic_msi;
     int i;
+    AcpiTable table = { .sig = "APIC", .rev = 3, .oem_id = vms->oem_id,
+                        .oem_table_id = vms->oem_table_id };
 
-    acpi_data_push(table_data, sizeof(AcpiMultipleApicTable));
+    acpi_init_table(&table, table_data);
+    /* Local Interrupt Controller Address */
+    build_append_int_noprefix(table_data, 0, 4);
+    build_append_int_noprefix(table_data, 0, 4); /* Flags */
 
     gicd = acpi_data_push(table_data, sizeof *gicd);
     gicd->type = ACPI_APIC_GENERIC_DISTRIBUTOR;
@@ -558,11 +565,7 @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
         gic_msi->spi_count = cpu_to_le16(NUM_GICV2M_SPIS);
         gic_msi->spi_base = cpu_to_le16(irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE);
     }
-
-    build_header(linker, table_data,
-                 (void *)(table_data->data + madt_start), "APIC",
-                 table_data->len - madt_start, 3, vms->oem_id,
-                 vms->oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 /* FADT */
diff --git a/hw/i386/acpi-common.c b/hw/i386/acpi-common.c
index 1f5947fcf9..219dcded02 100644
--- a/hw/i386/acpi-common.c
+++ b/hw/i386/acpi-common.c
@@ -71,24 +71,29 @@ void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
     }
 }
 
+/*
+ * ACPI spec, Revision 1.0b
+ * 5.2.8 Multiple APIC Description Table
+ */
 void acpi_build_madt(GArray *table_data, BIOSLinker *linker,
                      X86MachineState *x86ms, AcpiDeviceIf *adev,
                      const char *oem_id, const char *oem_table_id)
 {
     MachineClass *mc = MACHINE_GET_CLASS(x86ms);
     const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(x86ms));
-    int madt_start = table_data->len;
     AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(adev);
     bool x2apic_mode = false;
 
-    AcpiMultipleApicTable *madt;
     AcpiMadtIoApic *io_apic;
     AcpiMadtIntsrcovr *intsrcovr;
     int i;
+    AcpiTable table = { .sig = "APIC", .rev = 1, .oem_id = oem_id,
+                        .oem_table_id = oem_table_id };
 
-    madt = acpi_data_push(table_data, sizeof *madt);
-    madt->local_apic_address = cpu_to_le32(APIC_DEFAULT_ADDRESS);
-    madt->flags = cpu_to_le32(1);
+    acpi_init_table(&table, table_data);
+    /* Local APIC Address */
+    build_append_int_noprefix(table_data, APIC_DEFAULT_ADDRESS, 4);
+    build_append_int_noprefix(table_data, 1 /* PCAT_COMPAT */, 4); /* Flags */
 
     for (i = 0; i < apic_ids->len; i++) {
         adevc->madt_cpu(adev, i, apic_ids, table_data);
@@ -156,8 +161,6 @@ void acpi_build_madt(GArray *table_data, BIOSLinker *linker,
         local_nmi->lint         = 1; /* ACPI_LINT1 */
     }
 
-    build_header(linker, table_data,
-                 (void *)(table_data->data + madt_start), "APIC",
-                 table_data->len - madt_start, 1, oem_id, oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 40/53] acpi: x86: remove dead code
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (39 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 39/53] acpi: madt: arm/x86: " Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 41/53] acpi: x86: set enabled when composing _MAT entries Igor Mammedov
                   ` (13 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/acpi/acpi-defs.h | 13 -------------
 1 file changed, 13 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index c7fa5caa06..af4fa412a5 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -163,19 +163,6 @@ struct AcpiFacsDescriptorRev1 {
 } QEMU_PACKED;
 typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
 
-/*
- * Differentiated System Description Table (DSDT)
- */
-
-/*
- * MADT values and structures
- */
-
-/* Values for MADT PCATCompat */
-
-#define ACPI_DUAL_PIC                0
-#define ACPI_MULTIPLE_APIC           1
-
 /* Values for Type in APIC sub-headers */
 
 #define ACPI_APIC_PROCESSOR          0
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 41/53] acpi: x86: set enabled when composing _MAT entries
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (40 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 40/53] acpi: x86: remove dead code Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 42/53] acpi: x86: madt: use build_append_int_noprefix() API to compose MADT table Igor Mammedov
                   ` (12 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Instead of composing disabled _MAT entry and then later on
patching it to enabled for hotpluggbale CPUs in DSDT,
set it to enabled at the time _MAT entry is built.

It will allow to drop usage of packed structures in
following patches when build_madt() is switched to use
build_append_int_noprefix() API.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
---
 include/hw/acpi/acpi_dev_interface.h |  3 ++-
 include/hw/i386/pc.h                 |  7 ++++---
 hw/acpi/acpi-x86-stub.c              |  3 ++-
 hw/acpi/cpu.c                        | 17 ++---------------
 hw/i386/acpi-common.c                | 18 ++++++------------
 5 files changed, 16 insertions(+), 32 deletions(-)

diff --git a/include/hw/acpi/acpi_dev_interface.h b/include/hw/acpi/acpi_dev_interface.h
index 769ff55c7e..ea6056ab92 100644
--- a/include/hw/acpi/acpi_dev_interface.h
+++ b/include/hw/acpi/acpi_dev_interface.h
@@ -53,6 +53,7 @@ struct AcpiDeviceIfClass {
     void (*ospm_status)(AcpiDeviceIf *adev, ACPIOSTInfoList ***list);
     void (*send_event)(AcpiDeviceIf *adev, AcpiEventStatusBits ev);
     void (*madt_cpu)(AcpiDeviceIf *adev, int uid,
-                     const CPUArchIdList *apic_ids, GArray *entry);
+                     const CPUArchIdList *apic_ids, GArray *entry,
+                     bool force_enabled);
 };
 #endif
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 1522a3359a..124e8d3521 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -192,11 +192,12 @@ void pc_system_firmware_init(PCMachineState *pcms, MemoryRegion *rom_memory);
 bool pc_system_ovmf_table_find(const char *entry, uint8_t **data,
                                int *data_len);
 
-
-/* acpi-build.c */
+/* hw/i386/acpi-common.c */
 void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
-                       const CPUArchIdList *apic_ids, GArray *entry);
+                       const CPUArchIdList *apic_ids, GArray *entry,
+                       bool force_enabled);
 
+/* acpi-build.c */
 extern GlobalProperty pc_compat_6_0[];
 extern const size_t pc_compat_6_0_len;
 
diff --git a/hw/acpi/acpi-x86-stub.c b/hw/acpi/acpi-x86-stub.c
index f88d6a090b..987fc64b36 100644
--- a/hw/acpi/acpi-x86-stub.c
+++ b/hw/acpi/acpi-x86-stub.c
@@ -2,6 +2,7 @@
 #include "hw/i386/pc.h"
 
 void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
-                       const CPUArchIdList *apic_ids, GArray *entry)
+                       const CPUArchIdList *apic_ids, GArray *entry,
+                       bool force_enabled)
 {
 }
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
index f82e9512fd..b20903ea30 100644
--- a/hw/acpi/cpu.c
+++ b/hw/acpi/cpu.c
@@ -669,21 +669,8 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
 
             /* build _MAT object */
             assert(adevc && adevc->madt_cpu);
-            adevc->madt_cpu(adev, i, arch_ids, madt_buf);
-            switch (madt_buf->data[0]) {
-            case ACPI_APIC_PROCESSOR: {
-                AcpiMadtProcessorApic *apic = (void *)madt_buf->data;
-                apic->flags = cpu_to_le32(1);
-                break;
-            }
-            case ACPI_APIC_LOCAL_X2APIC: {
-                AcpiMadtProcessorX2Apic *apic = (void *)madt_buf->data;
-                apic->flags = cpu_to_le32(1);
-                break;
-            }
-            default:
-                assert(0);
-            }
+            adevc->madt_cpu(adev, i, arch_ids, madt_buf,
+                            true); /* set enabled flag */
             aml_append(dev, aml_name_decl("_MAT",
                 aml_buffer(madt_buf->len, (uint8_t *)madt_buf->data)));
             g_array_free(madt_buf, true);
diff --git a/hw/i386/acpi-common.c b/hw/i386/acpi-common.c
index 219dcded02..9d213edece 100644
--- a/hw/i386/acpi-common.c
+++ b/hw/i386/acpi-common.c
@@ -34,9 +34,11 @@
 #include "acpi-common.h"
 
 void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
-                       const CPUArchIdList *apic_ids, GArray *entry)
+                       const CPUArchIdList *apic_ids, GArray *entry,
+                       bool force_enabled)
 {
     uint32_t apic_id = apic_ids->cpus[uid].arch_id;
+    uint32_t flags = apic_ids->cpus[uid].cpu != NULL || force_enabled ? 1 : 0;
 
     /* ACPI spec says that LAPIC entry for non present
      * CPU may be omitted from MADT or it must be marked
@@ -51,11 +53,7 @@ void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
         apic->length = sizeof(*apic);
         apic->processor_id = uid;
         apic->local_apic_id = apic_id;
-        if (apic_ids->cpus[uid].cpu != NULL) {
-            apic->flags = cpu_to_le32(1);
-        } else {
-            apic->flags = cpu_to_le32(0);
-        }
+        apic->flags = cpu_to_le32(flags);
     } else {
         AcpiMadtProcessorX2Apic *apic = acpi_data_push(entry, sizeof *apic);
 
@@ -63,11 +61,7 @@ void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
         apic->length = sizeof(*apic);
         apic->uid = cpu_to_le32(uid);
         apic->x2apic_id = cpu_to_le32(apic_id);
-        if (apic_ids->cpus[uid].cpu != NULL) {
-            apic->flags = cpu_to_le32(1);
-        } else {
-            apic->flags = cpu_to_le32(0);
-        }
+        apic->flags = cpu_to_le32(flags);
     }
 }
 
@@ -96,7 +90,7 @@ void acpi_build_madt(GArray *table_data, BIOSLinker *linker,
     build_append_int_noprefix(table_data, 1 /* PCAT_COMPAT */, 4); /* Flags */
 
     for (i = 0; i < apic_ids->len; i++) {
-        adevc->madt_cpu(adev, i, apic_ids, table_data);
+        adevc->madt_cpu(adev, i, apic_ids, table_data, false);
         if (apic_ids->cpus[i].arch_id > 254) {
             x2apic_mode = true;
         }
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 42/53] acpi: x86: madt: use build_append_int_noprefix() API to compose MADT table
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (41 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 41/53] acpi: x86: set enabled when composing _MAT entries Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 43/53] acpi: arm/virt: " Igor Mammedov
                   ` (11 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Drop usage of packed structures and explicit endian conversions
when building MADT table for arm/x86 and use endian agnostic
build_append_int_noprefix() API to build it.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
---
 include/hw/acpi/acpi-defs.h |  64 ------------------
 hw/i386/acpi-common.c       | 127 ++++++++++++++++++------------------
 2 files changed, 65 insertions(+), 126 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index af4fa412a5..3f174ba208 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -165,17 +165,6 @@ typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
 
 /* Values for Type in APIC sub-headers */
 
-#define ACPI_APIC_PROCESSOR          0
-#define ACPI_APIC_IO                 1
-#define ACPI_APIC_XRUPT_OVERRIDE     2
-#define ACPI_APIC_NMI                3
-#define ACPI_APIC_LOCAL_NMI          4
-#define ACPI_APIC_ADDRESS_OVERRIDE   5
-#define ACPI_APIC_IO_SAPIC           6
-#define ACPI_APIC_LOCAL_SAPIC        7
-#define ACPI_APIC_XRUPT_SOURCE       8
-#define ACPI_APIC_LOCAL_X2APIC       9
-#define ACPI_APIC_LOCAL_X2APIC_NMI      10
 #define ACPI_APIC_GENERIC_CPU_INTERFACE 11
 #define ACPI_APIC_GENERIC_DISTRIBUTOR   12
 #define ACPI_APIC_GENERIC_MSI_FRAME     13
@@ -192,59 +181,6 @@ typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
 
 /* Sub-structures for MADT */
 
-struct AcpiMadtProcessorApic {
-    ACPI_SUB_HEADER_DEF
-    uint8_t  processor_id;           /* ACPI processor id */
-    uint8_t  local_apic_id;          /* Processor's local APIC id */
-    uint32_t flags;
-} QEMU_PACKED;
-typedef struct AcpiMadtProcessorApic AcpiMadtProcessorApic;
-
-struct AcpiMadtIoApic {
-    ACPI_SUB_HEADER_DEF
-    uint8_t  io_apic_id;             /* I/O APIC ID */
-    uint8_t  reserved;               /* Reserved - must be zero */
-    uint32_t address;                /* APIC physical address */
-    uint32_t interrupt;              /* Global system interrupt where INTI
-                                 * lines start */
-} QEMU_PACKED;
-typedef struct AcpiMadtIoApic AcpiMadtIoApic;
-
-struct AcpiMadtIntsrcovr {
-    ACPI_SUB_HEADER_DEF
-    uint8_t  bus;
-    uint8_t  source;
-    uint32_t gsi;
-    uint16_t flags;
-} QEMU_PACKED;
-typedef struct AcpiMadtIntsrcovr AcpiMadtIntsrcovr;
-
-struct AcpiMadtLocalNmi {
-    ACPI_SUB_HEADER_DEF
-    uint8_t  processor_id;           /* ACPI processor id */
-    uint16_t flags;                  /* MPS INTI flags */
-    uint8_t  lint;                   /* Local APIC LINT# */
-} QEMU_PACKED;
-typedef struct AcpiMadtLocalNmi AcpiMadtLocalNmi;
-
-struct AcpiMadtProcessorX2Apic {
-    ACPI_SUB_HEADER_DEF
-    uint16_t reserved;
-    uint32_t x2apic_id;              /* Processor's local x2APIC ID */
-    uint32_t flags;
-    uint32_t uid;                    /* Processor object _UID */
-} QEMU_PACKED;
-typedef struct AcpiMadtProcessorX2Apic AcpiMadtProcessorX2Apic;
-
-struct AcpiMadtLocalX2ApicNmi {
-    ACPI_SUB_HEADER_DEF
-    uint16_t flags;                  /* MPS INTI flags */
-    uint32_t uid;                    /* Processor object _UID */
-    uint8_t  lint;                   /* Local APIC LINT# */
-    uint8_t  reserved[3];            /* Local APIC LINT# */
-} QEMU_PACKED;
-typedef struct AcpiMadtLocalX2ApicNmi AcpiMadtLocalX2ApicNmi;
-
 struct AcpiMadtGenericCpuInterface {
     ACPI_SUB_HEADER_DEF
     uint16_t reserved;
diff --git a/hw/i386/acpi-common.c b/hw/i386/acpi-common.c
index 9d213edece..6261f45c23 100644
--- a/hw/i386/acpi-common.c
+++ b/hw/i386/acpi-common.c
@@ -38,7 +38,9 @@ void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
                        bool force_enabled)
 {
     uint32_t apic_id = apic_ids->cpus[uid].arch_id;
-    uint32_t flags = apic_ids->cpus[uid].cpu != NULL || force_enabled ? 1 : 0;
+    /* Flags – Local APIC Flags */
+    uint32_t flags = apic_ids->cpus[uid].cpu != NULL || force_enabled ?
+                     1 /* Enabled */ : 0;
 
     /* ACPI spec says that LAPIC entry for non present
      * CPU may be omitted from MADT or it must be marked
@@ -47,24 +49,47 @@ void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
      * should be put in MADT but kept disabled.
      */
     if (apic_id < 255) {
-        AcpiMadtProcessorApic *apic = acpi_data_push(entry, sizeof *apic);
-
-        apic->type = ACPI_APIC_PROCESSOR;
-        apic->length = sizeof(*apic);
-        apic->processor_id = uid;
-        apic->local_apic_id = apic_id;
-        apic->flags = cpu_to_le32(flags);
+        /* Rev 1.0b, Table 5-13 Processor Local APIC Structure */
+        build_append_int_noprefix(entry, 0, 1);       /* Type */
+        build_append_int_noprefix(entry, 8, 1);       /* Length */
+        build_append_int_noprefix(entry, uid, 1);     /* ACPI Processor ID */
+        build_append_int_noprefix(entry, apic_id, 1); /* APIC ID */
+        build_append_int_noprefix(entry, flags, 4); /* Flags */
     } else {
-        AcpiMadtProcessorX2Apic *apic = acpi_data_push(entry, sizeof *apic);
-
-        apic->type = ACPI_APIC_LOCAL_X2APIC;
-        apic->length = sizeof(*apic);
-        apic->uid = cpu_to_le32(uid);
-        apic->x2apic_id = cpu_to_le32(apic_id);
-        apic->flags = cpu_to_le32(flags);
+        /* Rev 4.0, 5.2.12.12 Processor Local x2APIC Structure */
+        build_append_int_noprefix(entry, 9, 1);       /* Type */
+        build_append_int_noprefix(entry, 16, 1);      /* Length */
+        build_append_int_noprefix(entry, 0, 2);       /* Reserved */
+        build_append_int_noprefix(entry, apic_id, 4); /* X2APIC ID */
+        build_append_int_noprefix(entry, flags, 4);   /* Flags */
+        build_append_int_noprefix(entry, uid, 4);     /* ACPI Processor UID */
     }
 }
 
+static void build_ioapic(GArray *entry, uint8_t id, uint32_t addr, uint32_t irq)
+{
+    /* Rev 1.0b, 5.2.8.2 IO APIC */
+    build_append_int_noprefix(entry, 1, 1);    /* Type */
+    build_append_int_noprefix(entry, 12, 1);   /* Length */
+    build_append_int_noprefix(entry, id, 1);   /* IO APIC ID */
+    build_append_int_noprefix(entry, 0, 1);    /* Reserved */
+    build_append_int_noprefix(entry, addr, 4); /* IO APIC Address */
+    build_append_int_noprefix(entry, irq, 4);  /* System Vector Base */
+}
+
+static void
+build_xrupt_override(GArray *entry, uint8_t src, uint32_t gsi, uint16_t flags)
+{
+    /* Rev 1.0b, 5.2.8.3.1 Interrupt Source Overrides */
+    build_append_int_noprefix(entry, 2, 1);  /* Type */
+    build_append_int_noprefix(entry, 10, 1); /* Length */
+    build_append_int_noprefix(entry, 0, 1);  /* Bus */
+    build_append_int_noprefix(entry, src, 1);  /* Source */
+    /* Global System Interrupt Vector */
+    build_append_int_noprefix(entry, gsi, 4);
+    build_append_int_noprefix(entry, flags, 2);  /* Flags */
+}
+
 /*
  * ACPI spec, Revision 1.0b
  * 5.2.8 Multiple APIC Description Table
@@ -73,14 +98,11 @@ void acpi_build_madt(GArray *table_data, BIOSLinker *linker,
                      X86MachineState *x86ms, AcpiDeviceIf *adev,
                      const char *oem_id, const char *oem_table_id)
 {
+    int i;
+    bool x2apic_mode = false;
     MachineClass *mc = MACHINE_GET_CLASS(x86ms);
     const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(x86ms));
     AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(adev);
-    bool x2apic_mode = false;
-
-    AcpiMadtIoApic *io_apic;
-    AcpiMadtIntsrcovr *intsrcovr;
-    int i;
     AcpiTable table = { .sig = "APIC", .rev = 1, .oem_id = oem_id,
                         .oem_table_id = oem_table_id };
 
@@ -96,30 +118,14 @@ void acpi_build_madt(GArray *table_data, BIOSLinker *linker,
         }
     }
 
-    io_apic = acpi_data_push(table_data, sizeof *io_apic);
-    io_apic->type = ACPI_APIC_IO;
-    io_apic->length = sizeof(*io_apic);
-    io_apic->io_apic_id = ACPI_BUILD_IOAPIC_ID;
-    io_apic->address = cpu_to_le32(IO_APIC_DEFAULT_ADDRESS);
-    io_apic->interrupt = cpu_to_le32(0);
-
+    build_ioapic(table_data, ACPI_BUILD_IOAPIC_ID, IO_APIC_DEFAULT_ADDRESS, 0);
     if (x86ms->ioapic2) {
-        AcpiMadtIoApic *io_apic2;
-        io_apic2 = acpi_data_push(table_data, sizeof *io_apic);
-        io_apic2->type = ACPI_APIC_IO;
-        io_apic2->length = sizeof(*io_apic);
-        io_apic2->io_apic_id = ACPI_BUILD_IOAPIC_ID + 1;
-        io_apic2->address = cpu_to_le32(IO_APIC_SECONDARY_ADDRESS);
-        io_apic2->interrupt = cpu_to_le32(IO_APIC_SECONDARY_IRQBASE);
+        build_ioapic(table_data, ACPI_BUILD_IOAPIC_ID + 1,
+                     IO_APIC_SECONDARY_ADDRESS, IO_APIC_SECONDARY_IRQBASE);
     }
 
     if (x86ms->apic_xrupt_override) {
-        intsrcovr = acpi_data_push(table_data, sizeof *intsrcovr);
-        intsrcovr->type   = ACPI_APIC_XRUPT_OVERRIDE;
-        intsrcovr->length = sizeof(*intsrcovr);
-        intsrcovr->source = 0;
-        intsrcovr->gsi    = cpu_to_le32(2);
-        intsrcovr->flags  = cpu_to_le16(0); /* conforms to bus specifications */
+        build_xrupt_override(table_data, 0, 2, 0);
     }
 
     for (i = 1; i < 16; i++) {
@@ -127,32 +133,29 @@ void acpi_build_madt(GArray *table_data, BIOSLinker *linker,
             /* No need for a INT source override structure. */
             continue;
         }
-        intsrcovr = acpi_data_push(table_data, sizeof *intsrcovr);
-        intsrcovr->type   = ACPI_APIC_XRUPT_OVERRIDE;
-        intsrcovr->length = sizeof(*intsrcovr);
-        intsrcovr->source = i;
-        intsrcovr->gsi    = cpu_to_le32(i);
-        intsrcovr->flags  = cpu_to_le16(0xd); /* active high, level triggered */
+        build_xrupt_override(table_data, i, i, 0xd);
     }
 
     if (x2apic_mode) {
-        AcpiMadtLocalX2ApicNmi *local_nmi;
-
-        local_nmi = acpi_data_push(table_data, sizeof *local_nmi);
-        local_nmi->type   = ACPI_APIC_LOCAL_X2APIC_NMI;
-        local_nmi->length = sizeof(*local_nmi);
-        local_nmi->uid    = 0xFFFFFFFF; /* all processors */
-        local_nmi->flags  = cpu_to_le16(0);
-        local_nmi->lint   = 1; /* ACPI_LINT1 */
+        /* Rev 4.0, 5.2.12.13 Local x2APIC NMI Structure*/
+        build_append_int_noprefix(table_data, 0xA, 1); /* Type */
+        build_append_int_noprefix(table_data, 12, 1);  /* Length */
+        build_append_int_noprefix(table_data, 0, 2);   /* Flags */
+        /* ACPI Processor UID */
+        build_append_int_noprefix(table_data, 0xFFFFFFFF /* all processors */,
+                                  4);
+        /* Local x2APIC INTI# */
+        build_append_int_noprefix(table_data, 1 /* ACPI_LINT1 */, 1);
+        build_append_int_noprefix(table_data, 0, 3);
     } else {
-        AcpiMadtLocalNmi *local_nmi;
-
-        local_nmi = acpi_data_push(table_data, sizeof *local_nmi);
-        local_nmi->type         = ACPI_APIC_LOCAL_NMI;
-        local_nmi->length       = sizeof(*local_nmi);
-        local_nmi->processor_id = 0xff; /* all processors */
-        local_nmi->flags        = cpu_to_le16(0);
-        local_nmi->lint         = 1; /* ACPI_LINT1 */
+        /* Rev 1.0b, 5.2.8.3.3 Local APIC NMI */
+        build_append_int_noprefix(table_data, 4, 1);  /* Type */
+        build_append_int_noprefix(table_data, 6, 1);  /* Length */
+        /* ACPI Processor ID */
+        build_append_int_noprefix(table_data, 0xff /* all processors */, 1);
+        build_append_int_noprefix(table_data, 0, 2);  /* Flags */
+        /* Local APIC INTI# */
+        build_append_int_noprefix(table_data, 1 /* ACPI_LINT1 */, 1);
     }
 
     acpi_table_composed(linker, &table);
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 43/53] acpi: arm/virt: madt: use build_append_int_noprefix() API to compose MADT table
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (42 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 42/53] acpi: x86: madt: use build_append_int_noprefix() API to compose MADT table Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 44/53] acpi: build_dsdt_microvm: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
                   ` (10 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, shannon.zhaosl, qemu-arm, mst

Drop usage of packed structures and explicit endian conversions
when building MADT table for arm/x86 and use endian agnostic
build_append_int_noprefix() API to build it.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: drjones@redhat.com
CC: peter.maydell@linaro.org
CC: shannon.zhaosl@gmail.com
CC: qemu-arm@nongnu.org
---
 include/hw/acpi/acpi-defs.h |  84 --------------------
 hw/arm/virt-acpi-build.c    | 149 +++++++++++++++++++++---------------
 2 files changed, 89 insertions(+), 144 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 3f174ba208..bcada37601 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -163,90 +163,6 @@ struct AcpiFacsDescriptorRev1 {
 } QEMU_PACKED;
 typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
 
-/* Values for Type in APIC sub-headers */
-
-#define ACPI_APIC_GENERIC_CPU_INTERFACE 11
-#define ACPI_APIC_GENERIC_DISTRIBUTOR   12
-#define ACPI_APIC_GENERIC_MSI_FRAME     13
-#define ACPI_APIC_GENERIC_REDISTRIBUTOR 14
-#define ACPI_APIC_GENERIC_TRANSLATOR    15
-#define ACPI_APIC_RESERVED              16   /* 16 and greater are reserved */
-
-/*
- * MADT sub-structures (Follow MULTIPLE_APIC_DESCRIPTION_TABLE)
- */
-#define ACPI_SUB_HEADER_DEF   /* Common ACPI sub-structure header */\
-    uint8_t  type;                               \
-    uint8_t  length;
-
-/* Sub-structures for MADT */
-
-struct AcpiMadtGenericCpuInterface {
-    ACPI_SUB_HEADER_DEF
-    uint16_t reserved;
-    uint32_t cpu_interface_number;
-    uint32_t uid;
-    uint32_t flags;
-    uint32_t parking_version;
-    uint32_t performance_interrupt;
-    uint64_t parked_address;
-    uint64_t base_address;
-    uint64_t gicv_base_address;
-    uint64_t gich_base_address;
-    uint32_t vgic_interrupt;
-    uint64_t gicr_base_address;
-    uint64_t arm_mpidr;
-} QEMU_PACKED;
-
-typedef struct AcpiMadtGenericCpuInterface AcpiMadtGenericCpuInterface;
-
-/* GICC CPU Interface Flags */
-#define ACPI_MADT_GICC_ENABLED 1
-
-struct AcpiMadtGenericDistributor {
-    ACPI_SUB_HEADER_DEF
-    uint16_t reserved;
-    uint32_t gic_id;
-    uint64_t base_address;
-    uint32_t global_irq_base;
-    /* ACPI 5.1 Errata 1228 Present GIC version in MADT table */
-    uint8_t version;
-    uint8_t reserved2[3];
-} QEMU_PACKED;
-
-typedef struct AcpiMadtGenericDistributor AcpiMadtGenericDistributor;
-
-struct AcpiMadtGenericMsiFrame {
-    ACPI_SUB_HEADER_DEF
-    uint16_t reserved;
-    uint32_t gic_msi_frame_id;
-    uint64_t base_address;
-    uint32_t flags;
-    uint16_t spi_count;
-    uint16_t spi_base;
-} QEMU_PACKED;
-
-typedef struct AcpiMadtGenericMsiFrame AcpiMadtGenericMsiFrame;
-
-struct AcpiMadtGenericRedistributor {
-    ACPI_SUB_HEADER_DEF
-    uint16_t reserved;
-    uint64_t base_address;
-    uint32_t range_length;
-} QEMU_PACKED;
-
-typedef struct AcpiMadtGenericRedistributor AcpiMadtGenericRedistributor;
-
-struct AcpiMadtGenericTranslator {
-    ACPI_SUB_HEADER_DEF
-    uint16_t reserved;
-    uint32_t translation_id;
-    uint64_t base_address;
-    uint32_t reserved2;
-} QEMU_PACKED;
-
-typedef struct AcpiMadtGenericTranslator AcpiMadtGenericTranslator;
-
 /*
  * Generic Timer Description Table (GTDT)
  */
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index cd8b73dde9..dd8011a670 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -476,94 +476,123 @@ build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 }
 
 /*
- * ACPI spec, Revision 5.0
+ * ACPI spec, Revision 5.1 Errata A
  * 5.2.12 Multiple APIC Description Table (MADT)
  */
+static void build_append_gicr(GArray *table_data, uint64_t base, uint32_t size)
+{
+    build_append_int_noprefix(table_data, 0xE, 1);  /* Type */
+    build_append_int_noprefix(table_data, 16, 1);   /* Length */
+    build_append_int_noprefix(table_data, 0, 2);    /* Reserved */
+    /* Discovery Range Base Addres */
+    build_append_int_noprefix(table_data, base, 8);
+    build_append_int_noprefix(table_data, size, 4); /* Discovery Range Length */
+}
+
 static void
 build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
+    int i;
     VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
     const MemMapEntry *memmap = vms->memmap;
-    const int *irqmap = vms->irqmap;
-    AcpiMadtGenericDistributor *gicd;
-    AcpiMadtGenericMsiFrame *gic_msi;
-    int i;
     AcpiTable table = { .sig = "APIC", .rev = 3, .oem_id = vms->oem_id,
                         .oem_table_id = vms->oem_table_id };
 
     acpi_init_table(&table, table_data);
     /* Local Interrupt Controller Address */
     build_append_int_noprefix(table_data, 0, 4);
-    build_append_int_noprefix(table_data, 0, 4); /* Flags */
-
-    gicd = acpi_data_push(table_data, sizeof *gicd);
-    gicd->type = ACPI_APIC_GENERIC_DISTRIBUTOR;
-    gicd->length = sizeof(*gicd);
-    gicd->base_address = cpu_to_le64(memmap[VIRT_GIC_DIST].base);
-    gicd->version = vms->gic_version;
+    build_append_int_noprefix(table_data, 0, 4);   /* Flags */
+
+    /* 5.2.12.15 GIC Distributor Structure */
+    build_append_int_noprefix(table_data, 0xC, 1); /* Type */
+    build_append_int_noprefix(table_data, 24, 1);  /* Length */
+    build_append_int_noprefix(table_data, 0, 2);   /* Reserved */
+    build_append_int_noprefix(table_data, 0, 4);   /* GIC ID */
+    /* Physical Base Address */
+    build_append_int_noprefix(table_data, memmap[VIRT_GIC_DIST].base, 8);
+    build_append_int_noprefix(table_data, 0, 4);   /* System Vector Base */
+    /* GIC version */
+    build_append_int_noprefix(table_data, vms->gic_version, 1);
+    build_append_int_noprefix(table_data, 0, 3);   /* Reserved */
 
     for (i = 0; i < MACHINE(vms)->smp.cpus; i++) {
-        AcpiMadtGenericCpuInterface *gicc = acpi_data_push(table_data,
-                                                           sizeof(*gicc));
         ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(i));
+        uint64_t physical_base_address = 0, gich = 0, gicv = 0;
+        uint32_t vgic_interrupt = vms->virt ? PPI(ARCH_GIC_MAINT_IRQ) : 0;
+        uint32_t pmu_interrupt = arm_feature(&armcpu->env, ARM_FEATURE_PMU) ?
+                                             PPI(VIRTUAL_PMU_IRQ) : 0;
 
-        gicc->type = ACPI_APIC_GENERIC_CPU_INTERFACE;
-        gicc->length = sizeof(*gicc);
         if (vms->gic_version == 2) {
-            gicc->base_address = cpu_to_le64(memmap[VIRT_GIC_CPU].base);
-            gicc->gich_base_address = cpu_to_le64(memmap[VIRT_GIC_HYP].base);
-            gicc->gicv_base_address = cpu_to_le64(memmap[VIRT_GIC_VCPU].base);
+            physical_base_address = memmap[VIRT_GIC_CPU].base;
+            gicv = memmap[VIRT_GIC_VCPU].base;
+            gich = memmap[VIRT_GIC_HYP].base;
         }
-        gicc->cpu_interface_number = cpu_to_le32(i);
-        gicc->arm_mpidr = cpu_to_le64(armcpu->mp_affinity);
-        gicc->uid = cpu_to_le32(i);
-        gicc->flags = cpu_to_le32(ACPI_MADT_GICC_ENABLED);
 
-        if (arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
-            gicc->performance_interrupt = cpu_to_le32(PPI(VIRTUAL_PMU_IRQ));
-        }
-        if (vms->virt) {
-            gicc->vgic_interrupt = cpu_to_le32(PPI(ARCH_GIC_MAINT_IRQ));
-        }
+        /* 5.2.12.14 GIC Structure */
+        build_append_int_noprefix(table_data, 0xB, 1);  /* Type */
+        build_append_int_noprefix(table_data, 76, 1);   /* Length */
+        build_append_int_noprefix(table_data, 0, 2);    /* Reserved */
+        build_append_int_noprefix(table_data, i, 4);    /* GIC ID */
+        build_append_int_noprefix(table_data, i, 4);    /* ACPI Processor UID */
+        /* Flags */
+        build_append_int_noprefix(table_data, 1, 4);    /* Enabled */
+        /* Parking Protocol Version */
+        build_append_int_noprefix(table_data, 0, 4);
+        /* Performance Interrupt GSIV */
+        build_append_int_noprefix(table_data, pmu_interrupt, 4);
+        build_append_int_noprefix(table_data, 0, 8); /* Parked Address */
+        /* Physical Base Address */
+        build_append_int_noprefix(table_data, physical_base_address, 8);
+        build_append_int_noprefix(table_data, gicv, 8); /* GICV */
+        build_append_int_noprefix(table_data, gich, 8); /* GICH */
+        /* VGIC Maintenance interrupt */
+        build_append_int_noprefix(table_data, vgic_interrupt, 4);
+        build_append_int_noprefix(table_data, 0, 8);    /* GICR Base Address*/
+        /* MPIDR */
+        build_append_int_noprefix(table_data, armcpu->mp_affinity, 8);
     }
 
     if (vms->gic_version == 3) {
-        AcpiMadtGenericTranslator *gic_its;
-        int nb_redist_regions = virt_gicv3_redist_region_count(vms);
-        AcpiMadtGenericRedistributor *gicr = acpi_data_push(table_data,
-                                                         sizeof *gicr);
-
-        gicr->type = ACPI_APIC_GENERIC_REDISTRIBUTOR;
-        gicr->length = sizeof(*gicr);
-        gicr->base_address = cpu_to_le64(memmap[VIRT_GIC_REDIST].base);
-        gicr->range_length = cpu_to_le32(memmap[VIRT_GIC_REDIST].size);
-
-        if (nb_redist_regions == 2) {
-            gicr = acpi_data_push(table_data, sizeof(*gicr));
-            gicr->type = ACPI_APIC_GENERIC_REDISTRIBUTOR;
-            gicr->length = sizeof(*gicr);
-            gicr->base_address =
-                cpu_to_le64(memmap[VIRT_HIGH_GIC_REDIST2].base);
-            gicr->range_length =
-                cpu_to_le32(memmap[VIRT_HIGH_GIC_REDIST2].size);
+        build_append_gicr(table_data, memmap[VIRT_GIC_REDIST].base,
+                                      memmap[VIRT_GIC_REDIST].size);
+        if (virt_gicv3_redist_region_count(vms) == 2) {
+            build_append_gicr(table_data, memmap[VIRT_HIGH_GIC_REDIST2].base,
+                                          memmap[VIRT_HIGH_GIC_REDIST2].size);
         }
 
         if (its_class_name() && !vmc->no_its) {
-            gic_its = acpi_data_push(table_data, sizeof *gic_its);
-            gic_its->type = ACPI_APIC_GENERIC_TRANSLATOR;
-            gic_its->length = sizeof(*gic_its);
-            gic_its->translation_id = 0;
-            gic_its->base_address = cpu_to_le64(memmap[VIRT_GIC_ITS].base);
+            /*
+             * FIXME: Structure is from Revision 6.0 where 'GIC Structure'
+             * has additional fields on top of implemented 5.1 Errata A
+             * make it consistent with v6.0 if ITS is present or bump
+             * everything to v6.0 unconditionally
+             */
+            /*
+             * ACPI spec, Revision  6.0
+             * 5.2.12.18 GIC ITS Structure
+             */
+            build_append_int_noprefix(table_data, 0xF, 1);  /* Type */
+            build_append_int_noprefix(table_data, 16, 1);   /* Length */
+            build_append_int_noprefix(table_data, 0, 2);    /* Reserved */
+            build_append_int_noprefix(table_data, 0, 4);    /* GIC ITS ID */
+            /* Physical Base Address */
+            build_append_int_noprefix(table_data, memmap[VIRT_GIC_ITS].base, 8);
+            build_append_int_noprefix(table_data, 0, 4);    /* Reserved */
         }
     } else {
-        gic_msi = acpi_data_push(table_data, sizeof *gic_msi);
-        gic_msi->type = ACPI_APIC_GENERIC_MSI_FRAME;
-        gic_msi->length = sizeof(*gic_msi);
-        gic_msi->gic_msi_frame_id = 0;
-        gic_msi->base_address = cpu_to_le64(memmap[VIRT_GIC_V2M].base);
-        gic_msi->flags = cpu_to_le32(1);
-        gic_msi->spi_count = cpu_to_le16(NUM_GICV2M_SPIS);
-        gic_msi->spi_base = cpu_to_le16(irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE);
+        const uint16_t spi_base = vms->irqmap[VIRT_GIC_V2M] + ARM_SPI_BASE;
+
+        /* 5.2.12.16 GIC MSI Frame Structure */
+        build_append_int_noprefix(table_data, 0xD, 1);  /* Type */
+        build_append_int_noprefix(table_data, 24, 1);   /* Length */
+        build_append_int_noprefix(table_data, 0, 2);    /* Reserved */
+        build_append_int_noprefix(table_data, 0, 4);    /* GIC MSI Frame ID */
+        /* Physical Base Address */
+        build_append_int_noprefix(table_data, memmap[VIRT_GIC_V2M].base, 8);
+        build_append_int_noprefix(table_data, 1, 4);    /* Flags */
+        /* SPI Count */
+        build_append_int_noprefix(table_data, NUM_GICV2M_SPIS, 2);
+        build_append_int_noprefix(table_data, spi_base, 2); /* SPI Base */
     }
     acpi_table_composed(linker, &table);
 }
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 44/53] acpi: build_dsdt_microvm: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (43 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 43/53] acpi: arm/virt: " Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 45/53] acpi: arm: virt: build_dsdt: " Igor Mammedov
                   ` (9 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
---
 hw/i386/acpi-microvm.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/hw/i386/acpi-microvm.c b/hw/i386/acpi-microvm.c
index 1a0f77b911..82126680bb 100644
--- a/hw/i386/acpi-microvm.c
+++ b/hw/i386/acpi-microvm.c
@@ -113,16 +113,16 @@ build_dsdt_microvm(GArray *table_data, BIOSLinker *linker,
     Aml *dsdt, *sb_scope, *scope, *pkg;
     bool ambiguous;
     Object *isabus;
+    AcpiTable table = { .sig = "DSDT", .rev = 2, .oem_id = x86ms->oem_id,
+                        .oem_table_id = x86ms->oem_table_id };
 
     isabus = object_resolve_path_type("", TYPE_ISA_BUS, &ambiguous);
     assert(isabus);
     assert(!ambiguous);
 
+    acpi_init_table(&table, table_data);
     dsdt = init_aml_allocator();
 
-    /* Reserve space for header */
-    acpi_data_push(dsdt->buf, sizeof(AcpiTableHeader));
-
     sb_scope = aml_scope("_SB");
     fw_cfg_add_acpi_dsdt(sb_scope, x86ms->fw_cfg);
     isa_build_aml(ISA_BUS(isabus), sb_scope);
@@ -144,11 +144,10 @@ build_dsdt_microvm(GArray *table_data, BIOSLinker *linker,
     aml_append(scope, aml_name_decl("_S5", pkg));
     aml_append(dsdt, scope);
 
-    /* copy AML table into ACPI tables blob and patch header there */
+    /* copy AML bytecode into ACPI tables blob */
     g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
-    build_header(linker, table_data,
-        (void *)(table_data->data + table_data->len - dsdt->buf->len),
-                 "DSDT", dsdt->buf->len, 2, x86ms->oem_id, x86ms->oem_table_id);
+
+    acpi_table_composed(linker, &table);
     free_aml_allocator();
 }
 
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 45/53] acpi: arm: virt: build_dsdt: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (44 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 44/53] acpi: build_dsdt_microvm: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 46/53] acpi: arm: virt: build_iort: " Igor Mammedov
                   ` (8 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, shannon.zhaosl, qemu-arm, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: peter.maydell@linaro.org
CC: shannon.zhaosl@gmail.com
CC: qemu-arm@nongnu.org
CC: drjones@redhat.com
---
 hw/arm/virt-acpi-build.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index dd8011a670..d15e67a39b 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -636,10 +636,11 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
     MachineState *ms = MACHINE(vms);
     const MemMapEntry *memmap = vms->memmap;
     const int *irqmap = vms->irqmap;
+    AcpiTable table = { .sig = "DSDT", .rev = 2, .oem_id = vms->oem_id,
+                        .oem_table_id = vms->oem_table_id };
 
+    acpi_init_table(&table, table_data);
     dsdt = init_aml_allocator();
-    /* Reserve space for header */
-    acpi_data_push(dsdt->buf, sizeof(AcpiTableHeader));
 
     /* When booting the VM with UEFI, UEFI takes ownership of the RTC hardware.
      * While UEFI can use libfdt to disable the RTC device node in the DTB that
@@ -686,12 +687,10 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 
     aml_append(dsdt, scope);
 
-    /* copy AML table into ACPI tables blob and patch header there */
+    /* copy AML table into ACPI tables blob */
     g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
-    build_header(linker, table_data,
-        (void *)(table_data->data + table_data->len - dsdt->buf->len),
-                 "DSDT", dsdt->buf->len, 2, vms->oem_id,
-                 vms->oem_table_id);
+
+    acpi_table_composed(linker, &table);
     free_aml_allocator();
 }
 
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 46/53] acpi: arm: virt: build_iort: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (45 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 45/53] acpi: arm: virt: build_dsdt: " Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 47/53] acpi: arm/virt: convert build_iort() to endian agnostic build_append_FOO() API Igor Mammedov
                   ` (7 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, shannon.zhaosl, qemu-arm, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: drjones@redhat.com
CC: peter.maydell@linaro.org
CC: shannon.zhaosl@gmail.com
CC: qemu-arm@nongnu.org
---
 include/hw/acpi/acpi-defs.h | 14 ------------
 hw/arm/virt-acpi-build.c    | 43 +++++++++++++++----------------------
 2 files changed, 17 insertions(+), 40 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index bcada37601..195f90caf6 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -188,20 +188,6 @@ struct AcpiGenericTimerTable {
 } QEMU_PACKED;
 typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
 
-/*
- * Input Output Remapping Table (IORT)
- * Conforms to "IO Remapping Table System Software on ARM Platforms",
- * Document number: ARM DEN 0049B, October 2015
- */
-
-struct AcpiIortTable {
-    ACPI_TABLE_HEADER_DEF     /* ACPI common table header */
-    uint32_t node_count;
-    uint32_t node_offset;
-    uint32_t reserved;
-} QEMU_PACKED;
-typedef struct AcpiIortTable AcpiIortTable;
-
 /*
  * IORT node types
  */
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index d15e67a39b..ac5e07e43c 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -239,18 +239,22 @@ static void acpi_dsdt_add_tpm(Aml *scope, VirtMachineState *vms)
 }
 #endif
 
+/*
+ * Input Output Remapping Table (IORT)
+ * Conforms to "IO Remapping Table System Software on ARM Platforms",
+ * Document number: ARM DEN 0049B, October 2015
+ */
 static void
 build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
-    int nb_nodes, iort_start = table_data->len;
+    int nb_nodes;
     AcpiIortIdMapping *idmap;
     AcpiIortItsGroup *its;
-    AcpiIortTable *iort;
     AcpiIortSmmu3 *smmu;
-    size_t node_size, iort_node_offset, iort_length, smmu_offset = 0;
+    size_t node_size, iort_node_offset = 48, smmu_offset = 0;
     AcpiIortRC *rc;
-
-    iort = acpi_data_push(table_data, sizeof(*iort));
+    AcpiTable table = { .sig = "IORT", .rev = 0, .oem_id = vms->oem_id,
+                        .oem_table_id = vms->oem_table_id };
 
     if (vms->iommu == VIRT_IOMMU_SMMUV3) {
         nb_nodes = 3; /* RC, ITS, SMMUv3 */
@@ -258,18 +262,16 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
         nb_nodes = 2; /* RC, ITS */
     }
 
-    iort_length = sizeof(*iort);
-    iort->node_count = cpu_to_le32(nb_nodes);
-    /*
-     * Use a copy in case table_data->data moves during acpi_data_push
-     * operations.
-     */
-    iort_node_offset = sizeof(*iort);
-    iort->node_offset = cpu_to_le32(iort_node_offset);
+    /* Table 2 The IORT */
+    acpi_init_table(&table, table_data);
+    /* Number of IORT Nodes */
+    build_append_int_noprefix(table_data, nb_nodes, 4);
+    /* Offset to Array of IORT Nodes */
+    build_append_int_noprefix(table_data, iort_node_offset, 4);
+    build_append_int_noprefix(table_data, 0, 4); /* Reserved */
 
     /* ITS group node */
     node_size =  sizeof(*its) + sizeof(uint32_t);
-    iort_length += node_size;
     its = acpi_data_push(table_data, node_size);
 
     its->type = ACPI_IORT_NODE_ITS_GROUP;
@@ -283,7 +285,6 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
         /* SMMUv3 node */
         smmu_offset = iort_node_offset + node_size;
         node_size = sizeof(*smmu) + sizeof(*idmap);
-        iort_length += node_size;
         smmu = acpi_data_push(table_data, node_size);
 
         smmu->type = ACPI_IORT_NODE_SMMU_V3;
@@ -308,7 +309,6 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 
     /* Root Complex Node */
     node_size = sizeof(*rc) + sizeof(*idmap);
-    iort_length += node_size;
     rc = acpi_data_push(table_data, node_size);
 
     rc->type = ACPI_IORT_NODE_PCI_ROOT_COMPLEX;
@@ -335,16 +335,7 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
         idmap->output_reference = cpu_to_le32(iort_node_offset);
     }
 
-    /*
-     * Update the pointer address in case table_data->data moves during above
-     * acpi_data_push operations.
-     */
-    iort = (AcpiIortTable *)(table_data->data + iort_start);
-    iort->length = cpu_to_le32(iort_length);
-
-    build_header(linker, table_data, (void *)(table_data->data + iort_start),
-                 "IORT", table_data->len - iort_start, 0, vms->oem_id,
-                 vms->oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 static void
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 47/53] acpi: arm/virt: convert build_iort() to endian agnostic build_append_FOO() API
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (46 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 46/53] acpi: arm: virt: build_iort: " Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 48/53] acpi: arm/virt: build_spcr: fix invalid cast Igor Mammedov
                   ` (6 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, shannon.zhaosl, qemu-arm, mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: drjones@redhat.com
CC: peter.maydell@linaro.org
CC: shannon.zhaosl@gmail.com
CC: qemu-arm@nongnu.org
---
 include/hw/acpi/acpi-defs.h |  71 ------------------
 hw/arm/virt-acpi-build.c    | 143 +++++++++++++++++++-----------------
 2 files changed, 77 insertions(+), 137 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 195f90caf6..6f2f08a9de 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -188,75 +188,4 @@ struct AcpiGenericTimerTable {
 } QEMU_PACKED;
 typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
 
-/*
- * IORT node types
- */
-
-#define ACPI_IORT_NODE_HEADER_DEF   /* Node format common fields */ \
-    uint8_t  type;          \
-    uint16_t length;        \
-    uint8_t  revision;      \
-    uint32_t reserved;      \
-    uint32_t mapping_count; \
-    uint32_t mapping_offset;
-
-/* Values for node Type above */
-enum {
-        ACPI_IORT_NODE_ITS_GROUP = 0x00,
-        ACPI_IORT_NODE_NAMED_COMPONENT = 0x01,
-        ACPI_IORT_NODE_PCI_ROOT_COMPLEX = 0x02,
-        ACPI_IORT_NODE_SMMU = 0x03,
-        ACPI_IORT_NODE_SMMU_V3 = 0x04
-};
-
-struct AcpiIortIdMapping {
-    uint32_t input_base;
-    uint32_t id_count;
-    uint32_t output_base;
-    uint32_t output_reference;
-    uint32_t flags;
-} QEMU_PACKED;
-typedef struct AcpiIortIdMapping AcpiIortIdMapping;
-
-struct AcpiIortMemoryAccess {
-    uint32_t cache_coherency;
-    uint8_t  hints;
-    uint16_t reserved;
-    uint8_t  memory_flags;
-} QEMU_PACKED;
-typedef struct AcpiIortMemoryAccess AcpiIortMemoryAccess;
-
-struct AcpiIortItsGroup {
-    ACPI_IORT_NODE_HEADER_DEF
-    uint32_t its_count;
-    uint32_t identifiers[];
-} QEMU_PACKED;
-typedef struct AcpiIortItsGroup AcpiIortItsGroup;
-
-#define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE 1
-
-struct AcpiIortSmmu3 {
-    ACPI_IORT_NODE_HEADER_DEF
-    uint64_t base_address;
-    uint32_t flags;
-    uint32_t reserved2;
-    uint64_t vatos_address;
-    uint32_t model;
-    uint32_t event_gsiv;
-    uint32_t pri_gsiv;
-    uint32_t gerr_gsiv;
-    uint32_t sync_gsiv;
-    AcpiIortIdMapping id_mapping_array[];
-} QEMU_PACKED;
-typedef struct AcpiIortSmmu3 AcpiIortSmmu3;
-
-struct AcpiIortRC {
-    ACPI_IORT_NODE_HEADER_DEF
-    AcpiIortMemoryAccess memory_properties;
-    uint32_t ats_attribute;
-    uint32_t pci_segment_number;
-    AcpiIortIdMapping id_mapping_array[];
-} QEMU_PACKED;
-typedef struct AcpiIortRC AcpiIortRC;
-
 #endif
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index ac5e07e43c..b88ea4b70a 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -239,6 +239,21 @@ static void acpi_dsdt_add_tpm(Aml *scope, VirtMachineState *vms)
 }
 #endif
 
+#define ID_MAPPING_ENTRY_SIZE 20
+#define SMMU_V3_ENTRY_SIZE 60
+#define ROOT_COMPLEX_ENTRY_SIZE 32
+#define IORT_NODE_OFFSET 48
+
+static void build_iort_id_mapping(GArray *table_data, uint32_t out_ref)
+{
+    /* Identity RID mapping covering the whole input RID range */
+    build_append_int_noprefix(table_data, 0, 4); /* Input base */
+    build_append_int_noprefix(table_data, 0xFFFF, 4); /* Number of IDs */
+    build_append_int_noprefix(table_data, 0, 4); /* Output base */
+    build_append_int_noprefix(table_data, out_ref, 4); /* Output Reference */
+    build_append_int_noprefix(table_data, 0, 4); /* Flags */
+}
+
 /*
  * Input Output Remapping Table (IORT)
  * Conforms to "IO Remapping Table System Software on ARM Platforms",
@@ -247,92 +262,88 @@ static void acpi_dsdt_add_tpm(Aml *scope, VirtMachineState *vms)
 static void
 build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
-    int nb_nodes;
-    AcpiIortIdMapping *idmap;
-    AcpiIortItsGroup *its;
-    AcpiIortSmmu3 *smmu;
-    size_t node_size, iort_node_offset = 48, smmu_offset = 0;
-    AcpiIortRC *rc;
+    size_t node_size, smmu_offset = 0;
     AcpiTable table = { .sig = "IORT", .rev = 0, .oem_id = vms->oem_id,
                         .oem_table_id = vms->oem_table_id };
 
-    if (vms->iommu == VIRT_IOMMU_SMMUV3) {
-        nb_nodes = 3; /* RC, ITS, SMMUv3 */
-    } else {
-        nb_nodes = 2; /* RC, ITS */
-    }
-
     /* Table 2 The IORT */
     acpi_init_table(&table, table_data);
     /* Number of IORT Nodes */
-    build_append_int_noprefix(table_data, nb_nodes, 4);
+    if (vms->iommu == VIRT_IOMMU_SMMUV3) {
+        build_append_int_noprefix(table_data, 3 /* RC, ITS, SMMUv3 */, 4);
+    } else {
+        build_append_int_noprefix(table_data, 2 /* RC, ITS */, 4);
+    }
     /* Offset to Array of IORT Nodes */
-    build_append_int_noprefix(table_data, iort_node_offset, 4);
+    build_append_int_noprefix(table_data, IORT_NODE_OFFSET, 4);
     build_append_int_noprefix(table_data, 0, 4); /* Reserved */
 
-    /* ITS group node */
-    node_size =  sizeof(*its) + sizeof(uint32_t);
-    its = acpi_data_push(table_data, node_size);
-
-    its->type = ACPI_IORT_NODE_ITS_GROUP;
-    its->length = cpu_to_le16(node_size);
-    its->its_count = cpu_to_le32(1);
-    its->identifiers[0] = 0; /* MADT translation_id */
+    /* 3.1.1.3 ITS group node */
+    build_append_int_noprefix(table_data, 0 /* ITS Group */, 1); /* Type */
+    node_size =  20 /* fixed header size */ + 4 /* 1 GIC ITS Identifier */;
+    build_append_int_noprefix(table_data, node_size, 2); /* Length */
+    build_append_int_noprefix(table_data, 0, 1); /* Revision */
+    build_append_int_noprefix(table_data, 0, 4); /* Reserved */
+    build_append_int_noprefix(table_data, 0, 4); /* Number of ID mappings */
+    build_append_int_noprefix(table_data, 0, 4); /* Reference to ID Array */
+    build_append_int_noprefix(table_data, 1, 4); /* Number of ITSs */
+    /* GIC ITS Identifier Array */
+    build_append_int_noprefix(table_data, 0 /* MADT translation_id */, 4);
 
     if (vms->iommu == VIRT_IOMMU_SMMUV3) {
         int irq =  vms->irqmap[VIRT_SMMU] + ARM_SPI_BASE;
 
-        /* SMMUv3 node */
-        smmu_offset = iort_node_offset + node_size;
-        node_size = sizeof(*smmu) + sizeof(*idmap);
-        smmu = acpi_data_push(table_data, node_size);
-
-        smmu->type = ACPI_IORT_NODE_SMMU_V3;
-        smmu->length = cpu_to_le16(node_size);
-        smmu->mapping_count = cpu_to_le32(1);
-        smmu->mapping_offset = cpu_to_le32(sizeof(*smmu));
-        smmu->base_address = cpu_to_le64(vms->memmap[VIRT_SMMU].base);
-        smmu->flags = cpu_to_le32(ACPI_IORT_SMMU_V3_COHACC_OVERRIDE);
-        smmu->event_gsiv = cpu_to_le32(irq);
-        smmu->pri_gsiv = cpu_to_le32(irq + 1);
-        smmu->sync_gsiv = cpu_to_le32(irq + 2);
-        smmu->gerr_gsiv = cpu_to_le32(irq + 3);
-
-        /* Identity RID mapping covering the whole input RID range */
-        idmap = &smmu->id_mapping_array[0];
-        idmap->input_base = 0;
-        idmap->id_count = cpu_to_le32(0xFFFF);
-        idmap->output_base = 0;
-        /* output IORT node is the ITS group node (the first node) */
-        idmap->output_reference = cpu_to_le32(iort_node_offset);
+        smmu_offset = table_data->len - table.table_offset;
+        /* 3.1.1.2 SMMUv3 */
+        build_append_int_noprefix(table_data, 4 /* SMMUv3 */, 1); /* Type */
+        node_size =  SMMU_V3_ENTRY_SIZE + ID_MAPPING_ENTRY_SIZE;
+        build_append_int_noprefix(table_data, node_size, 2); /* Length */
+        build_append_int_noprefix(table_data, 0, 1); /* Revision */
+        build_append_int_noprefix(table_data, 0, 4); /* Reserved */
+        build_append_int_noprefix(table_data, 1, 4); /* Number of ID mappings */
+        /* Reference to ID Array */
+        build_append_int_noprefix(table_data, SMMU_V3_ENTRY_SIZE, 4);
+        /* Base address */
+        build_append_int_noprefix(table_data, vms->memmap[VIRT_SMMU].base, 8);
+        /* Flags */
+        build_append_int_noprefix(table_data, 1 /* COHACC OverrideNote */, 4);
+        build_append_int_noprefix(table_data, 0, 4); /* Reserved */
+        build_append_int_noprefix(table_data, 0, 8); /* VATOS address */
+        /* Model */
+        build_append_int_noprefix(table_data, 0 /* Generic SMMU-v3 */, 4);
+        build_append_int_noprefix(table_data, irq, 4); /* Event */
+        build_append_int_noprefix(table_data, irq + 1, 4); /* PRI */
+        build_append_int_noprefix(table_data, irq + 3, 4); /* GERR */
+        build_append_int_noprefix(table_data, irq + 2, 4); /* Sync */
+
+        build_iort_id_mapping(table_data, IORT_NODE_OFFSET);
     }
 
-    /* Root Complex Node */
-    node_size = sizeof(*rc) + sizeof(*idmap);
-    rc = acpi_data_push(table_data, node_size);
-
-    rc->type = ACPI_IORT_NODE_PCI_ROOT_COMPLEX;
-    rc->length = cpu_to_le16(node_size);
-    rc->mapping_count = cpu_to_le32(1);
-    rc->mapping_offset = cpu_to_le32(sizeof(*rc));
-
+    /* Table 16 Root Complex Node */
+    build_append_int_noprefix(table_data, 2 /* Root complex */, 1); /* Type */
+    node_size =  ROOT_COMPLEX_ENTRY_SIZE + ID_MAPPING_ENTRY_SIZE;
+    build_append_int_noprefix(table_data, node_size, 2); /* Length */
+    build_append_int_noprefix(table_data, 0, 1); /* Revision */
+    build_append_int_noprefix(table_data, 0, 4); /* Reserved */
+    build_append_int_noprefix(table_data, 1, 4); /* Number of ID mappings */
+    /* Reference to ID Array */
+    build_append_int_noprefix(table_data, ROOT_COMPLEX_ENTRY_SIZE, 4);
     /* fully coherent device */
-    rc->memory_properties.cache_coherency = cpu_to_le32(1);
-    rc->memory_properties.memory_flags = 0x3; /* CCA = CPM = DCAS = 1 */
-    rc->pci_segment_number = 0; /* MCFG pci_segment */
-
-    /* Identity RID mapping covering the whole input RID range */
-    idmap = &rc->id_mapping_array[0];
-    idmap->input_base = 0;
-    idmap->id_count = cpu_to_le32(0xFFFF);
-    idmap->output_base = 0;
-
+    build_append_int_noprefix(table_data,
+        1 | /* CCA: Cache Coherent Attribute, The device is fully coherent */
+        (3ULL << 7 * 8) /* MAF: Memory Access Flags, CCA = CPM = DCAS = 1 */,
+        8);
+    build_append_int_noprefix(table_data, 0, 4); /* ATS Attribute */
+    /* MCFG pci_segment */
+    build_append_int_noprefix(table_data, 0, 4); /* PCI Segment number */
+
+    /* Output Reference */
     if (vms->iommu == VIRT_IOMMU_SMMUV3) {
         /* output IORT node is the smmuv3 node */
-        idmap->output_reference = cpu_to_le32(smmu_offset);
+        build_iort_id_mapping(table_data, smmu_offset);
     } else {
         /* output IORT node is the ITS group node (the first node) */
-        idmap->output_reference = cpu_to_le32(iort_node_offset);
+        build_iort_id_mapping(table_data, IORT_NODE_OFFSET);
     }
 
     acpi_table_composed(linker, &table);
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 48/53] acpi: arm/virt: build_spcr: fix invalid cast
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (47 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 47/53] acpi: arm/virt: convert build_iort() to endian agnostic build_append_FOO() API Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 49/53] acpi: arm/virt: build_spcr: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
                   ` (5 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, shannon.zhaosl, qemu-arm, mst

implicit cast to structure uint8_t member didn't raise error when
assigning value from incorrect enum, but when using build_append_gas()
(next patch) it will error out with (clang):
  implicit conversion from enumeration type 'AmlRegionSpace'
  to different enumeration type 'AmlAddressSpace'
fix cast error by using correct AML_AS_SYSTEM_MEMORY enum

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: drjones@redhat.com
CC: peter.maydell@linaro.org
CC: shannon.zhaosl@gmail.com
CC: qemu-arm@nongnu.org
---
 hw/arm/virt-acpi-build.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index b88ea4b70a..a07540affb 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -361,7 +361,7 @@ build_spcr(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 
     spcr->interface_type = 0x3;    /* ARM PL011 UART */
 
-    spcr->base_address.space_id = AML_SYSTEM_MEMORY;
+    spcr->base_address.space_id = AML_AS_SYSTEM_MEMORY;
     spcr->base_address.bit_width = 8;
     spcr->base_address.bit_offset = 0;
     spcr->base_address.access_width = 1;
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 49/53] acpi: arm/virt: build_spcr: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (48 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 48/53] acpi: arm/virt: build_spcr: fix invalid cast Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 50/53] acpi: arm/virt: build_gtdt: " Igor Mammedov
                   ` (4 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, shannon.zhaosl, qemu-arm, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

while at it, replace packed structure with endian agnostic
build_append_FOO() API.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: drjones@redhat.com
CC: peter.maydell@linaro.org
CC: shannon.zhaosl@gmail.com
CC: qemu-arm@nongnu.org
---
 include/hw/acpi/acpi-defs.h | 32 -----------------
 hw/arm/virt-acpi-build.c    | 68 ++++++++++++++++++++++---------------
 2 files changed, 41 insertions(+), 59 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 6f2f08a9de..012c4ffb3a 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -117,38 +117,6 @@ typedef struct AcpiFadtData {
 #define ACPI_FADT_ARM_PSCI_COMPLIANT  (1 << 0)
 #define ACPI_FADT_ARM_PSCI_USE_HVC    (1 << 1)
 
-/*
- * Serial Port Console Redirection Table (SPCR), Rev. 1.02
- *
- * For .interface_type see Debug Port Table 2 (DBG2) serial port
- * subtypes in Table 3, Rev. May 22, 2012
- */
-struct AcpiSerialPortConsoleRedirection {
-    ACPI_TABLE_HEADER_DEF
-    uint8_t  interface_type;
-    uint8_t  reserved1[3];
-    struct AcpiGenericAddress base_address;
-    uint8_t  interrupt_types;
-    uint8_t  irq;
-    uint32_t gsi;
-    uint8_t  baud;
-    uint8_t  parity;
-    uint8_t  stopbits;
-    uint8_t  flowctrl;
-    uint8_t  term_type;
-    uint8_t  reserved2;
-    uint16_t pci_device_id;
-    uint16_t pci_vendor_id;
-    uint8_t  pci_bus;
-    uint8_t  pci_slot;
-    uint8_t  pci_func;
-    uint32_t pci_flags;
-    uint8_t  pci_seg;
-    uint32_t reserved3;
-} QEMU_PACKED;
-typedef struct AcpiSerialPortConsoleRedirection
-               AcpiSerialPortConsoleRedirection;
-
 /*
  * ACPI 1.0 Firmware ACPI Control Structure (FACS)
  */
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index a07540affb..e8553dcae5 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -349,39 +349,53 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
     acpi_table_composed(linker, &table);
 }
 
+/*
+ * Serial Port Console Redirection Table (SPCR)
+ * Rev: 1.07
+ */
 static void
 build_spcr(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
-    AcpiSerialPortConsoleRedirection *spcr;
-    const MemMapEntry *uart_memmap = &vms->memmap[VIRT_UART];
-    int irq = vms->irqmap[VIRT_UART] + ARM_SPI_BASE;
-    int spcr_start = table_data->len;
-
-    spcr = acpi_data_push(table_data, sizeof(*spcr));
-
-    spcr->interface_type = 0x3;    /* ARM PL011 UART */
-
-    spcr->base_address.space_id = AML_AS_SYSTEM_MEMORY;
-    spcr->base_address.bit_width = 8;
-    spcr->base_address.bit_offset = 0;
-    spcr->base_address.access_width = 1;
-    spcr->base_address.address = cpu_to_le64(uart_memmap->base);
-
-    spcr->interrupt_types = (1 << 3); /* Bit[3] ARMH GIC interrupt */
-    spcr->gsi = cpu_to_le32(irq);  /* Global System Interrupt */
+    AcpiTable table = { .sig = "SPCR", .rev = 2, .oem_id = vms->oem_id,
+                        .oem_table_id = vms->oem_table_id };
 
-    spcr->baud = 3;                /* Baud Rate: 3 = 9600 */
-    spcr->parity = 0;              /* No Parity */
-    spcr->stopbits = 1;            /* 1 Stop bit */
-    spcr->flowctrl = (1 << 1);     /* Bit[1] = RTS/CTS hardware flow control */
-    spcr->term_type = 0;           /* Terminal Type: 0 = VT100 */
+    acpi_init_table(&table, table_data);
 
-    spcr->pci_device_id = 0xffff;  /* PCI Device ID: not a PCI device */
-    spcr->pci_vendor_id = 0xffff;  /* PCI Vendor ID: not a PCI device */
+    /* Interface Type */
+    build_append_int_noprefix(table_data, 3, 1); /* ARM PL011 UART */
+    build_append_int_noprefix(table_data, 0, 3); /* Reserved */
+    /* Base Address */
+    build_append_gas(table_data, AML_AS_SYSTEM_MEMORY, 8, 0, 1,
+                     vms->memmap[VIRT_UART].base);
+    /* Interrupt Type */
+    build_append_int_noprefix(table_data,
+        (1 << 3) /* Bit[3] ARMH GIC interrupt */, 1);
+    build_append_int_noprefix(table_data, 0, 1); /* IRQ */
+    /* Global System Interrupt */
+    build_append_int_noprefix(table_data,
+                              vms->irqmap[VIRT_UART] + ARM_SPI_BASE, 4);
+    build_append_int_noprefix(table_data, 3 /* 9600 */, 1); /* Baud Rate */
+    build_append_int_noprefix(table_data, 0 /* No Parity */, 1); /* Parity */
+    /* Stop Bits */
+    build_append_int_noprefix(table_data, 1 /* 1 Stop bit */, 1);
+    /* Flow Control */
+    build_append_int_noprefix(table_data,
+        (1 << 1) /* RTS/CTS hardware flow control */, 1);
+    /* Terminal Type */
+    build_append_int_noprefix(table_data, 0 /* VT100 */, 1);
+    build_append_int_noprefix(table_data, 0, 1); /* Language */
+    /* PCI Device ID  */
+    build_append_int_noprefix(table_data, 0xffff /* not a PCI device*/, 2);
+    /* PCI Vendor ID */
+    build_append_int_noprefix(table_data, 0xffff /* not a PCI device*/, 2);
+    build_append_int_noprefix(table_data, 0, 1); /* PCI Bus Number */
+    build_append_int_noprefix(table_data, 0, 1); /* PCI Device Number */
+    build_append_int_noprefix(table_data, 0, 1); /* PCI Function Number */
+    build_append_int_noprefix(table_data, 0, 4); /* PCI Flags */
+    build_append_int_noprefix(table_data, 0, 1); /* PCI Segment */
+    build_append_int_noprefix(table_data, 0, 4); /* Reserved */
 
-    build_header(linker, table_data, (void *)(table_data->data + spcr_start),
-                 "SPCR", table_data->len - spcr_start, 2, vms->oem_id,
-                 vms->oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 /*
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 50/53] acpi: arm/virt: build_gtdt: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (49 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 49/53] acpi: arm/virt: build_spcr: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 51/53] acpi: build_facs: use build_append_int_noprefix() API to compose table Igor Mammedov
                   ` (3 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: peter.maydell, drjones, shannon.zhaosl, qemu-arm, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

while at it, replace packed structure with endian agnostic
build_append_FOO() API.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: drjones@redhat.com
CC: peter.maydell@linaro.org
CC: shannon.zhaosl@gmail.com
CC: qemu-arm@nongnu.org
---
 include/hw/acpi/acpi-defs.h | 25 -------------
 hw/arm/virt-acpi-build.c    | 75 ++++++++++++++++++++++++-------------
 2 files changed, 48 insertions(+), 52 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 012c4ffb3a..0b375e7589 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -131,29 +131,4 @@ struct AcpiFacsDescriptorRev1 {
 } QEMU_PACKED;
 typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
 
-/*
- * Generic Timer Description Table (GTDT)
- */
-#define ACPI_GTDT_INTERRUPT_MODE_LEVEL    (0 << 0)
-#define ACPI_GTDT_INTERRUPT_MODE_EDGE     (1 << 0)
-#define ACPI_GTDT_CAP_ALWAYS_ON           (1 << 2)
-
-struct AcpiGenericTimerTable {
-    ACPI_TABLE_HEADER_DEF
-    uint64_t counter_block_addresss;
-    uint32_t reserved;
-    uint32_t secure_el1_interrupt;
-    uint32_t secure_el1_flags;
-    uint32_t non_secure_el1_interrupt;
-    uint32_t non_secure_el1_flags;
-    uint32_t virtual_timer_interrupt;
-    uint32_t virtual_timer_flags;
-    uint32_t non_secure_el2_interrupt;
-    uint32_t non_secure_el2_flags;
-    uint64_t counter_read_block_address;
-    uint32_t platform_timer_count;
-    uint32_t platform_timer_offset;
-} QEMU_PACKED;
-typedef struct AcpiGenericTimerTable AcpiGenericTimerTable;
-
 #endif
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index e8553dcae5..8f28e82760 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -455,40 +455,61 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
     acpi_table_composed(linker, &table);
 }
 
-/* GTDT */
+/*
+ * ACPI spec, Revision 5.1
+ * 5.2.24 Generic Timer Description Table (GTDT)
+ */
 static void
 build_gtdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
 {
     VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
-    int gtdt_start = table_data->len;
-    AcpiGenericTimerTable *gtdt;
-    uint32_t irqflags;
-
-    if (vmc->claim_edge_triggered_timers) {
-        irqflags = ACPI_GTDT_INTERRUPT_MODE_EDGE;
-    } else {
-        irqflags = ACPI_GTDT_INTERRUPT_MODE_LEVEL;
-    }
-
-    gtdt = acpi_data_push(table_data, sizeof *gtdt);
-    /* The interrupt values are the same with the device tree when adding 16 */
-    gtdt->secure_el1_interrupt = cpu_to_le32(ARCH_TIMER_S_EL1_IRQ + 16);
-    gtdt->secure_el1_flags = cpu_to_le32(irqflags);
-
-    gtdt->non_secure_el1_interrupt = cpu_to_le32(ARCH_TIMER_NS_EL1_IRQ + 16);
-    gtdt->non_secure_el1_flags = cpu_to_le32(irqflags |
-                                             ACPI_GTDT_CAP_ALWAYS_ON);
+    /*
+     * Table 5-117 Flag Definitions
+     * set only "Timer interrupt Mode" and assume "Timer Interrupt
+     * polarity" bit as '0: Interrupt is Active high'
+     */
+    uint32_t irqflags = vmc->claim_edge_triggered_timers ?
+        1 : /* Interrupt is Edge triggered */
+        0;  /* Interrupt is Level triggered  */
+    AcpiTable table = { .sig = "GTDT", .rev = 2, .oem_id = vms->oem_id,
+                        .oem_table_id = vms->oem_table_id };
 
-    gtdt->virtual_timer_interrupt = cpu_to_le32(ARCH_TIMER_VIRT_IRQ + 16);
-    gtdt->virtual_timer_flags = cpu_to_le32(irqflags);
+    acpi_init_table(&table, table_data);
 
-    gtdt->non_secure_el2_interrupt = cpu_to_le32(ARCH_TIMER_NS_EL2_IRQ + 16);
-    gtdt->non_secure_el2_flags = cpu_to_le32(irqflags);
+    /* CntControlBase Physical Address */
+    /* FIXME: invalid value, should be 0xFFFFFFFFFFFFFFFF if not impl. ? */
+    build_append_int_noprefix(table_data, 0, 8);
+    build_append_int_noprefix(table_data, 0, 4); /* Reserved */
+    /*
+     * FIXME: clarify comment:
+     * The interrupt values are the same with the device tree when adding 16
+     */
+    /* Secure EL1 timer GSIV */
+    build_append_int_noprefix(table_data, ARCH_TIMER_S_EL1_IRQ + 16, 4);
+    /* Secure EL1 timer Flags */
+    build_append_int_noprefix(table_data, irqflags, 4);
+    /* Non-Secure EL1 timer GSIV */
+    build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL1_IRQ + 16, 4);
+    /* Non-Secure EL1 timer Flags */
+    build_append_int_noprefix(table_data, irqflags |
+                              1UL << 2, /* Always-on Capability */
+                              4);
+    /* Virtual timer GSIV */
+    build_append_int_noprefix(table_data, ARCH_TIMER_VIRT_IRQ + 16, 4);
+    /* Virtual Timer Flags */
+    build_append_int_noprefix(table_data, irqflags, 4);
+    /* Non-Secure EL2 timer GSIV */
+    build_append_int_noprefix(table_data, ARCH_TIMER_NS_EL2_IRQ + 16, 4);
+    /* Non-Secure EL2 timer Flags */
+    build_append_int_noprefix(table_data, irqflags, 4);
+    /* CntReadBase Physical address */
+    build_append_int_noprefix(table_data, 0, 8);
+    /* Platform Timer Count */
+    build_append_int_noprefix(table_data, 0, 4);
+    /* Platform Timer Offset */
+    build_append_int_noprefix(table_data, 0, 4);
 
-    build_header(linker, table_data,
-                 (void *)(table_data->data + gtdt_start), "GTDT",
-                 table_data->len - gtdt_start, 2, vms->oem_id,
-                 vms->oem_table_id);
+    acpi_table_composed(linker, &table);
 }
 
 /*
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 51/53] acpi: build_facs: use build_append_int_noprefix() API to compose table
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (50 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 50/53] acpi: arm/virt: build_gtdt: " Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 52/53] acpi: remove no longer used build_header() Igor Mammedov
                   ` (2 subsequent siblings)
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Drop usage of packed structures and explicit endian
conversions when building table and use endian agnostic
build_append_int_noprefix() API to build it.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
CC: marcel.apfelbaum@gmail.com
---
 include/hw/acpi/acpi-defs.h | 14 --------------
 include/hw/acpi/aml-build.h |  1 +
 hw/acpi/aml-build.c         |  2 +-
 hw/i386/acpi-build.c        | 18 ++++++++++++++----
 4 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 0b375e7589..1a0774edd6 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -117,18 +117,4 @@ typedef struct AcpiFadtData {
 #define ACPI_FADT_ARM_PSCI_COMPLIANT  (1 << 0)
 #define ACPI_FADT_ARM_PSCI_USE_HVC    (1 << 1)
 
-/*
- * ACPI 1.0 Firmware ACPI Control Structure (FACS)
- */
-struct AcpiFacsDescriptorRev1 {
-    uint32_t signature;           /* ACPI Signature */
-    uint32_t length;                 /* Length of structure, in bytes */
-    uint32_t hardware_signature;     /* Hardware configuration signature */
-    uint32_t firmware_waking_vector; /* ACPI OS waking vector */
-    uint32_t global_lock;            /* Global Lock */
-    uint32_t flags;
-    uint8_t  resverved3 [40];        /* Reserved - must be zero */
-} QEMU_PACKED;
-typedef struct AcpiFacsDescriptorRev1 AcpiFacsDescriptorRev1;
-
 #endif
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index dcb7ce11a8..de7d50a5a0 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -413,6 +413,7 @@ Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target);
 Aml *aml_object_type(Aml *object);
 
 void build_append_int_noprefix(GArray *table, uint64_t value, int size);
+void build_append_byte(GArray *array, uint8_t val);
 
 typedef struct AcpiTable {
     const char *sig;
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 813542b081..c86003c3e9 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -47,7 +47,7 @@ static void build_prepend_byte(GArray *array, uint8_t val)
     g_array_prepend_val(array, val);
 }
 
-static void build_append_byte(GArray *array, uint8_t val)
+void build_append_byte(GArray *array, uint8_t val)
 {
     g_array_append_val(array, val);
 }
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index ea6bfff5b7..90c88fdffc 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -346,13 +346,23 @@ static void acpi_align_size(GArray *blob, unsigned align)
     g_array_set_size(blob, ROUND_UP(acpi_data_len(blob), align));
 }
 
-/* FACS */
+/*
+ * ACPI spec 1.0b,
+ * 5.2.6 Firmware ACPI Control Structure
+ */
 static void
 build_facs(GArray *table_data)
 {
-    AcpiFacsDescriptorRev1 *facs = acpi_data_push(table_data, sizeof *facs);
-    memcpy(&facs->signature, "FACS", 4);
-    facs->length = cpu_to_le32(sizeof(*facs));
+    const char *sig = "FACS";
+    const uint8_t reserved[40] = {};
+
+    g_array_append_vals(table_data, sig, 4); /* Signature */
+    build_append_int_noprefix(table_data, 64, 4); /* Length */
+    build_append_int_noprefix(table_data, 0, 4); /* Hardware Signature */
+    build_append_int_noprefix(table_data, 0, 4); /* Firmware Waking Vector */
+    build_append_int_noprefix(table_data, 0, 4); /* Global Lock */
+    build_append_int_noprefix(table_data, 0, 4); /* Flags */
+    g_array_append_vals(table_data, reserved, 40); /* Reserved */
 }
 
 static void build_append_pcihp_notify_entry(Aml *method, int slot)
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 52/53] acpi: remove no longer used build_header()
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (51 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 51/53] acpi: build_facs: use build_append_int_noprefix() API to compose table Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-06-25  9:18 ` [PATCH 53/53] acpi: AcpiGenericAddress no longer used to map/access fields of MMIO, drop packed attribute Igor Mammedov
  2021-07-02 14:47 ` [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Michael S. Tsirkin
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/acpi/acpi-defs.h | 25 -------------------------
 include/hw/acpi/aml-build.h |  4 ----
 hw/acpi/aml-build.c         | 23 -----------------------
 3 files changed, 52 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 1a0774edd6..ee733840aa 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -48,31 +48,6 @@ typedef struct AcpiRsdpData {
     unsigned *xsdt_tbl_offset;
 } AcpiRsdpData;
 
-/* Table structure from Linux kernel (the ACPI tables are under the
-   BSD license) */
-
-
-#define ACPI_TABLE_HEADER_DEF   /* ACPI common table header */ \
-    uint32_t signature;          /* ACPI signature (4 ASCII characters) */ \
-    uint32_t length;                 /* Length of table, in bytes, including header */ \
-    uint8_t  revision;               /* ACPI Specification minor version # */ \
-    uint8_t  checksum;               /* To make sum of entire table == 0 */ \
-    uint8_t  oem_id[6] \
-                 QEMU_NONSTRING;     /* OEM identification */ \
-    uint8_t  oem_table_id[8] \
-                 QEMU_NONSTRING;     /* OEM table identification */ \
-    uint32_t oem_revision;           /* OEM revision number */ \
-    uint8_t  asl_compiler_id[4] \
-                 QEMU_NONSTRING;     /* ASL compiler vendor ID */ \
-    uint32_t asl_compiler_revision;  /* ASL compiler revision number */
-
-
-/* ACPI common table header */
-struct AcpiTableHeader {
-    ACPI_TABLE_HEADER_DEF
-} QEMU_PACKED;
-typedef struct AcpiTableHeader AcpiTableHeader;
-
 struct AcpiGenericAddress {
     uint8_t space_id;        /* Address space where struct or register exists */
     uint8_t bit_width;       /* Size in bits of given register */
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index de7d50a5a0..c53e4b2988 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -428,10 +428,6 @@ typedef struct AcpiTable {
 void acpi_init_table(AcpiTable *desc, GArray *array);
 void acpi_table_composed(BIOSLinker *linker, AcpiTable *table);
 
-void
-build_header(BIOSLinker *linker, GArray *table_data,
-             AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
-             const char *oem_id, const char *oem_table_id);
 void *acpi_data_push(GArray *table_data, unsigned size);
 unsigned acpi_data_len(GArray *table);
 void acpi_add_table(GArray *table_offsets, GArray *table_data);
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index c86003c3e9..643a2e61bd 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1745,29 +1745,6 @@ void acpi_table_composed(BIOSLinker *linker, AcpiTable *desc)
         desc->table_offset, table_len, desc->table_offset + checksum_offset);
 }
 
-void
-build_header(BIOSLinker *linker, GArray *table_data,
-             AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
-             const char *oem_id, const char *oem_table_id)
-{
-    unsigned tbl_offset = (char *)h - table_data->data;
-    unsigned checksum_offset = (char *)&h->checksum - table_data->data;
-    memcpy(&h->signature, sig, 4);
-    h->length = cpu_to_le32(len);
-    h->revision = rev;
-
-    strpadcpy((char *)h->oem_id, sizeof h->oem_id, oem_id, ' ');
-    strpadcpy((char *)h->oem_table_id, sizeof h->oem_table_id,
-              oem_table_id, ' ');
-
-    h->oem_revision = cpu_to_le32(1);
-    memcpy(h->asl_compiler_id, ACPI_BUILD_APPNAME8, 4);
-    h->asl_compiler_revision = cpu_to_le32(1);
-    /* Checksum to be filled in by Guest linker */
-    bios_linker_loader_add_checksum(linker, ACPI_BUILD_TABLE_FILE,
-        tbl_offset, len, checksum_offset);
-}
-
 void *acpi_data_push(GArray *table_data, unsigned size)
 {
     unsigned off = table_data->len;
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* [PATCH 53/53] acpi: AcpiGenericAddress no longer used to map/access fields of MMIO, drop packed attribute
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (52 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 52/53] acpi: remove no longer used build_header() Igor Mammedov
@ 2021-06-25  9:18 ` Igor Mammedov
  2021-07-02 14:47 ` [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Michael S. Tsirkin
  54 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-25  9:18 UTC (permalink / raw)
  To: qemu-devel; +Cc: mst

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
 include/hw/acpi/acpi-defs.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index ee733840aa..c97e8633ad 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -55,7 +55,7 @@ struct AcpiGenericAddress {
     uint8_t access_width;    /* ACPI 3.0: Minimum Access size (ACPI 3.0),
                                 ACPI 2.0: Reserved, Table 5-1 */
     uint64_t address;        /* 64-bit address of struct or register */
-} QEMU_PACKED;
+};
 
 typedef struct AcpiFadtData {
     struct AcpiGenericAddress pm1a_cnt;   /* PM1a_CNT_BLK */
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* Re: [PATCH 02/53] tests: qtest: add qtest_has_accel() to check if tested binary supports accelerator
  2021-06-25  9:17 ` [PATCH 02/53] tests: qtest: add qtest_has_accel() to check if tested binary supports accelerator Igor Mammedov
@ 2021-06-25  9:33   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 71+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-06-25  9:33 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: lvivier, thuth, mst

On 6/25/21 11:17 AM, Igor Mammedov wrote:
> Currently it is not possible to create tests that have KVM as a hard
> requirement on a host that doesn't support KVM for tested target
> binary (modulo going through the trouble of compiling out
> the offending test case).
> 
> Following scenario makes test fail when it's run on non x86 host:
>   qemu-system-x86_64 -enable-kvm -M q35,kernel-irqchip=on -smp 1,maxcpus=288
> 
> This patch introduces qtest_has_accel() to let users check if accel is
> available in advance and avoid executing non run-able test-cases.
> 
> It implements detection of TCG and KVM only, the rest could be
> added later on, when we actually start testing them in qtest.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> PS:
> There is an alternative 'runtime' approach on list:
> 'query-accels' series.
> https://patchwork.kernel.org/project/qemu-devel/patch/20210503211020.894589-4-philmd@redhat.com/
> 
> on upside this impl. much cheaper to execute than the 'query-accels'
> as it doesn't need to run QEMU for probing.
> 
> v4:
>   - s/qtest_has_kvm/qtest_has_accel/
>   - add TCG detection (based on --disable-tcg)
> v3:
>   - make it work with --disable-kvm
>        (Claudio Fontana <cfontana@suse.de>)
> v2:
>   - fix access() check.
>      s/access()/!access()/
>   - format C array items at meson.build time
> 
> CC: thuth@redhat.com
> CC: lvivier@redhat.com
> CC: f4bug@amsat.org
> ---
>  tests/qtest/libqos/libqtest.h |  8 ++++++++
>  meson.build                   |  6 ++++++
>  tests/qtest/libqtest.c        | 27 +++++++++++++++++++++++++++
>  3 files changed, 41 insertions(+)
> 
> diff --git a/tests/qtest/libqos/libqtest.h b/tests/qtest/libqos/libqtest.h
> index a68dcd79d4..59e9271195 100644
> --- a/tests/qtest/libqos/libqtest.h
> +++ b/tests/qtest/libqos/libqtest.h
> @@ -588,6 +588,14 @@ bool qtest_big_endian(QTestState *s);
>   */
>  const char *qtest_get_arch(void);
>  
> +/**
> + * qtest_has_accel:
> + * @accel_name: Accelerator name to check for.
> + *
> + * Returns: true if the accelerator is built in.
> + */
> +bool qtest_has_accel(const char *accel_name);
> +
>  /**
>   * qtest_add_func:
>   * @str: Test case path.
> diff --git a/meson.build b/meson.build
> index d8a92666fb..7eeb201179 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -76,6 +76,12 @@ else
>    kvm_targets = []
>  endif
>  
> +kvm_targets_c = ''
> +if not get_option('kvm').disabled() and targetos == 'linux'
> +  kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
> +endif
> +config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
> +
>  accelerator_targets = { 'CONFIG_KVM': kvm_targets }
>  if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
>    # i368 emulator provides xenpv machine type for multiple architectures
> diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
> index 825b13a44c..643769e416 100644
> --- a/tests/qtest/libqtest.c
> +++ b/tests/qtest/libqtest.c
> @@ -920,6 +920,33 @@ const char *qtest_get_arch(void)
>      return end + 1;
>  }
>  
> +bool qtest_has_accel(const char *accel_name)
> +{
> +    if (g_str_equal(accel_name, "tcg")) {
> +#if defined(CONFIG_TCG)

The point of the "alternative 'runtime' approach" was to remove
access to accel-specific definitions in tests/ and you are
adding yet another one :( Maybe now it is acceptable, I am not
sure since I haven't followed the latest accelerator modularization
effort series. So I'll defer that to the active developers doing
it.

> +        return true;
> +#else
> +        return false;
> +#endif
> +    } else if (g_str_equal(accel_name, "kvm")) {
> +        int i;
> +        const char *arch = qtest_get_arch();
> +        const char *targets[] = { CONFIG_KVM_TARGETS };
> +
> +        for (i = 0; i < ARRAY_SIZE(targets); i++) {
> +            if (!strncmp(targets[i], arch, strlen(arch))) {
> +                if (!access("/dev/kvm", R_OK | W_OK)) {
> +                    return true;
> +                }
> +            }
> +        }
> +    } else {
> +        /* not implemented */
> +        g_assert_not_reached();
> +    }
> +    return false;
> +}
> +
>  bool qtest_get_irq(QTestState *s, int num)
>  {
>      /* dummy operation in order to make sure irq is up to date */
> 



^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 24/53] acpi: build_tpm2: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 ` [PATCH 24/53] acpi: build_tpm2: " Igor Mammedov
@ 2021-06-29 14:56   ` Stefan Berger
  0 siblings, 0 replies; 71+ messages in thread
From: Stefan Berger @ 2021-06-29 14:56 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: mst, stefanb


On 6/25/21 5:17 AM, Igor Mammedov wrote:
> it replaces error-prone pointer arithmetic for build_header() API,
> with 2 calls to start and finish table creation,
> which hides offsets magic from API user.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

I applied patch 19 of this series along with this one and this one works 
(TPM 1.2 not so much with TCPA modifications):

Tested-by: Stefan Berger <stefanb@linux.ibm.com>


> ---
> CC: stefanb@linux.vnet.ibm.com
> ---
>   hw/acpi/aml-build.c | 11 +++++------
>   1 file changed, 5 insertions(+), 6 deletions(-)
>
> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> index 3da32301b6..159f998187 100644
> --- a/hw/acpi/aml-build.c
> +++ b/hw/acpi/aml-build.c
> @@ -2098,13 +2098,14 @@ void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
>                   const char *oem_id, const char *oem_table_id)
>   {
>       uint8_t start_method_params[12] = {};
> -    unsigned log_addr_offset, tpm2_start;
> +    unsigned log_addr_offset;
>       uint64_t control_area_start_address;
>       TPMIf *tpmif = tpm_find();
>       uint32_t start_method;
> +    AcpiTable table = { .sig = "TPM2", .rev = 4,
> +                        .oem_id = oem_id, .oem_table_id = oem_table_id };
>
> -    tpm2_start = table_data->len;
> -    acpi_data_push(table_data, sizeof(AcpiTableHeader));
> +    acpi_init_table(&table, table_data);
>
>       /* Platform Class */
>       build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2);
> @@ -2142,9 +2143,7 @@ void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
>       bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
>                                      log_addr_offset, 8,
>                                      ACPI_BUILD_TPMLOG_FILE, 0);
> -    build_header(linker, table_data,
> -                 (void *)(table_data->data + tpm2_start),
> -                 "TPM2", table_data->len - tpm2_start, 4, oem_id, oem_table_id);
> +    acpi_table_composed(linker, &table);
>   }
>   #endif
>


^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 33/53] acpi: build_tpm_tcpa: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 ` [PATCH 33/53] acpi: build_tpm_tcpa: " Igor Mammedov
@ 2021-06-29 15:19   ` Stefan Berger
  2021-06-30  7:22     ` Igor Mammedov
  2021-06-30  7:25   ` [PATCH v2 " Igor Mammedov
  1 sibling, 1 reply; 71+ messages in thread
From: Stefan Berger @ 2021-06-29 15:19 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: stefanb, mst

On 6/25/21 5:17 AM, Igor Mammedov wrote:

> it replaces error-prone pointer arithmetic for build_header() API,
> with 2 calls to start and finish table creation,
> which hides offsets magic from API user.
>
> While at it switch to build_append_int_noprefix() to build
> table entries (which also removes some manual offset
> calculations).
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>


Patch 19, 24 and this one applied causes this error here when using a 
TPM 1.2:

qemu-system-x86_64: ../hw/acpi/bios-linker-loader.c:286: 
bios_linker_loader_add_pointer: Assertion `source_file' failed.


    Stefan


> ---
> CC: marcel.apfelbaum@gmail.com
> CC: stefanb@linux.vnet.ibm.com
> ---
>   include/hw/acpi/acpi-defs.h | 14 -------------
>   hw/i386/acpi-build.c        | 39 +++++++++++++++++++++----------------
>   2 files changed, 22 insertions(+), 31 deletions(-)
>
> diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
> index 4d8f8b34b0..3b42b138f0 100644
> --- a/include/hw/acpi/acpi-defs.h
> +++ b/include/hw/acpi/acpi-defs.h
> @@ -418,20 +418,6 @@ struct AcpiSratProcessorGiccAffinity {
>
>   typedef struct AcpiSratProcessorGiccAffinity AcpiSratProcessorGiccAffinity;
>
> -/*
> - * TCPA Description Table
> - *
> - * Following Level 00, Rev 00.37 of specs:
> - * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification
> - */
> -struct Acpi20Tcpa {
> -    ACPI_TABLE_HEADER_DEF                    /* ACPI common table header */
> -    uint16_t platform_class;
> -    uint32_t log_area_minimum_length;
> -    uint64_t log_area_start_address;
> -} QEMU_PACKED;
> -typedef struct Acpi20Tcpa Acpi20Tcpa;
> -
>   /* DMAR - DMA Remapping table r2.2 */
>   struct AcpiTableDmar {
>       ACPI_TABLE_HEADER_DEF
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index 96ad3e1b9d..bc45a666f6 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -1849,31 +1849,36 @@ build_hpet(GArray *table_data, BIOSLinker *linker, const char *oem_id,
>   }
>
>   #ifdef CONFIG_TPM
> +/*
> + * TCPA Description Table
> + *
> + * Following Level 00, Rev 00.37 of specs:
> + * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification
> + * 7.1.2 ACPI Table Layout
> + */
>   static void
>   build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
>                  const char *oem_id, const char *oem_table_id)
>   {
> -    int tcpa_start = table_data->len;
> -    Acpi20Tcpa *tcpa = acpi_data_push(table_data, sizeof *tcpa);
> -    unsigned log_addr_size = sizeof(tcpa->log_area_start_address);
> -    unsigned log_addr_offset =
> -        (char *)&tcpa->log_area_start_address - table_data->data;
> +    AcpiTable table = { .sig = "TCPA", .rev = 2,
> +                        .oem_id = oem_id, .oem_table_id = oem_table_id };
>
> -    tcpa->platform_class = cpu_to_le16(TPM_TCPA_ACPI_CLASS_CLIENT);
> -    tcpa->log_area_minimum_length = cpu_to_le32(TPM_LOG_AREA_MINIMUM_SIZE);
> -    acpi_data_push(tcpalog, le32_to_cpu(tcpa->log_area_minimum_length));
> +    acpi_init_table(&table, table_data);
> +    /* Platform Class */
> +    build_append_int_noprefix(table_data, TPM_TCPA_ACPI_CLASS_CLIENT, 2);
> +    /* Log Area Minimum Length (LAML) */
> +    build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4);
> +    /* Log Area Start Address (LASA) */
> +    /* log area start address to be filled by Guest linker */
> +    bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
> +        table_data->len, 8, ACPI_BUILD_TPMLOG_FILE, 0);
> +    build_append_int_noprefix(table_data, 0, 8);
> +    acpi_table_composed(linker, &table);
>
> +    /* allocate/reserve space for TPM log area */
> +    acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE);
>       bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1,
>                                false /* high memory */);
> -
> -    /* log area start address to be filled by Guest linker */
> -    bios_linker_loader_add_pointer(linker,
> -        ACPI_BUILD_TABLE_FILE, log_addr_offset, log_addr_size,
> -        ACPI_BUILD_TPMLOG_FILE, 0);
> -
> -    build_header(linker, table_data,
> -                 (void *)(table_data->data + tcpa_start),
> -                 "TCPA", sizeof(*tcpa), 2, oem_id, oem_table_id);
>   }
>   #endif
>


^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 19/53] acpi: add helper routines to initialize ACPI tables
  2021-06-25  9:17 ` [PATCH 19/53] acpi: add helper routines to initialize ACPI tables Igor Mammedov
@ 2021-06-29 19:16   ` Michael S. Tsirkin
  2021-06-30  6:32     ` Igor Mammedov
  0 siblings, 1 reply; 71+ messages in thread
From: Michael S. Tsirkin @ 2021-06-29 19:16 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-devel

On Fri, Jun 25, 2021 at 05:17:44AM -0400, Igor Mammedov wrote:
>    acpi_init_table():
>       initializes table header and keeps track of
>       table data/offsets
>    acpi_table_composed():
>       sets actual table length and tells bios loader
>       where it's for later initialization on guest side.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  include/hw/acpi/aml-build.h | 14 ++++++++++
>  hw/acpi/aml-build.c         | 53 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 67 insertions(+)
> 
> diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
> index 471266d739..d590660bd2 100644
> --- a/include/hw/acpi/aml-build.h
> +++ b/include/hw/acpi/aml-build.h
> @@ -413,6 +413,20 @@ Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target);
>  Aml *aml_object_type(Aml *object);
>  
>  void build_append_int_noprefix(GArray *table, uint64_t value, int size);
> +
> +typedef struct AcpiTable {
> +    const char *sig;
> +    const uint8_t rev;
> +    const char *oem_id;
> +    const char *oem_table_id;
> +    /* private vars tracking table state */
> +    GArray *array;
> +    unsigned table_offset;
> +} AcpiTable;
> +
> +void acpi_init_table(AcpiTable *desc, GArray *array);
> +void acpi_table_composed(BIOSLinker *linker, AcpiTable *table);
> +
>  void
>  build_header(BIOSLinker *linker, GArray *table_data,
>               AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> index d5103e6d7b..576fc0238c 100644
> --- a/hw/acpi/aml-build.c
> +++ b/hw/acpi/aml-build.c
> @@ -52,6 +52,19 @@ static void build_append_byte(GArray *array, uint8_t val)
>      g_array_append_val(array, val);
>  }
>  
> +static void build_append_padded_str(GArray *array, const char *str,
> +                                    size_t maxlen, char pad)
> +{
> +    size_t i;
> +    size_t len = strlen(str);
> +
> +    g_assert(len <= maxlen);
> +    g_array_append_vals(array, str, len);
> +    for (i = maxlen - len; i > 0; i--) {
> +        g_array_append_val(array, pad);
> +    }
> +}
> +
>  static void build_append_array(GArray *array, GArray *val)
>  {
>      g_array_append_vals(array, val->data, val->len);
> @@ -1692,6 +1705,46 @@ Aml *aml_object_type(Aml *object)
>      return var;
>  }
>  
> +void acpi_init_table(AcpiTable *desc, GArray *array)
> +{
> +
> +    desc->array = array;
> +    desc->table_offset = array->len;
> +
> +    /*
> +     * ACPI spec 1.0b
> +     * 5.2.3 System Description Table Header
> +     */
> +    g_assert(strlen(desc->sig) == 4);
> +    g_array_append_vals(array, desc->sig, 4); /* Signature */
> +    build_append_int_noprefix(array, 0, 4); /* Length */
> +    build_append_int_noprefix(array, desc->rev, 1); /* Revision */
> +    build_append_int_noprefix(array, 0, 1); /* Checksum */
> +    build_append_padded_str(array, desc->oem_id, 6, ' '); /* OEMID */
> +    /* OEM Table ID */
> +    build_append_padded_str(array, desc->oem_table_id, 8, ' ');
> +    build_append_int_noprefix(array, 1, 4); /* OEM Revision */
> +    g_array_append_vals(array, ACPI_BUILD_APPNAME8, 4); /* Creator ID */
> +    build_append_int_noprefix(array, 1, 4); /* Creator Revision */
> +}
> +
> +void acpi_table_composed(BIOSLinker *linker, AcpiTable *desc)
> +{
> +    /*
> +     * ACPI spec 1.0b
> +     * 5.2.3 System Description Table Header
> +     * Table 5-2 DESCRIPTION_HEADER Fields
> +     */
> +    const unsigned checksum_offset = 9;
> +    uint32_t table_len = desc->array->len - desc->table_offset;
> +    uint32_t table_len_le = cpu_to_le32(table_len);
> +    gchar *len_ptr = &desc->array->data[desc->table_offset + 4];
> +
> +    memcpy(len_ptr, &table_len_le, sizeof table_len_le);

ok so this patches in the correct length.
Not sure how to make it prettier ... at least please
add comments explaining what's going on here.

> +    bios_linker_loader_add_checksum(linker, ACPI_BUILD_TABLE_FILE,
> +        desc->table_offset, table_len, desc->table_offset + checksum_offset);
> +}
> +
>  void
>  build_header(BIOSLinker *linker, GArray *table_data,
>               AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
> -- 
> 2.27.0



^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 19/53] acpi: add helper routines to initialize ACPI tables
  2021-06-29 19:16   ` Michael S. Tsirkin
@ 2021-06-30  6:32     ` Igor Mammedov
  0 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-30  6:32 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: qemu-devel

On Tue, 29 Jun 2021 15:16:42 -0400
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> On Fri, Jun 25, 2021 at 05:17:44AM -0400, Igor Mammedov wrote:
> >    acpi_init_table():
> >       initializes table header and keeps track of
> >       table data/offsets
> >    acpi_table_composed():
> >       sets actual table length and tells bios loader
> >       where it's for later initialization on guest side.

Patch introduces acpi_init_table()/acpi_table_composed() API
that hides pointer/offset arithmetic from user as opposed
to build_header(), to prevent errors caused by it [1].

 acpi_init_table():
     initializes table header and keeps track of
     table data/offsets
 acpi_table_composed():
     sets actual table length and tells bios loader
     where table is for the later initialization on
     guest side.

1) commits
   bb9feea43179 x86: acpi: use offset instead of pointer when using build_header()
   4d027afeb3a9 Virt: ACPI: fix qemu assert due to re-assigned table data address

> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > ---
> >  include/hw/acpi/aml-build.h | 14 ++++++++++
> >  hw/acpi/aml-build.c         | 53 +++++++++++++++++++++++++++++++++++++
> >  2 files changed, 67 insertions(+)
> > 
> > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
> > index 471266d739..d590660bd2 100644
> > --- a/include/hw/acpi/aml-build.h
> > +++ b/include/hw/acpi/aml-build.h
> > @@ -413,6 +413,20 @@ Aml *aml_concatenate(Aml *source1, Aml *source2, Aml *target);
> >  Aml *aml_object_type(Aml *object);
> >  
> >  void build_append_int_noprefix(GArray *table, uint64_t value, int size);
> > +
> > +typedef struct AcpiTable {
> > +    const char *sig;
> > +    const uint8_t rev;
> > +    const char *oem_id;
> > +    const char *oem_table_id;
> > +    /* private vars tracking table state */
> > +    GArray *array;
> > +    unsigned table_offset;
> > +} AcpiTable;
> > +
> > +void acpi_init_table(AcpiTable *desc, GArray *array);
> > +void acpi_table_composed(BIOSLinker *linker, AcpiTable *table);
> > +
> >  void
> >  build_header(BIOSLinker *linker, GArray *table_data,
> >               AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
> > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> > index d5103e6d7b..576fc0238c 100644
> > --- a/hw/acpi/aml-build.c
> > +++ b/hw/acpi/aml-build.c
> > @@ -52,6 +52,19 @@ static void build_append_byte(GArray *array, uint8_t val)
> >      g_array_append_val(array, val);
> >  }
> >  
> > +static void build_append_padded_str(GArray *array, const char *str,
> > +                                    size_t maxlen, char pad)
> > +{
> > +    size_t i;
> > +    size_t len = strlen(str);
> > +
> > +    g_assert(len <= maxlen);
> > +    g_array_append_vals(array, str, len);
> > +    for (i = maxlen - len; i > 0; i--) {
> > +        g_array_append_val(array, pad);
> > +    }
> > +}
> > +
> >  static void build_append_array(GArray *array, GArray *val)
> >  {
> >      g_array_append_vals(array, val->data, val->len);
> > @@ -1692,6 +1705,46 @@ Aml *aml_object_type(Aml *object)
> >      return var;
> >  }
> >  
> > +void acpi_init_table(AcpiTable *desc, GArray *array)
> > +{
> > +
> > +    desc->array = array;
> > +    desc->table_offset = array->len;
> > +
> > +    /*
> > +     * ACPI spec 1.0b
> > +     * 5.2.3 System Description Table Header
> > +     */
> > +    g_assert(strlen(desc->sig) == 4);
> > +    g_array_append_vals(array, desc->sig, 4); /* Signature */
> > +    build_append_int_noprefix(array, 0, 4); /* Length */
> > +    build_append_int_noprefix(array, desc->rev, 1); /* Revision */
> > +    build_append_int_noprefix(array, 0, 1); /* Checksum */
> > +    build_append_padded_str(array, desc->oem_id, 6, ' '); /* OEMID */
> > +    /* OEM Table ID */
> > +    build_append_padded_str(array, desc->oem_table_id, 8, ' ');
> > +    build_append_int_noprefix(array, 1, 4); /* OEM Revision */
> > +    g_array_append_vals(array, ACPI_BUILD_APPNAME8, 4); /* Creator ID */
> > +    build_append_int_noprefix(array, 1, 4); /* Creator Revision */
> > +}
> > +
> > +void acpi_table_composed(BIOSLinker *linker, AcpiTable *desc)
> > +{
> > +    /*
> > +     * ACPI spec 1.0b
> > +     * 5.2.3 System Description Table Header
> > +     * Table 5-2 DESCRIPTION_HEADER Fields
> > +     */
> > +    const unsigned checksum_offset = 9;
> > +    uint32_t table_len = desc->array->len - desc->table_offset;
> > +    uint32_t table_len_le = cpu_to_le32(table_len);
> > +    gchar *len_ptr = &desc->array->data[desc->table_offset + 4];
> > +
> > +    memcpy(len_ptr, &table_len_le, sizeof table_len_le);  
> 
> ok so this patches in the correct length.
> Not sure how to make it prettier ... at least please
> add comments explaining what's going on here.
it's not prettier, combo of acpi_init_table()/acpi_table_composed()
intention is to hide offsets manipulation from callers
in the most usecases. (that's where we used to have bugs).
I have this explained in cover letter, but I lost it when
writing down this commit message (see updated commit message above)

how about:
 /* patch table length reserved by acpi_init_table()
  * to the actual length, i.e. accumulated table length from
  * acpi_init_table() till acpi_table_composed()
  */
> 
> > +    bios_linker_loader_add_checksum(linker, ACPI_BUILD_TABLE_FILE,
> > +        desc->table_offset, table_len, desc->table_offset + checksum_offset);
> > +}
> > +
> >  void
> >  build_header(BIOSLinker *linker, GArray *table_data,
> >               AcpiTableHeader *h, const char *sig, int len, uint8_t rev,
> > -- 
> > 2.27.0  
> 



^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 33/53] acpi: build_tpm_tcpa: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-29 15:19   ` Stefan Berger
@ 2021-06-30  7:22     ` Igor Mammedov
  0 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-06-30  7:22 UTC (permalink / raw)
  To: Stefan Berger; +Cc: stefanb, qemu-devel, mst

On Tue, 29 Jun 2021 11:19:17 -0400
Stefan Berger <stefanb@linux.ibm.com> wrote:

> On 6/25/21 5:17 AM, Igor Mammedov wrote:
> 
> > it replaces error-prone pointer arithmetic for build_header() API,
> > with 2 calls to start and finish table creation,
> > which hides offsets magic from API user.
> >
> > While at it switch to build_append_int_noprefix() to build
> > table entries (which also removes some manual offset
> > calculations).
> >
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>  
> 
> 
> Patch 19, 24 and this one applied causes this error here when using a 
> TPM 1.2:
> 
> qemu-system-x86_64: ../hw/acpi/bios-linker-loader.c:286: 
> bios_linker_loader_add_pointer: Assertion `source_file' failed.

I missed this one since it's not covered by qtest,
it seems that test_acpi_tcg_tpm() tests only TPM2.0,
can you look into adding a test-case for TPM1.2
so it won't get missed/broken in the future?

I'll post fixed patch shortly as a reply this this thread.

> 
> 
>     Stefan
> 
> 
> > ---
> > CC: marcel.apfelbaum@gmail.com
> > CC: stefanb@linux.vnet.ibm.com
> > ---
> >   include/hw/acpi/acpi-defs.h | 14 -------------
> >   hw/i386/acpi-build.c        | 39 +++++++++++++++++++++----------------
> >   2 files changed, 22 insertions(+), 31 deletions(-)
> >
> > diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
> > index 4d8f8b34b0..3b42b138f0 100644
> > --- a/include/hw/acpi/acpi-defs.h
> > +++ b/include/hw/acpi/acpi-defs.h
> > @@ -418,20 +418,6 @@ struct AcpiSratProcessorGiccAffinity {
> >
> >   typedef struct AcpiSratProcessorGiccAffinity AcpiSratProcessorGiccAffinity;
> >
> > -/*
> > - * TCPA Description Table
> > - *
> > - * Following Level 00, Rev 00.37 of specs:
> > - * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification
> > - */
> > -struct Acpi20Tcpa {
> > -    ACPI_TABLE_HEADER_DEF                    /* ACPI common table header */
> > -    uint16_t platform_class;
> > -    uint32_t log_area_minimum_length;
> > -    uint64_t log_area_start_address;
> > -} QEMU_PACKED;
> > -typedef struct Acpi20Tcpa Acpi20Tcpa;
> > -
> >   /* DMAR - DMA Remapping table r2.2 */
> >   struct AcpiTableDmar {
> >       ACPI_TABLE_HEADER_DEF
> > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> > index 96ad3e1b9d..bc45a666f6 100644
> > --- a/hw/i386/acpi-build.c
> > +++ b/hw/i386/acpi-build.c
> > @@ -1849,31 +1849,36 @@ build_hpet(GArray *table_data, BIOSLinker *linker, const char *oem_id,
> >   }
> >
> >   #ifdef CONFIG_TPM
> > +/*
> > + * TCPA Description Table
> > + *
> > + * Following Level 00, Rev 00.37 of specs:
> > + * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification
> > + * 7.1.2 ACPI Table Layout
> > + */
> >   static void
> >   build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
> >                  const char *oem_id, const char *oem_table_id)
> >   {
> > -    int tcpa_start = table_data->len;
> > -    Acpi20Tcpa *tcpa = acpi_data_push(table_data, sizeof *tcpa);
> > -    unsigned log_addr_size = sizeof(tcpa->log_area_start_address);
> > -    unsigned log_addr_offset =
> > -        (char *)&tcpa->log_area_start_address - table_data->data;
> > +    AcpiTable table = { .sig = "TCPA", .rev = 2,
> > +                        .oem_id = oem_id, .oem_table_id = oem_table_id };
> >
> > -    tcpa->platform_class = cpu_to_le16(TPM_TCPA_ACPI_CLASS_CLIENT);
> > -    tcpa->log_area_minimum_length = cpu_to_le32(TPM_LOG_AREA_MINIMUM_SIZE);
> > -    acpi_data_push(tcpalog, le32_to_cpu(tcpa->log_area_minimum_length));
> > +    acpi_init_table(&table, table_data);
> > +    /* Platform Class */
> > +    build_append_int_noprefix(table_data, TPM_TCPA_ACPI_CLASS_CLIENT, 2);
> > +    /* Log Area Minimum Length (LAML) */
> > +    build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4);
> > +    /* Log Area Start Address (LASA) */
> > +    /* log area start address to be filled by Guest linker */
> > +    bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
> > +        table_data->len, 8, ACPI_BUILD_TPMLOG_FILE, 0);
> > +    build_append_int_noprefix(table_data, 0, 8);
> > +    acpi_table_composed(linker, &table);
> >
> > +    /* allocate/reserve space for TPM log area */
> > +    acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE);
> >       bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1,
> >                                false /* high memory */);
> > -
> > -    /* log area start address to be filled by Guest linker */
> > -    bios_linker_loader_add_pointer(linker,
> > -        ACPI_BUILD_TABLE_FILE, log_addr_offset, log_addr_size,
> > -        ACPI_BUILD_TPMLOG_FILE, 0);
> > -
> > -    build_header(linker, table_data,
> > -                 (void *)(table_data->data + tcpa_start),
> > -                 "TCPA", sizeof(*tcpa), 2, oem_id, oem_table_id);
> >   }
> >   #endif
> >  
> 



^ permalink raw reply	[flat|nested] 71+ messages in thread

* [PATCH v2 33/53] acpi: build_tpm_tcpa: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 ` [PATCH 33/53] acpi: build_tpm_tcpa: " Igor Mammedov
  2021-06-29 15:19   ` Stefan Berger
@ 2021-06-30  7:25   ` Igor Mammedov
  2021-06-30 12:21     ` Stefan Berger
  1 sibling, 1 reply; 71+ messages in thread
From: Igor Mammedov @ 2021-06-30  7:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: stefanb, mst

it replaces error-prone pointer arithmetic for build_header() API,
with 2 calls to start and finish table creation,
which hides offsets magic from API user.

While at it switch to build_append_int_noprefix() to build
table entries (which also removes some manual offset
calculations).

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
  * fix assert when starting QEMU with TPM 1.2
      Stefan Berger <stefanb@linux.ibm.com>

CC: marcel.apfelbaum@gmail.com
CC: stefanb@linux.vnet.ibm.com
---
 include/hw/acpi/acpi-defs.h | 14 -------------
 hw/i386/acpi-build.c        | 40 ++++++++++++++++++++++---------------
 2 files changed, 24 insertions(+), 30 deletions(-)

diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 4d8f8b34b0..3b42b138f0 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -418,20 +418,6 @@ struct AcpiSratProcessorGiccAffinity {
 
 typedef struct AcpiSratProcessorGiccAffinity AcpiSratProcessorGiccAffinity;
 
-/*
- * TCPA Description Table
- *
- * Following Level 00, Rev 00.37 of specs:
- * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification
- */
-struct Acpi20Tcpa {
-    ACPI_TABLE_HEADER_DEF                    /* ACPI common table header */
-    uint16_t platform_class;
-    uint32_t log_area_minimum_length;
-    uint64_t log_area_start_address;
-} QEMU_PACKED;
-typedef struct Acpi20Tcpa Acpi20Tcpa;
-
 /* DMAR - DMA Remapping table r2.2 */
 struct AcpiTableDmar {
     ACPI_TABLE_HEADER_DEF
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 96ad3e1b9d..5457e35798 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1849,31 +1849,39 @@ build_hpet(GArray *table_data, BIOSLinker *linker, const char *oem_id,
 }
 
 #ifdef CONFIG_TPM
+/*
+ * TCPA Description Table
+ *
+ * Following Level 00, Rev 00.37 of specs:
+ * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification
+ * 7.1.2 ACPI Table Layout
+ */
 static void
 build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog,
                const char *oem_id, const char *oem_table_id)
 {
-    int tcpa_start = table_data->len;
-    Acpi20Tcpa *tcpa = acpi_data_push(table_data, sizeof *tcpa);
-    unsigned log_addr_size = sizeof(tcpa->log_area_start_address);
-    unsigned log_addr_offset =
-        (char *)&tcpa->log_area_start_address - table_data->data;
+    unsigned log_addr_offset;
+    AcpiTable table = { .sig = "TCPA", .rev = 2,
+                        .oem_id = oem_id, .oem_table_id = oem_table_id };
 
-    tcpa->platform_class = cpu_to_le16(TPM_TCPA_ACPI_CLASS_CLIENT);
-    tcpa->log_area_minimum_length = cpu_to_le32(TPM_LOG_AREA_MINIMUM_SIZE);
-    acpi_data_push(tcpalog, le32_to_cpu(tcpa->log_area_minimum_length));
+    acpi_init_table(&table, table_data);
+    /* Platform Class */
+    build_append_int_noprefix(table_data, TPM_TCPA_ACPI_CLASS_CLIENT, 2);
+    /* Log Area Minimum Length (LAML) */
+    build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4);
+    /* Log Area Start Address (LASA) */
+    log_addr_offset = table_data->len;
+    build_append_int_noprefix(table_data, 0, 8);
 
+    acpi_table_composed(linker, &table);
+
+    /* allocate/reserve space for TPM log area */
+    acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE);
     bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1,
                              false /* high memory */);
-
     /* log area start address to be filled by Guest linker */
-    bios_linker_loader_add_pointer(linker,
-        ACPI_BUILD_TABLE_FILE, log_addr_offset, log_addr_size,
-        ACPI_BUILD_TPMLOG_FILE, 0);
-
-    build_header(linker, table_data,
-                 (void *)(table_data->data + tcpa_start),
-                 "TCPA", sizeof(*tcpa), 2, oem_id, oem_table_id);
+    bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
+        log_addr_offset, 8, ACPI_BUILD_TPMLOG_FILE, 0);
 }
 #endif
 
-- 
2.27.0



^ permalink raw reply related	[flat|nested] 71+ messages in thread

* Re: [PATCH v2 33/53] acpi: build_tpm_tcpa: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-30  7:25   ` [PATCH v2 " Igor Mammedov
@ 2021-06-30 12:21     ` Stefan Berger
  0 siblings, 0 replies; 71+ messages in thread
From: Stefan Berger @ 2021-06-30 12:21 UTC (permalink / raw)
  To: Igor Mammedov, qemu-devel; +Cc: stefanb, mst


On 6/30/21 3:25 AM, Igor Mammedov wrote:
> it replaces error-prone pointer arithmetic for build_header() API,
> with 2 calls to start and finish table creation,
> which hides offsets magic from API user.
>
> While at it switch to build_append_int_noprefix() to build
> table entries (which also removes some manual offset
> calculations).
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Tested-by: Stefan Berger <stefanb@linux.ibm.com>




^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 25/53] acpi: acpi_build_hest: use acpi_init_table()/acpi_table_composed() instead of build_header()
  2021-06-25  9:17 ` [PATCH 25/53] acpi: acpi_build_hest: " Igor Mammedov
@ 2021-07-02 12:21   ` Dongjiu Geng
  0 siblings, 0 replies; 71+ messages in thread
From: Dongjiu Geng @ 2021-07-02 12:21 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: drjones, qemu-arm, QEMU Developers, Michael S. Tsirkin

Igor Mammedov <imammedo@redhat.com> 于2021年6月25日周五 下午5:19写道:
>
> it replaces error-prone pointer arithmetic for build_header() API,
> with 2 calls to start and finish table creation,
> which hides offsets magic from API user.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> CC: qemu-arm@nongnu.org
> CC: drjones@redhat.com
> CC: gengdongjiu1@gmail.com
> ---
>  hw/acpi/ghes.c | 10 ++++------
>  1 file changed, 4 insertions(+), 6 deletions(-)
>
> diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c
> index a4dac6bf15..ae577c08e4 100644
> --- a/hw/acpi/ghes.c
> +++ b/hw/acpi/ghes.c
> @@ -362,18 +362,16 @@ static void build_ghes_v2(GArray *table_data, int source_id, BIOSLinker *linker)
>  void acpi_build_hest(GArray *table_data, BIOSLinker *linker,
>                       const char *oem_id, const char *oem_table_id)
>  {
> -    uint64_t hest_start = table_data->len;
> +    AcpiTable table = { .sig = "HEST", .rev = 1,
> +                        .oem_id = oem_id, .oem_table_id = oem_table_id };
>
> -    /* Hardware Error Source Table header*/
> -    acpi_data_push(table_data, sizeof(AcpiTableHeader));
> +    acpi_init_table(&table, table_data);
>
>      /* Error Source Count */
>      build_append_int_noprefix(table_data, ACPI_GHES_ERROR_SOURCE_COUNT, 4);
> -
>      build_ghes_v2(table_data, ACPI_HEST_SRC_ID_SEA, linker);
>
> -    build_header(linker, table_data, (void *)(table_data->data + hest_start),
> -                 "HEST", table_data->len - hest_start, 1, oem_id, oem_table_id);
> +    acpi_table_composed(linker, &table);

     Thanks for the change, I think this change is reasonable to use
common API acpi_init_table() to replace build_header()

     Reviewed-by: Dongjiu Geng <gengdongjiu1@gmail.com>

>  }
>
>  void acpi_ghes_add_fw_cfg(AcpiGhesState *ags, FWCfgState *s,
> --
> 2.27.0
>


^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 04/53] tests: acpi: q35: test for x2APIC entries in SRAT
  2021-06-25  9:17 ` [PATCH 04/53] tests: acpi: q35: test for x2APIC entries in SRAT Igor Mammedov
@ 2021-07-02 14:45   ` Michael S. Tsirkin
  2021-07-08  9:18     ` Igor Mammedov
  0 siblings, 1 reply; 71+ messages in thread
From: Michael S. Tsirkin @ 2021-07-02 14:45 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: lvivier, thuth, qemu-devel

On Fri, Jun 25, 2021 at 05:17:28AM -0400, Igor Mammedov wrote:
> Set -smp 1,maxcpus=288 to test for ACPI code that
> deal with CPUs with large APIC ID (>255).
> 
> PS:
> Test requires KVM and in-kernel irqchip support,
> so skip test if KVM is not available.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>

Why don't we add a new test? Why change an existing one?
And I'd prefer kvm in the name since it's kvm specific.
E.g. kvmnumamem.


> ---
> v2:
>   - switch to qtest_has_accel() API
> 
> CC: thuth@redhat.com
> CC: lvivier@redhat.com
> ---
>  tests/qtest/bios-tables-test.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
> index 51d3a4e239..ca496819fa 100644
> --- a/tests/qtest/bios-tables-test.c
> +++ b/tests/qtest/bios-tables-test.c
> @@ -1021,7 +1021,7 @@ static void test_acpi_piix4_tcg_nohpet(void)
>      free_test_data(&data);
>  }
>  
> -static void test_acpi_q35_tcg_numamem(void)
> +static void test_acpi_q35_kvm_numamem(void)
>  {
>      test_data data;
>  
> @@ -1029,7 +1029,9 @@ static void test_acpi_q35_tcg_numamem(void)
>      data.machine = MACHINE_Q35;
>      data.variant = ".numamem";
>      test_acpi_one(" -object memory-backend-ram,id=ram0,size=128M"
> -                  " -numa node -numa node,memdev=ram0", &data);
> +                  " -numa node -numa node,memdev=ram0"
> +                  " -machine kernel-irqchip=on -smp 1,maxcpus=288"
> +                   , &data);
>      free_test_data(&data);
>  }
>  
> @@ -1506,6 +1508,7 @@ static void test_acpi_oem_fields_virt(void)
>  int main(int argc, char *argv[])
>  {
>      const char *arch = qtest_get_arch();
> +    const bool has_kvm = qtest_has_accel("kvm");
>      int ret;
>  
>      g_test_init(&argc, &argv, NULL);
> @@ -1536,7 +1539,6 @@ int main(int argc, char *argv[])
>          qtest_add_func("acpi/piix4/memhp", test_acpi_piix4_tcg_memhp);
>          qtest_add_func("acpi/q35/memhp", test_acpi_q35_tcg_memhp);
>          qtest_add_func("acpi/piix4/numamem", test_acpi_piix4_tcg_numamem);
> -        qtest_add_func("acpi/q35/numamem", test_acpi_q35_tcg_numamem);
>          qtest_add_func("acpi/piix4/nosmm", test_acpi_piix4_tcg_nosmm);
>          qtest_add_func("acpi/piix4/smm-compat",
>                         test_acpi_piix4_tcg_smm_compat);
> @@ -1561,6 +1563,9 @@ int main(int argc, char *argv[])
>          if (strcmp(arch, "x86_64") == 0) {
>              qtest_add_func("acpi/microvm/pcie", test_acpi_microvm_pcie_tcg);
>          }
> +        if (has_kvm) {
> +            qtest_add_func("acpi/q35/numamem", test_acpi_q35_kvm_numamem);
> +        }
>      } else if (strcmp(arch, "aarch64") == 0) {
>          qtest_add_func("acpi/virt", test_acpi_virt_tcg);
>          qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
> -- 
> 2.27.0



^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables
  2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
                   ` (53 preceding siblings ...)
  2021-06-25  9:18 ` [PATCH 53/53] acpi: AcpiGenericAddress no longer used to map/access fields of MMIO, drop packed attribute Igor Mammedov
@ 2021-07-02 14:47 ` Michael S. Tsirkin
  2021-07-05  7:56   ` Igor Mammedov
  54 siblings, 1 reply; 71+ messages in thread
From: Michael S. Tsirkin @ 2021-07-02 14:47 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-devel

On Fri, Jun 25, 2021 at 05:17:24AM -0400, Igor Mammedov wrote:
> Highlights:
>   * drop pointer arithmetic in ACPI tables code
>   * use endian agnostic API
>   * simplifies review of tables. /in most cases just line by line comparision with spec/


A hue amount of work, thank you!
To make it easier to merge, how about splitting it up a bit?
E.g. I think first 10-11 patches make sense on their own, right?

> Series replaces build_header() with acpi_init_table()/acpi_table_composed()
> API that hides pointer/offset arithmetic from user, to prevent
> errors caused by it [1].
> While doing above, it was necessary to split table header from
> packed structure that was describing the table, which is
> counter-productive since it still leaves packed structure drawbacks.
> So that sort of forced me to rewrite tables that were composed with
> help of packed structures to preferred build_append_int_noprefix() API.
> In cases where switch to build_append_int_noprefix() was small, it was
> combined with acpi_init_table()/acpi_table_composed() patch.
> Conversion reduced code size quite a bit despite me adding doc comments
> for every table row.
> 
> Series also includes optional qtest patches that add missing acpi
> tests for tables that I'm touching to verify conversion changes.
> That includes an alternative build time based impl. of
> qtest_has_accel() API. So if we start bike-shedding this qtest_has_accel()
> we can safely drop all tests included, till the time discussion settles
> and some form of a qtest_has_accel() is merged, at which point I'd respin
> depended tests.
> 
> 1) commits
>    bb9feea43179 x86: acpi: use offset instead of pointer when using build_header()
>    4d027afeb3a9 Virt: ACPI: fix qemu assert due to re-assigned table data address
> 
> Link to repo:
>    https://gitlab.com/imammedo/qemu/-/commits/acpi_build_header_refactoring
> 
> CC: mst@redhat.com
> 
> Igor Mammedov (53):
>   tests: acpi: dump table with failed checksum
>   tests: qtest: add qtest_has_accel() to check if tested binary supports
>     accelerator
>   tests: acpi: whitelist expected tables for acpi/q35/numamem testcase
>   tests: acpi: q35: test for x2APIC entries in SRAT
>   tests: acpi: update expected tables blobs
>   tests: acpi: whitelist new expected table
>     tests/data/acpi/q35/DMAR.dmar
>   tests: acpi: add testcase for intel_iommu (DMAR table)
>   tests: acpi: add expected blob for DMAR table
>   tests: acpi: whitelist expected blobs for new acpi/q35/ivrs testcase
>   tests: acpi: add testcase for amd-iommu (IVRS table)
>   tests: acpi: update expected blobs
>   tests: acpi: arm/virt: drop redundant test_acpi_one() in
>     test_acpi_virt_tcg()
>   tests: acpi: whitelist expected tables for acpi/virt/iort testcase
>   tests: acpi: arm/virt: use kvm to test IORT table
>   tests: acpi: add expected IORT table blob
>   tests: arm-cpu-features: use qtest_has_kvm() API
>   tests: migration-test: use qtest_has_accel() API
>   tests: bios-tables-test: use qtest_has_accel() API to register TCG
>     only tests
>   acpi: add helper routines to initialize ACPI tables
>   acpi: build_rsdt: use acpi_init_table()/acpi_table_composed() instead
>     of build_header()
>   acpi: build_xsdt: use acpi_init_table()/acpi_table_composed() instead
>     of build_header()
>   acpi: build_slit: use acpi_init_table()/acpi_table_composed() instead
>     of build_header()
>   acpi: build_fadt: use acpi_init_table()/acpi_table_composed() instead
>     of build_header()
>   acpi: build_tpm2: use acpi_init_table()/acpi_table_composed() instead
>     of build_header()
>   acpi: acpi_build_hest: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: build_mcfg: use acpi_init_table()/acpi_table_composed() instead
>     of build_header()
>   acpi: build_hmat: use acpi_init_table()/acpi_table_composed() instead
>     of build_header()
>   acpi: nvdimm_build_nfit: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: nvdimm_build_ssdt: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: vmgenid_build_acpi: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: x86: build_dsdt: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: build_hpet: use acpi_init_table()/acpi_table_composed() instead
>     of build_header()
>   acpi: build_tpm_tcpa: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: arm/x86: build_srat: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: use build_append_int_noprefix() API to compose SRAT table
>   acpi: build_dmar_q35: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: build_waet: use acpi_init_table()/acpi_table_composed() instead
>     of build_header()
>   acpi: build_amd_iommu: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: madt: arm/x86: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: x86: remove dead code
>   acpi: x86: set enabled when composing _MAT entries
>   acpi: x86: madt: use build_append_int_noprefix() API to compose MADT
>     table
>   acpi: arm/virt: madt: use build_append_int_noprefix() API to compose
>     MADT table
>   acpi: build_dsdt_microvm: use acpi_init_table()/acpi_table_composed()
>     instead of build_header()
>   acpi: arm: virt: build_dsdt: use
>     acpi_init_table()/acpi_table_composed() instead of build_header()
>   acpi: arm: virt: build_iort: use
>     acpi_init_table()/acpi_table_composed() instead of build_header()
>   acpi: arm/virt: convert build_iort() to endian agnostic
>     build_append_FOO() API
>   acpi: arm/virt: build_spcr: fix invalid cast
>   acpi: arm/virt: build_spcr: use
>     acpi_init_table()/acpi_table_composed() instead of build_header()
>   acpi: arm/virt: build_gtdt: use
>     acpi_init_table()/acpi_table_composed() instead of build_header()
>   acpi: build_facs: use build_append_int_noprefix() API to compose table
>   acpi: remove no longer used build_header()
>   acpi: AcpiGenericAddress no longer used to map/access fields of MMIO,
>     drop packed attribute
> 
>  include/hw/acpi/acpi-defs.h          | 528 +------------------------
>  include/hw/acpi/acpi_dev_interface.h |   3 +-
>  include/hw/acpi/aml-build.h          |  21 +-
>  include/hw/i386/pc.h                 |   7 +-
>  tests/qtest/libqos/libqtest.h        |   8 +
>  hw/acpi/acpi-x86-stub.c              |   3 +-
>  hw/acpi/aml-build.c                  | 188 +++++----
>  hw/acpi/cpu.c                        |  17 +-
>  hw/acpi/ghes.c                       |  10 +-
>  hw/acpi/hmat.c                       |  14 +-
>  hw/acpi/nvdimm.c                     |  64 ++--
>  hw/acpi/pci.c                        |  18 +-
>  hw/acpi/vmgenid.c                    |  16 +-
>  hw/arm/virt-acpi-build.c             | 550 +++++++++++++++------------
>  hw/i386/acpi-build.c                 | 285 +++++++-------
>  hw/i386/acpi-common.c                | 158 ++++----
>  hw/i386/acpi-microvm.c               |  13 +-
>  meson.build                          |   6 +
>  tests/data/acpi/q35/APIC.numamem     | Bin 0 -> 2686 bytes
>  tests/data/acpi/q35/DMAR.dmar        | Bin 0 -> 80 bytes
>  tests/data/acpi/q35/DSDT.ivrs        | Bin 0 -> 7877 bytes
>  tests/data/acpi/q35/DSDT.numamem     | Bin 7865 -> 35222 bytes
>  tests/data/acpi/q35/FACP.numamem     | Bin 0 -> 244 bytes
>  tests/data/acpi/q35/IVRS.ivrs        | Bin 0 -> 104 bytes
>  tests/data/acpi/q35/SRAT.numamem     | Bin 224 -> 5080 bytes
>  tests/data/acpi/virt/IORT.iort       | Bin 0 -> 124 bytes
>  tests/qtest/acpi-utils.c             |  14 +
>  tests/qtest/arm-cpu-features.c       |  29 +-
>  tests/qtest/bios-tables-test.c       |  85 ++++-
>  tests/qtest/libqtest.c               |  27 ++
>  tests/qtest/migration-test.c         |  15 +-
>  31 files changed, 873 insertions(+), 1206 deletions(-)
>  create mode 100644 tests/data/acpi/q35/APIC.numamem
>  create mode 100644 tests/data/acpi/q35/DMAR.dmar
>  create mode 100644 tests/data/acpi/q35/DSDT.ivrs
>  create mode 100644 tests/data/acpi/q35/FACP.numamem
>  create mode 100644 tests/data/acpi/q35/IVRS.ivrs
>  create mode 100644 tests/data/acpi/virt/IORT.iort
> 
> --
> 2.27.0



^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables
  2021-07-02 14:47 ` [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Michael S. Tsirkin
@ 2021-07-05  7:56   ` Igor Mammedov
  2021-07-05 18:00     ` Michael S. Tsirkin
  0 siblings, 1 reply; 71+ messages in thread
From: Igor Mammedov @ 2021-07-05  7:56 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: qemu-devel

On Fri, 2 Jul 2021 10:47:20 -0400
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> On Fri, Jun 25, 2021 at 05:17:24AM -0400, Igor Mammedov wrote:
> > Highlights:
> >   * drop pointer arithmetic in ACPI tables code
> >   * use endian agnostic API
> >   * simplifies review of tables. /in most cases just line by line comparision with spec/  
> 
> 
> A hue amount of work, thank you!
> To make it easier to merge, how about splitting it up a bit?
> E.g. I think first 10-11 patches make sense on their own, right?

I think you've meant 01-11 patches, and answer is yes, it's in-depended
of actual ACPI refactoring as was mentioned is cover letter, see below.

[...]
> > 
> > Series also includes optional qtest patches that add missing acpi
> > tests for tables that I'm touching to verify conversion changes.
> > That includes an alternative build time based impl. of
> > qtest_has_accel() API. So if we start bike-shedding this qtest_has_accel()
> > we can safely drop all tests included, till the time discussion settles
> > and some form of a qtest_has_accel() is merged, at which point I'd respin
> > depended tests.
[...]

it's ok to split tests into a separate series if that's what you prefer.



^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables
  2021-07-05  7:56   ` Igor Mammedov
@ 2021-07-05 18:00     ` Michael S. Tsirkin
  2021-07-07  9:11       ` Igor Mammedov
  0 siblings, 1 reply; 71+ messages in thread
From: Michael S. Tsirkin @ 2021-07-05 18:00 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: qemu-devel

On Mon, Jul 05, 2021 at 09:56:18AM +0200, Igor Mammedov wrote:
> On Fri, 2 Jul 2021 10:47:20 -0400
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
> 
> > On Fri, Jun 25, 2021 at 05:17:24AM -0400, Igor Mammedov wrote:
> > > Highlights:
> > >   * drop pointer arithmetic in ACPI tables code
> > >   * use endian agnostic API
> > >   * simplifies review of tables. /in most cases just line by line comparision with spec/  
> > 
> > 
> > A hue amount of work, thank you!
> > To make it easier to merge, how about splitting it up a bit?
> > E.g. I think first 10-11 patches make sense on their own, right?
> 
> I think you've meant 01-11 patches, and answer is yes, it's in-depended
> of actual ACPI refactoring as was mentioned is cover letter, see below.
> 
> [...]
> > > 
> > > Series also includes optional qtest patches that add missing acpi
> > > tests for tables that I'm touching to verify conversion changes.
> > > That includes an alternative build time based impl. of
> > > qtest_has_accel() API. So if we start bike-shedding this qtest_has_accel()
> > > we can safely drop all tests included, till the time discussion settles
> > > and some form of a qtest_has_accel() is merged, at which point I'd respin
> > > depended tests.
> [...]
> 
> it's ok to split tests into a separate series if that's what you prefer.

Let's start with a smaller series that still makes sense.
I'll merge that we'll look at the next chunk.

-- 
MST



^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables
  2021-07-05 18:00     ` Michael S. Tsirkin
@ 2021-07-07  9:11       ` Igor Mammedov
  0 siblings, 0 replies; 71+ messages in thread
From: Igor Mammedov @ 2021-07-07  9:11 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: qemu-devel

On Mon, 5 Jul 2021 14:00:51 -0400
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> On Mon, Jul 05, 2021 at 09:56:18AM +0200, Igor Mammedov wrote:
> > On Fri, 2 Jul 2021 10:47:20 -0400
> > "Michael S. Tsirkin" <mst@redhat.com> wrote:
> >   
> > > On Fri, Jun 25, 2021 at 05:17:24AM -0400, Igor Mammedov wrote:  
> > > > Highlights:
> > > >   * drop pointer arithmetic in ACPI tables code
> > > >   * use endian agnostic API
> > > >   * simplifies review of tables. /in most cases just line by line comparision with spec/    
> > > 
> > > 
> > > A hue amount of work, thank you!
> > > To make it easier to merge, how about splitting it up a bit?
> > > E.g. I think first 10-11 patches make sense on their own, right?  
> > 
> > I think you've meant 01-11 patches, and answer is yes, it's in-depended
> > of actual ACPI refactoring as was mentioned is cover letter, see below.
> > 
> > [...]  
> > > > 
> > > > Series also includes optional qtest patches that add missing acpi
> > > > tests for tables that I'm touching to verify conversion changes.
> > > > That includes an alternative build time based impl. of
> > > > qtest_has_accel() API. So if we start bike-shedding this qtest_has_accel()
> > > > we can safely drop all tests included, till the time discussion settles
> > > > and some form of a qtest_has_accel() is merged, at which point I'd respin
> > > > depended tests.  
> > [...]
> > 
> > it's ok to split tests into a separate series if that's what you prefer.  
> 
> Let's start with a smaller series that still makes sense.
> I'll merge that we'll look at the next chunk.
> 

Ok, I'll drop tests for now and respin as v2 with TPM fixes.



^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 04/53] tests: acpi: q35: test for x2APIC entries in SRAT
  2021-07-02 14:45   ` Michael S. Tsirkin
@ 2021-07-08  9:18     ` Igor Mammedov
  2021-07-08 11:59       ` Michael S. Tsirkin
  0 siblings, 1 reply; 71+ messages in thread
From: Igor Mammedov @ 2021-07-08  9:18 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: lvivier, thuth, qemu-devel

On Fri, 2 Jul 2021 10:45:37 -0400
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> On Fri, Jun 25, 2021 at 05:17:28AM -0400, Igor Mammedov wrote:
> > Set -smp 1,maxcpus=288 to test for ACPI code that
> > deal with CPUs with large APIC ID (>255).
> > 
> > PS:
> > Test requires KVM and in-kernel irqchip support,
> > so skip test if KVM is not available.
> > 
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>  
> 
> Why don't we add a new test? Why change an existing one?
> And I'd prefer kvm in the name since it's kvm specific.
> E.g. kvmnumamem.

I've opted for changing existing one as it practically
tests the same ACPI code in 'pc' variant, so changing
q35 'duplicate' variant to handle more than 255 cpus
seemed reasonable to me.

Anyways, I don't have any preferences here so I can
easily change that to a new testcase if you still
prefer it.

as for name, I'll amend it on test respin.
 
> 
> > ---
> > v2:
> >   - switch to qtest_has_accel() API
> > 
> > CC: thuth@redhat.com
> > CC: lvivier@redhat.com
> > ---
> >  tests/qtest/bios-tables-test.c | 11 ++++++++---
> >  1 file changed, 8 insertions(+), 3 deletions(-)
> > 
> > diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
> > index 51d3a4e239..ca496819fa 100644
> > --- a/tests/qtest/bios-tables-test.c
> > +++ b/tests/qtest/bios-tables-test.c
> > @@ -1021,7 +1021,7 @@ static void test_acpi_piix4_tcg_nohpet(void)
> >      free_test_data(&data);
> >  }
> >  
> > -static void test_acpi_q35_tcg_numamem(void)
> > +static void test_acpi_q35_kvm_numamem(void)
> >  {
> >      test_data data;
> >  
> > @@ -1029,7 +1029,9 @@ static void test_acpi_q35_tcg_numamem(void)
> >      data.machine = MACHINE_Q35;
> >      data.variant = ".numamem";
> >      test_acpi_one(" -object memory-backend-ram,id=ram0,size=128M"
> > -                  " -numa node -numa node,memdev=ram0", &data);
> > +                  " -numa node -numa node,memdev=ram0"
> > +                  " -machine kernel-irqchip=on -smp 1,maxcpus=288"
> > +                   , &data);
> >      free_test_data(&data);
> >  }
> >  
> > @@ -1506,6 +1508,7 @@ static void test_acpi_oem_fields_virt(void)
> >  int main(int argc, char *argv[])
> >  {
> >      const char *arch = qtest_get_arch();
> > +    const bool has_kvm = qtest_has_accel("kvm");
> >      int ret;
> >  
> >      g_test_init(&argc, &argv, NULL);
> > @@ -1536,7 +1539,6 @@ int main(int argc, char *argv[])
> >          qtest_add_func("acpi/piix4/memhp", test_acpi_piix4_tcg_memhp);
> >          qtest_add_func("acpi/q35/memhp", test_acpi_q35_tcg_memhp);
> >          qtest_add_func("acpi/piix4/numamem", test_acpi_piix4_tcg_numamem);
> > -        qtest_add_func("acpi/q35/numamem", test_acpi_q35_tcg_numamem);
> >          qtest_add_func("acpi/piix4/nosmm", test_acpi_piix4_tcg_nosmm);
> >          qtest_add_func("acpi/piix4/smm-compat",
> >                         test_acpi_piix4_tcg_smm_compat);
> > @@ -1561,6 +1563,9 @@ int main(int argc, char *argv[])
> >          if (strcmp(arch, "x86_64") == 0) {
> >              qtest_add_func("acpi/microvm/pcie", test_acpi_microvm_pcie_tcg);
> >          }
> > +        if (has_kvm) {
> > +            qtest_add_func("acpi/q35/numamem", test_acpi_q35_kvm_numamem);
> > +        }
> >      } else if (strcmp(arch, "aarch64") == 0) {
> >          qtest_add_func("acpi/virt", test_acpi_virt_tcg);
> >          qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
> > -- 
> > 2.27.0  
> 



^ permalink raw reply	[flat|nested] 71+ messages in thread

* Re: [PATCH 04/53] tests: acpi: q35: test for x2APIC entries in SRAT
  2021-07-08  9:18     ` Igor Mammedov
@ 2021-07-08 11:59       ` Michael S. Tsirkin
  0 siblings, 0 replies; 71+ messages in thread
From: Michael S. Tsirkin @ 2021-07-08 11:59 UTC (permalink / raw)
  To: Igor Mammedov; +Cc: lvivier, thuth, qemu-devel

On Thu, Jul 08, 2021 at 11:18:33AM +0200, Igor Mammedov wrote:
> On Fri, 2 Jul 2021 10:45:37 -0400
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
> 
> > On Fri, Jun 25, 2021 at 05:17:28AM -0400, Igor Mammedov wrote:
> > > Set -smp 1,maxcpus=288 to test for ACPI code that
> > > deal with CPUs with large APIC ID (>255).
> > > 
> > > PS:
> > > Test requires KVM and in-kernel irqchip support,
> > > so skip test if KVM is not available.
> > > 
> > > Signed-off-by: Igor Mammedov <imammedo@redhat.com>  
> > 
> > Why don't we add a new test? Why change an existing one?
> > And I'd prefer kvm in the name since it's kvm specific.
> > E.g. kvmnumamem.
> 
> I've opted for changing existing one as it practically
> tests the same ACPI code in 'pc' variant, so changing
> q35 'duplicate' variant to handle more than 255 cpus
> seemed reasonable to me.
> 
> Anyways, I don't have any preferences here so I can
> easily change that to a new testcase if you still
> prefer it.


the reason I do is because this way we don't drop the test on non
kvm hosts.
 
> as for name, I'll amend it on test respin.
>  
> > 
> > > ---
> > > v2:
> > >   - switch to qtest_has_accel() API
> > > 
> > > CC: thuth@redhat.com
> > > CC: lvivier@redhat.com
> > > ---
> > >  tests/qtest/bios-tables-test.c | 11 ++++++++---
> > >  1 file changed, 8 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
> > > index 51d3a4e239..ca496819fa 100644
> > > --- a/tests/qtest/bios-tables-test.c
> > > +++ b/tests/qtest/bios-tables-test.c
> > > @@ -1021,7 +1021,7 @@ static void test_acpi_piix4_tcg_nohpet(void)
> > >      free_test_data(&data);
> > >  }
> > >  
> > > -static void test_acpi_q35_tcg_numamem(void)
> > > +static void test_acpi_q35_kvm_numamem(void)
> > >  {
> > >      test_data data;
> > >  
> > > @@ -1029,7 +1029,9 @@ static void test_acpi_q35_tcg_numamem(void)
> > >      data.machine = MACHINE_Q35;
> > >      data.variant = ".numamem";
> > >      test_acpi_one(" -object memory-backend-ram,id=ram0,size=128M"
> > > -                  " -numa node -numa node,memdev=ram0", &data);
> > > +                  " -numa node -numa node,memdev=ram0"
> > > +                  " -machine kernel-irqchip=on -smp 1,maxcpus=288"
> > > +                   , &data);
> > >      free_test_data(&data);
> > >  }
> > >  
> > > @@ -1506,6 +1508,7 @@ static void test_acpi_oem_fields_virt(void)
> > >  int main(int argc, char *argv[])
> > >  {
> > >      const char *arch = qtest_get_arch();
> > > +    const bool has_kvm = qtest_has_accel("kvm");
> > >      int ret;
> > >  
> > >      g_test_init(&argc, &argv, NULL);
> > > @@ -1536,7 +1539,6 @@ int main(int argc, char *argv[])
> > >          qtest_add_func("acpi/piix4/memhp", test_acpi_piix4_tcg_memhp);
> > >          qtest_add_func("acpi/q35/memhp", test_acpi_q35_tcg_memhp);
> > >          qtest_add_func("acpi/piix4/numamem", test_acpi_piix4_tcg_numamem);
> > > -        qtest_add_func("acpi/q35/numamem", test_acpi_q35_tcg_numamem);
> > >          qtest_add_func("acpi/piix4/nosmm", test_acpi_piix4_tcg_nosmm);
> > >          qtest_add_func("acpi/piix4/smm-compat",
> > >                         test_acpi_piix4_tcg_smm_compat);
> > > @@ -1561,6 +1563,9 @@ int main(int argc, char *argv[])
> > >          if (strcmp(arch, "x86_64") == 0) {
> > >              qtest_add_func("acpi/microvm/pcie", test_acpi_microvm_pcie_tcg);
> > >          }
> > > +        if (has_kvm) {
> > > +            qtest_add_func("acpi/q35/numamem", test_acpi_q35_kvm_numamem);
> > > +        }
> > >      } else if (strcmp(arch, "aarch64") == 0) {
> > >          qtest_add_func("acpi/virt", test_acpi_virt_tcg);
> > >          qtest_add_func("acpi/virt/numamem", test_acpi_virt_tcg_numamem);
> > > -- 
> > > 2.27.0  
> > 



^ permalink raw reply	[flat|nested] 71+ messages in thread

end of thread, other threads:[~2021-07-08 12:03 UTC | newest]

Thread overview: 71+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-25  9:17 [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Igor Mammedov
2021-06-25  9:17 ` [PATCH 01/53] tests: acpi: dump table with failed checksum Igor Mammedov
2021-06-25  9:17 ` [PATCH 02/53] tests: qtest: add qtest_has_accel() to check if tested binary supports accelerator Igor Mammedov
2021-06-25  9:33   ` Philippe Mathieu-Daudé
2021-06-25  9:17 ` [PATCH 03/53] tests: acpi: whitelist expected tables for acpi/q35/numamem testcase Igor Mammedov
2021-06-25  9:17 ` [PATCH 04/53] tests: acpi: q35: test for x2APIC entries in SRAT Igor Mammedov
2021-07-02 14:45   ` Michael S. Tsirkin
2021-07-08  9:18     ` Igor Mammedov
2021-07-08 11:59       ` Michael S. Tsirkin
2021-06-25  9:17 ` [PATCH 05/53] tests: acpi: update expected tables blobs Igor Mammedov
2021-06-25  9:17 ` [PATCH 06/53] tests: acpi: whitelist new expected table tests/data/acpi/q35/DMAR.dmar Igor Mammedov
2021-06-25  9:17 ` [PATCH 07/53] tests: acpi: add testcase for intel_iommu (DMAR table) Igor Mammedov
2021-06-25  9:17 ` [PATCH 08/53] tests: acpi: add expected blob for DMAR table Igor Mammedov
2021-06-25  9:17 ` [PATCH 09/53] tests: acpi: whitelist expected blobs for new acpi/q35/ivrs testcase Igor Mammedov
2021-06-25  9:17 ` [PATCH 10/53] tests: acpi: add testcase for amd-iommu (IVRS table) Igor Mammedov
2021-06-25  9:17 ` [PATCH 11/53] tests: acpi: update expected blobs Igor Mammedov
2021-06-25  9:17 ` [PATCH 12/53] tests: acpi: arm/virt: drop redudant test_acpi_one() in test_acpi_virt_tcg() Igor Mammedov
2021-06-25  9:17 ` [PATCH 12/53] tests: acpi: arm/virt: drop redundant " Igor Mammedov
2021-06-25  9:17 ` [PATCH 13/53] tests: acpi: whitelist expected tables for acpi/virt/iort testcase Igor Mammedov
2021-06-25  9:17 ` [PATCH 14/53] tests: acpi: arm/virt: use kvm to test IORT table Igor Mammedov
2021-06-25  9:17 ` [PATCH 15/53] tests: acpi: add expected IORT table blob Igor Mammedov
2021-06-25  9:17 ` [PATCH 16/53] tests: arm-cpu-features: use qtest_has_kvm() API Igor Mammedov
2021-06-25  9:17 ` [PATCH 17/53] tests: migration-test: use qtest_has_accel() API Igor Mammedov
2021-06-25  9:17 ` [PATCH 18/53] tests: bios-tables-test: use qtest_has_accel() API to register TCG only tests Igor Mammedov
2021-06-25  9:17 ` [PATCH 19/53] acpi: add helper routines to initialize ACPI tables Igor Mammedov
2021-06-29 19:16   ` Michael S. Tsirkin
2021-06-30  6:32     ` Igor Mammedov
2021-06-25  9:17 ` [PATCH 20/53] acpi: build_rsdt: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
2021-06-25  9:17 ` [PATCH 21/53] acpi: build_xsdt: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 22/53] acpi: build_slit: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 23/53] acpi: build_fadt: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 24/53] acpi: build_tpm2: " Igor Mammedov
2021-06-29 14:56   ` Stefan Berger
2021-06-25  9:17 ` [PATCH 25/53] acpi: acpi_build_hest: " Igor Mammedov
2021-07-02 12:21   ` Dongjiu Geng
2021-06-25  9:17 ` [PATCH 26/53] acpi: build_mcfg: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 27/53] acpi: build_hmat: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 28/53] acpi: nvdimm_build_nfit: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 29/53] acpi: nvdimm_build_ssdt: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 30/53] acpi: vmgenid_build_acpi: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 31/53] acpi: x86: build_dsdt: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 32/53] acpi: build_hpet: " Igor Mammedov
2021-06-25  9:17 ` [PATCH 33/53] acpi: build_tpm_tcpa: " Igor Mammedov
2021-06-29 15:19   ` Stefan Berger
2021-06-30  7:22     ` Igor Mammedov
2021-06-30  7:25   ` [PATCH v2 " Igor Mammedov
2021-06-30 12:21     ` Stefan Berger
2021-06-25  9:17 ` [PATCH 34/53] acpi: arm/x86: build_srat: " Igor Mammedov
2021-06-25  9:18 ` [PATCH 35/53] acpi: use build_append_int_noprefix() API to compose SRAT table Igor Mammedov
2021-06-25  9:18 ` [PATCH 36/53] acpi: build_dmar_q35: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
2021-06-25  9:18 ` [PATCH 37/53] acpi: build_waet: " Igor Mammedov
2021-06-25  9:18 ` [PATCH 38/53] acpi: build_amd_iommu: " Igor Mammedov
2021-06-25  9:18 ` [PATCH 39/53] acpi: madt: arm/x86: " Igor Mammedov
2021-06-25  9:18 ` [PATCH 40/53] acpi: x86: remove dead code Igor Mammedov
2021-06-25  9:18 ` [PATCH 41/53] acpi: x86: set enabled when composing _MAT entries Igor Mammedov
2021-06-25  9:18 ` [PATCH 42/53] acpi: x86: madt: use build_append_int_noprefix() API to compose MADT table Igor Mammedov
2021-06-25  9:18 ` [PATCH 43/53] acpi: arm/virt: " Igor Mammedov
2021-06-25  9:18 ` [PATCH 44/53] acpi: build_dsdt_microvm: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
2021-06-25  9:18 ` [PATCH 45/53] acpi: arm: virt: build_dsdt: " Igor Mammedov
2021-06-25  9:18 ` [PATCH 46/53] acpi: arm: virt: build_iort: " Igor Mammedov
2021-06-25  9:18 ` [PATCH 47/53] acpi: arm/virt: convert build_iort() to endian agnostic build_append_FOO() API Igor Mammedov
2021-06-25  9:18 ` [PATCH 48/53] acpi: arm/virt: build_spcr: fix invalid cast Igor Mammedov
2021-06-25  9:18 ` [PATCH 49/53] acpi: arm/virt: build_spcr: use acpi_init_table()/acpi_table_composed() instead of build_header() Igor Mammedov
2021-06-25  9:18 ` [PATCH 50/53] acpi: arm/virt: build_gtdt: " Igor Mammedov
2021-06-25  9:18 ` [PATCH 51/53] acpi: build_facs: use build_append_int_noprefix() API to compose table Igor Mammedov
2021-06-25  9:18 ` [PATCH 52/53] acpi: remove no longer used build_header() Igor Mammedov
2021-06-25  9:18 ` [PATCH 53/53] acpi: AcpiGenericAddress no longer used to map/access fields of MMIO, drop packed attribute Igor Mammedov
2021-07-02 14:47 ` [PATCH 00/53] acpi: refactor error prone build_header() and packed structures usage in ACPI tables Michael S. Tsirkin
2021-07-05  7:56   ` Igor Mammedov
2021-07-05 18:00     ` Michael S. Tsirkin
2021-07-07  9:11       ` Igor Mammedov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.