aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Mammedov <imammedo@redhat.com>2018-01-16 16:30:26 +0100
committerMichael S. Tsirkin <mst@redhat.com>2018-02-13 18:25:48 +0200
commit92146b7a0fe6d6f9df34eeb22dc8e33785a49a42 (patch)
tree4fdb928cab2a57af0ee7349818182ee99f3cb580
parentfc67208f228af8e444f74362db1bced56a3daa71 (diff)
downloadqemu-92146b7a0fe6d6f9df34eeb22dc8e33785a49a42.zip
qemu-92146b7a0fe6d6f9df34eeb22dc8e33785a49a42.tar.gz
qemu-92146b7a0fe6d6f9df34eeb22dc8e33785a49a42.tar.bz2
tests: acpi: fix FADT not being compared to reference table
It turns out that FADT isn't actually tested for changes against reference table, since it happens to be the 1st table in RSDT which is currently ignored. Fix it by making sure that all tables from RSDT are added to test list. NOTE: FADT contains guest allocated pointers to FACS/DSDT, zero them out so that possible FACS/DSDT address change won't affect test results. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--tests/bios-tables-test.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c
index b354aaa..2b332ed 100644
--- a/tests/bios-tables-test.c
+++ b/tests/bios-tables-test.c
@@ -194,6 +194,35 @@ static void test_acpi_fadt_table(test_data *data)
le32_to_cpu(fadt_table->length)));
}
+static void sanitize_fadt_ptrs(test_data *data)
+{
+ /* fixup pointers in FADT */
+ int i;
+
+ for (i = 0; i < data->tables->len; i++) {
+ AcpiSdtTable *sdt = &g_array_index(data->tables, AcpiSdtTable, i);
+
+ if (memcmp(&sdt->header.signature, "FACP", 4)) {
+ continue;
+ }
+
+ /* sdt->aml field offset := 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 >= 3) {
+ memset(sdt->aml + 96, 0, 8); /* sanitize X_FIRMWARE_CTRL(132) ptr */
+ memset(sdt->aml + 104, 0, 8); /* sanitize X_DSDT(140) ptr */
+ }
+
+ /* update checksum */
+ sdt->header.checksum = 0;
+ sdt->header.checksum -=
+ acpi_calc_checksum((uint8_t *)sdt, sizeof(AcpiTableHeader)) +
+ acpi_calc_checksum((uint8_t *)sdt->aml, sdt->aml_len);
+ break;
+ }
+}
+
static void test_acpi_facs_table(test_data *data)
{
AcpiFacsDescriptorRev1 *facs_table = &data->facs_table;
@@ -248,14 +277,14 @@ static void test_acpi_dsdt_table(test_data *data)
/* Load all tables and add to test list directly RSDT referenced tables */
static void fetch_rsdt_referenced_tables(test_data *data)
{
- int tables_nr = data->rsdt_tables_nr - 1; /* fadt is first */
+ int tables_nr = data->rsdt_tables_nr;
int i;
for (i = 0; i < tables_nr; i++) {
AcpiSdtTable ssdt_table;
uint32_t addr;
- addr = le32_to_cpu(data->rsdt_tables_addr[i + 1]); /* fadt is first */
+ addr = le32_to_cpu(data->rsdt_tables_addr[i]);
fetch_table(&ssdt_table, addr);
/* Add table to ASL test tables list */
@@ -650,6 +679,8 @@ static void test_acpi_one(const char *params, test_data *data)
test_acpi_dsdt_table(data);
fetch_rsdt_referenced_tables(data);
+ sanitize_fadt_ptrs(data);
+
if (iasl) {
if (getenv(ACPI_REBUILD_EXPECTED_AML)) {
dump_aml_files(data, true);