From nobody Fri Nov 7 10:32:08 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1547518426509846.2214829227257; Mon, 14 Jan 2019 18:13:46 -0800 (PST) Received: from localhost ([127.0.0.1]:55246 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gjEEX-0007VE-4E for importer@patchew.org; Mon, 14 Jan 2019 21:13:41 -0500 Received: from eggs.gnu.org ([209.51.188.92]:36827) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gjDjq-0007s4-Tc for qemu-devel@nongnu.org; Mon, 14 Jan 2019 20:42:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gjDdq-0007Xv-OD for qemu-devel@nongnu.org; Mon, 14 Jan 2019 20:35:48 -0500 Received: from mx1.redhat.com ([209.132.183.28]:48072) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gjDdq-0007X3-EU for qemu-devel@nongnu.org; Mon, 14 Jan 2019 20:35:46 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 774C73F1FB; Tue, 15 Jan 2019 01:35:45 +0000 (UTC) Received: from redhat.com (ovpn-124-229.rdu2.redhat.com [10.10.124.229]) by smtp.corp.redhat.com (Postfix) with SMTP id A5CCD5D978; Tue, 15 Jan 2019 01:35:44 +0000 (UTC) Date: Mon, 14 Jan 2019 20:35:44 -0500 From: "Michael S. Tsirkin" To: qemu-devel@nongnu.org Message-ID: <20190115003812.11329-9-mst@redhat.com> References: <20190115003812.11329-1-mst@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190115003812.11329-1-mst@redhat.com> X-Mutt-Fcc: =sent X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 15 Jan 2019 01:35:45 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 08/44] tests: acpi: use AcpiSdtTable::aml in consistent way X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier , Peter Maydell , Thomas Huth , Paolo Bonzini , Igor Mammedov Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Igor Mammedov Currently in the 1st case we store table body fetched from QEMU in AcpiSdtTable::aml minus it's header but in the 2nd case when we load reference aml from disk, it holds whole blob including header. More over in the 1st case, we read header in separate AcpiSdtTable::header structure and then jump over hoops to fixup tables and combine both. Treat AcpiSdtTable::aml as whole table blob approach in both cases and when fetching tables from QEMU, first get table length and then fetch whole table into AcpiSdtTable::aml instead if doing it field by field. As result * AcpiSdtTable::aml is used in consistent manner * FADT fixups use offsets from spec instead of being shifted by header length * calculating checksums and dumping blobs becomes simpler Signed-off-by: Igor Mammedov Acked-by: Thomas Huth Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- tests/acpi-utils.h | 6 ++-- tests/bios-tables-test.c | 62 +++++++++++++++------------------------- 2 files changed, 27 insertions(+), 41 deletions(-) diff --git a/tests/acpi-utils.h b/tests/acpi-utils.h index c5b0e12aa2..1b0e80d45c 100644 --- a/tests/acpi-utils.h +++ b/tests/acpi-utils.h @@ -18,8 +18,10 @@ =20 /* DSDT and SSDTs format */ typedef struct { - AcpiTableHeader header; - gchar *aml; /* aml bytecode from guest */ + union { + AcpiTableHeader *header; + uint8_t *aml; /* aml bytecode from guest */ + }; gsize aml_len; gchar *aml_file; gchar *asl; /* asl code generated from aml */ diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c index d455b2abfc..3f20bbd24e 100644 --- a/tests/bios-tables-test.c +++ b/tests/bios-tables-test.c @@ -163,29 +163,23 @@ static void sanitize_fadt_ptrs(test_data *data) for (i =3D 0; i < data->tables->len; i++) { AcpiSdtTable *sdt =3D &g_array_index(data->tables, AcpiSdtTable, i= ); =20 - if (memcmp(&sdt->header.signature, "FACP", 4)) { + if (memcmp(&sdt->header->signature, "FACP", 4)) { continue; } =20 /* check original FADT checksum before sanitizing table */ - g_assert(!(uint8_t)( - acpi_calc_checksum((uint8_t *)sdt, sizeof(AcpiTableHeader)) + - acpi_calc_checksum((uint8_t *)sdt->aml, sdt->aml_len) - )); + g_assert(!acpi_calc_checksum(sdt->aml, sdt->aml_len)); =20 - /* sdt->aml field offset :=3D spec offset - header size */ - memset(sdt->aml + 0, 0, 4); /* sanitize FIRMWARE_CTRL(36) ptr */ - memset(sdt->aml + 4, 0, 4); /* sanitize DSDT(40) ptr */ - if (sdt->header.revision >=3D 3) { - memset(sdt->aml + 96, 0, 8); /* sanitize X_FIRMWARE_CTRL(132) = ptr */ - memset(sdt->aml + 104, 0, 8); /* sanitize X_DSDT(140) ptr */ + memset(sdt->aml + 36, 0, 4); /* sanitize FIRMWARE_CTRL ptr */ + memset(sdt->aml + 40, 0, 4); /* sanitize DSDT ptr */ + if (sdt->header->revision >=3D 3) { + memset(sdt->aml + 132, 0, 8); /* sanitize X_FIRMWARE_CTRL ptr = */ + memset(sdt->aml + 140, 0, 8); /* sanitize X_DSDT ptr */ } =20 /* update checksum */ - sdt->header.checksum =3D 0; - sdt->header.checksum -=3D - acpi_calc_checksum((uint8_t *)sdt, sizeof(AcpiTableHeader)) + - acpi_calc_checksum((uint8_t *)sdt->aml, sdt->aml_len); + sdt->header->checksum =3D 0; + sdt->header->checksum -=3D acpi_calc_checksum(sdt->aml, sdt->aml_l= en); break; } } @@ -212,30 +206,23 @@ static void test_acpi_facs_table(test_data *data) */ static void fetch_table(QTestState *qts, AcpiSdtTable *sdt_table, uint32_t= addr) { - uint8_t checksum; - - memset(sdt_table, 0, sizeof(*sdt_table)); - ACPI_READ_TABLE_HEADER(qts, &sdt_table->header, addr); - - sdt_table->aml_len =3D le32_to_cpu(sdt_table->header.length) - - sizeof(AcpiTableHeader); + qtest_memread(qts, addr + 4 /* Length of ACPI table */, + &sdt_table->aml_len, 4); + sdt_table->aml_len =3D le32_to_cpu(sdt_table->aml_len); sdt_table->aml =3D g_malloc0(sdt_table->aml_len); - ACPI_READ_ARRAY_PTR(qts, sdt_table->aml, sdt_table->aml_len, addr); + /* get whole table */ + qtest_memread(qts, addr, sdt_table->aml, sdt_table->aml_len); =20 - checksum =3D acpi_calc_checksum((uint8_t *)sdt_table, - sizeof(AcpiTableHeader)) + - acpi_calc_checksum((uint8_t *)sdt_table->aml, - sdt_table->aml_len); - g_assert(!checksum); + g_assert(!acpi_calc_checksum(sdt_table->aml, sdt_table->aml_len)); } =20 static void test_acpi_dsdt_table(test_data *data) { - AcpiSdtTable dsdt_table; + AcpiSdtTable dsdt_table =3D {}; uint32_t addr =3D le32_to_cpu(data->dsdt_addr); =20 fetch_table(data->qts, &dsdt_table, addr); - ACPI_ASSERT_CMP(dsdt_table.header.signature, "DSDT"); + ACPI_ASSERT_CMP(dsdt_table.header->signature, "DSDT"); =20 /* Since DSDT isn't in RSDT, add DSDT to ASL test tables list manually= */ g_array_append_val(data->tables, dsdt_table); @@ -248,7 +235,7 @@ static void fetch_rsdt_referenced_tables(test_data *dat= a) int i; =20 for (i =3D 0; i < tables_nr; i++) { - AcpiSdtTable ssdt_table; + AcpiSdtTable ssdt_table =3D {}; uint32_t addr; =20 addr =3D le32_to_cpu(data->rsdt_tables_addr[i]); @@ -275,7 +262,7 @@ static void dump_aml_files(test_data *data, bool rebuil= d) =20 if (rebuild) { aml_file =3D g_strdup_printf("%s/%s/%.4s%s", data_dir, data->m= achine, - (gchar *)&sdt->header.signature, ex= t); + (gchar *)&sdt->header->signature, e= xt); fd =3D g_open(aml_file, O_WRONLY|O_TRUNC|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH); } else { @@ -284,8 +271,6 @@ static void dump_aml_files(test_data *data, bool rebuil= d) } g_assert(fd >=3D 0); =20 - ret =3D qemu_write_full(fd, sdt, sizeof(AcpiTableHeader)); - g_assert(ret =3D=3D sizeof(AcpiTableHeader)); ret =3D qemu_write_full(fd, sdt->aml, sdt->aml_len); g_assert(ret =3D=3D sdt->aml_len); =20 @@ -297,7 +282,7 @@ static void dump_aml_files(test_data *data, bool rebuil= d) =20 static bool compare_signature(AcpiSdtTable *sdt, const char *signature) { - return !memcmp(&sdt->header.signature, signature, 4); + return !memcmp(&sdt->header->signature, signature, 4); } =20 static bool load_asl(GArray *sdts, AcpiSdtTable *sdt) @@ -395,11 +380,10 @@ static GArray *load_expected_aml(test_data *data) sdt =3D &g_array_index(data->tables, AcpiSdtTable, i); =20 memset(&exp_sdt, 0, sizeof(exp_sdt)); - exp_sdt.header.signature =3D sdt->header.signature; =20 try_again: aml_file =3D g_strdup_printf("%s/%s/%.4s%s", data_dir, data->machi= ne, - (gchar *)&sdt->header.signature, ext); + (gchar *)&sdt->header->signature, ext); if (getenv("V")) { fprintf(stderr, "Looking for expected file '%s'\n", aml_file); } @@ -415,7 +399,7 @@ try_again: if (getenv("V")) { fprintf(stderr, "Using expected file '%s'\n", aml_file); } - ret =3D g_file_get_contents(aml_file, &exp_sdt.aml, + ret =3D g_file_get_contents(aml_file, (gchar **)&exp_sdt.aml, &exp_sdt.aml_len, &error); g_assert(ret); g_assert_no_error(error); @@ -459,7 +443,7 @@ static void test_acpi_asl(test_data *data) fprintf(stderr, "Warning! iasl couldn't parse the expected aml\n"); } else { - uint32_t signature =3D cpu_to_le32(exp_sdt->header.signatu= re); + uint32_t signature =3D cpu_to_le32(exp_sdt->header->signat= ure); sdt->tmp_files_retain =3D true; exp_sdt->tmp_files_retain =3D true; fprintf(stderr, --=20 MST