From 38fb3d7100b871eef3237cba2e4e1fed56d2bd1f Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Thu, 2 May 2019 16:51:49 +0200 Subject: tests: acpi: rename acpi_parse_rsdp_table() into acpi_fetch_rsdp_table() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit so name would reflect what the function does Signed-off-by: Igor Mammedov Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Wei Yang Message-Id: <1556808723-226478-2-git-send-email-imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- tests/acpi-utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/acpi-utils.c') diff --git a/tests/acpi-utils.c b/tests/acpi-utils.c index cc33b460ab..633d8f513d 100644 --- a/tests/acpi-utils.c +++ b/tests/acpi-utils.c @@ -63,7 +63,7 @@ uint64_t acpi_get_xsdt_address(uint8_t *rsdp_table) return le64_to_cpu(xsdt_physical_address); } -void acpi_parse_rsdp_table(QTestState *qts, uint32_t addr, uint8_t *rsdp_table) +void acpi_fetch_rsdp_table(QTestState *qts, uint32_t addr, uint8_t *rsdp_table) { uint8_t revision; -- cgit 1.4.1 From 4b14d543f3338985fd9c74ae6f6a6d3861c841dd Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Thu, 2 May 2019 16:51:50 +0200 Subject: tests: acpi: make acpi_fetch_table() take size of fetched table pointer Currently acpi_fetch_table() assumes 32 bit size of table pointer in ACPI tables. However X_foo variants are 64 bit, prepare acpi_fetch_table() to handle both by adding an argument for addr_ptr pointed entry size. Follow up commits will use that to read XSDT and X_foo entries in ACPI tables. Signed-off-by: Igor Mammedov Message-Id: <1556808723-226478-3-git-send-email-imammedo@redhat.com> Reviewed-by: Wei Yang Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- tests/acpi-utils.c | 10 ++++++---- tests/acpi-utils.h | 2 +- tests/bios-tables-test.c | 8 ++++---- tests/vmgenid-test.c | 4 ++-- 4 files changed, 13 insertions(+), 11 deletions(-) (limited to 'tests/acpi-utils.c') diff --git a/tests/acpi-utils.c b/tests/acpi-utils.c index 633d8f513d..644c87b5f9 100644 --- a/tests/acpi-utils.c +++ b/tests/acpi-utils.c @@ -91,13 +91,15 @@ void acpi_fetch_rsdp_table(QTestState *qts, uint32_t addr, uint8_t *rsdp_table) * actual one. */ void acpi_fetch_table(QTestState *qts, uint8_t **aml, uint32_t *aml_len, - const uint8_t *addr_ptr, const char *sig, + const uint8_t *addr_ptr, int addr_size, const char *sig, bool verify_checksum) { - uint32_t addr, len; + uint32_t len; + uint64_t addr = 0; - memcpy(&addr, addr_ptr , sizeof(addr)); - addr = le32_to_cpu(addr); + g_assert(addr_size == 4 || addr_size == 8); + memcpy(&addr, addr_ptr , addr_size); + addr = le64_to_cpu(addr); qtest_memread(qts, addr + 4, &len, 4); /* Length of ACPI table */ *aml_len = le32_to_cpu(len); *aml = g_malloc0(*aml_len); diff --git a/tests/acpi-utils.h b/tests/acpi-utils.h index a303e61f00..7c5c0be379 100644 --- a/tests/acpi-utils.h +++ b/tests/acpi-utils.h @@ -49,7 +49,7 @@ uint32_t acpi_find_rsdp_address(QTestState *qts); uint64_t acpi_get_xsdt_address(uint8_t *rsdp_table); void acpi_fetch_rsdp_table(QTestState *qts, uint32_t addr, uint8_t *rsdp_table); void acpi_fetch_table(QTestState *qts, uint8_t **aml, uint32_t *aml_len, - const uint8_t *addr_ptr, const char *sig, + const uint8_t *addr_ptr, int addr_size, const char *sig, bool verify_checksum); #endif /* TEST_ACPI_UTILS_H */ diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c index 6a678bf761..86b592c67f 100644 --- a/tests/bios-tables-test.c +++ b/tests/bios-tables-test.c @@ -114,14 +114,14 @@ static void test_acpi_rsdt_table(test_data *data) /* read RSDT table */ acpi_fetch_table(data->qts, &rsdt.aml, &rsdt.aml_len, - &data->rsdp_table[16 /* RsdtAddress */], "RSDT", true); + &data->rsdp_table[16 /* RsdtAddress */], 4, "RSDT", true); /* Load all tables and add to test list directly RSDT referenced tables */ ACPI_FOREACH_RSDT_ENTRY(rsdt.aml, rsdt.aml_len, ent, 4 /* Entry size */) { AcpiSdtTable ssdt_table = {}; acpi_fetch_table(data->qts, &ssdt_table.aml, &ssdt_table.aml_len, ent, - NULL, true); + 4, NULL, true); /* Add table to ASL test tables list */ g_array_append_val(data->tables, ssdt_table); } @@ -139,11 +139,11 @@ static void test_acpi_fadt_table(test_data *data) /* Since DSDT/FACS isn't in RSDT, add them to ASL test list manually */ acpi_fetch_table(data->qts, &table.aml, &table.aml_len, - fadt_aml + 36 /* FIRMWARE_CTRL */, "FACS", false); + fadt_aml + 36 /* FIRMWARE_CTRL */, 4, "FACS", false); g_array_append_val(data->tables, table); acpi_fetch_table(data->qts, &table.aml, &table.aml_len, - fadt_aml + 40 /* DSDT */, "DSDT", true); + fadt_aml + 40 /* DSDT */, 4, "DSDT", true); g_array_append_val(data->tables, table); memset(fadt_aml + 36, 0, 4); /* sanitize FIRMWARE_CTRL ptr */ diff --git a/tests/vmgenid-test.c b/tests/vmgenid-test.c index f400184268..85d8e6463e 100644 --- a/tests/vmgenid-test.c +++ b/tests/vmgenid-test.c @@ -42,12 +42,12 @@ static uint32_t acpi_find_vgia(QTestState *qts) acpi_fetch_rsdp_table(qts, rsdp_offset, rsdp_table); acpi_fetch_table(qts, &rsdt, &rsdt_len, &rsdp_table[16 /* RsdtAddress */], - "RSDT", true); + 4, "RSDT", true); ACPI_FOREACH_RSDT_ENTRY(rsdt, rsdt_len, ent, 4 /* Entry size */) { uint8_t *table_aml; - acpi_fetch_table(qts, &table_aml, &table_length, ent, NULL, true); + acpi_fetch_table(qts, &table_aml, &table_length, ent, 4, NULL, true); if (!memcmp(table_aml + 16 /* OEM Table ID */, "VMGENID", 7)) { uint32_t vgia_val; uint8_t *aml = &table_aml[36 /* AML byte-code start */]; -- cgit 1.4.1 From f2f616cea44018c8280795f40ce66b04a164dfa8 Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Thu, 2 May 2019 16:51:51 +0200 Subject: tests: acpi: make RSDT test routine handle XSDT If RSDP revision is more than 0 fetch table pointed by XSDT and fallback to legacy RSDT table otherwise. While at it drop unused acpi_get_xsdt_address(). Signed-off-by: Igor Mammedov Message-Id: <1556808723-226478-4-git-send-email-imammedo@redhat.com> Reviewed-by: Wei Yang Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- tests/acpi-utils.c | 12 ------------ tests/acpi-utils.h | 1 - tests/bios-tables-test.c | 20 ++++++++++++++------ 3 files changed, 14 insertions(+), 19 deletions(-) (limited to 'tests/acpi-utils.c') diff --git a/tests/acpi-utils.c b/tests/acpi-utils.c index 644c87b5f9..a0d49c4371 100644 --- a/tests/acpi-utils.c +++ b/tests/acpi-utils.c @@ -51,18 +51,6 @@ uint32_t acpi_find_rsdp_address(QTestState *qts) return off; } -uint64_t acpi_get_xsdt_address(uint8_t *rsdp_table) -{ - uint64_t xsdt_physical_address; - uint8_t revision = rsdp_table[15 /* Revision offset */]; - - /* We must have revision 2 if we're looking for an XSDT pointer */ - g_assert(revision == 2); - - memcpy(&xsdt_physical_address, &rsdp_table[24 /* XsdtAddress offset */], 8); - return le64_to_cpu(xsdt_physical_address); -} - void acpi_fetch_rsdp_table(QTestState *qts, uint32_t addr, uint8_t *rsdp_table) { uint8_t revision; diff --git a/tests/acpi-utils.h b/tests/acpi-utils.h index 7c5c0be379..a4f43a18ae 100644 --- a/tests/acpi-utils.h +++ b/tests/acpi-utils.h @@ -46,7 +46,6 @@ typedef struct { uint8_t acpi_calc_checksum(const uint8_t *data, int len); uint32_t acpi_find_rsdp_address(QTestState *qts); -uint64_t acpi_get_xsdt_address(uint8_t *rsdp_table); void acpi_fetch_rsdp_table(QTestState *qts, uint32_t addr, uint8_t *rsdp_table); void acpi_fetch_table(QTestState *qts, uint8_t **aml, uint32_t *aml_len, const uint8_t *addr_ptr, int addr_size, const char *sig, diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c index 86b592c67f..d6ab1218da 100644 --- a/tests/bios-tables-test.c +++ b/tests/bios-tables-test.c @@ -107,21 +107,29 @@ static void test_acpi_rsdp_table(test_data *data) } } -static void test_acpi_rsdt_table(test_data *data) +static void test_acpi_rxsdt_table(test_data *data) { + const char *sig = "RSDT"; AcpiSdtTable rsdt = {}; + int entry_size = 4; + int addr_off = 16 /* RsdtAddress */; uint8_t *ent; - /* read RSDT table */ + if (data->rsdp_table[15 /* Revision offset */] != 0) { + addr_off = 24 /* XsdtAddress */; + entry_size = 8; + sig = "XSDT"; + } + /* read [RX]SDT table */ acpi_fetch_table(data->qts, &rsdt.aml, &rsdt.aml_len, - &data->rsdp_table[16 /* RsdtAddress */], 4, "RSDT", true); + &data->rsdp_table[addr_off], entry_size, sig, true); /* Load all tables and add to test list directly RSDT referenced tables */ - ACPI_FOREACH_RSDT_ENTRY(rsdt.aml, rsdt.aml_len, ent, 4 /* Entry size */) { + ACPI_FOREACH_RSDT_ENTRY(rsdt.aml, rsdt.aml_len, ent, entry_size) { AcpiSdtTable ssdt_table = {}; acpi_fetch_table(data->qts, &ssdt_table.aml, &ssdt_table.aml_len, ent, - 4, NULL, true); + entry_size, NULL, true); /* Add table to ASL test tables list */ g_array_append_val(data->tables, ssdt_table); } @@ -521,7 +529,7 @@ static void test_acpi_one(const char *params, test_data *data) data->tables = g_array_new(false, true, sizeof(AcpiSdtTable)); test_acpi_rsdp_address(data); test_acpi_rsdp_table(data); - test_acpi_rsdt_table(data); + test_acpi_rxsdt_table(data); test_acpi_fadt_table(data); if (iasl) { -- cgit 1.4.1 From 9c0418852b6ed8fc677211767b11e4fdecc51a6e Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Thu, 2 May 2019 16:51:52 +0200 Subject: tests: acpi: make pointer to RSDP 64bit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case of UEFI, RSDP doesn't have to be located in lowmem, it could be placed at any address. Make sure that test won't break if it is placed above the first 4Gb of address space. PS: While at it cleanup some local variables as we don't really need them. Signed-off-by: Igor Mammedov Reviewed-by: Philippe Mathieu-Daudé Message-Id: <1556808723-226478-5-git-send-email-imammedo@redhat.com> Reviewed-by: Wei Yang Tested-by: Philippe Mathieu-Daudé Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- tests/acpi-utils.c | 2 +- tests/acpi-utils.h | 2 +- tests/bios-tables-test.c | 10 ++++------ 3 files changed, 6 insertions(+), 8 deletions(-) (limited to 'tests/acpi-utils.c') diff --git a/tests/acpi-utils.c b/tests/acpi-utils.c index a0d49c4371..c216b9e0e9 100644 --- a/tests/acpi-utils.c +++ b/tests/acpi-utils.c @@ -51,7 +51,7 @@ uint32_t acpi_find_rsdp_address(QTestState *qts) return off; } -void acpi_fetch_rsdp_table(QTestState *qts, uint32_t addr, uint8_t *rsdp_table) +void acpi_fetch_rsdp_table(QTestState *qts, uint64_t addr, uint8_t *rsdp_table) { uint8_t revision; diff --git a/tests/acpi-utils.h b/tests/acpi-utils.h index a4f43a18ae..0ceb499469 100644 --- a/tests/acpi-utils.h +++ b/tests/acpi-utils.h @@ -46,7 +46,7 @@ typedef struct { uint8_t acpi_calc_checksum(const uint8_t *data, int len); uint32_t acpi_find_rsdp_address(QTestState *qts); -void acpi_fetch_rsdp_table(QTestState *qts, uint32_t addr, uint8_t *rsdp_table); +void acpi_fetch_rsdp_table(QTestState *qts, uint64_t addr, uint8_t *rsdp_table); void acpi_fetch_table(QTestState *qts, uint8_t **aml, uint32_t *aml_len, const uint8_t *addr_ptr, int addr_size, const char *sig, bool verify_checksum); diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c index d6ab1218da..a164d274a2 100644 --- a/tests/bios-tables-test.c +++ b/tests/bios-tables-test.c @@ -26,7 +26,7 @@ typedef struct { const char *machine; const char *variant; - uint32_t rsdp_addr; + uint64_t rsdp_addr; uint8_t rsdp_table[36 /* ACPI 2.0+ RSDP size */]; GArray *tables; uint32_t smbios_ep_addr; @@ -86,13 +86,11 @@ static void test_acpi_rsdp_address(test_data *data) static void test_acpi_rsdp_table(test_data *data) { - uint8_t *rsdp_table = data->rsdp_table, revision; - uint32_t addr = data->rsdp_addr; + uint8_t *rsdp_table = data->rsdp_table; - acpi_fetch_rsdp_table(data->qts, addr, rsdp_table); - revision = rsdp_table[15 /* Revision offset */]; + acpi_fetch_rsdp_table(data->qts, data->rsdp_addr, rsdp_table); - switch (revision) { + switch (rsdp_table[15 /* Revision offset */]) { case 0: /* ACPI 1.0 RSDP */ /* With rev 1, checksum is only for the first 20 bytes */ g_assert(!acpi_calc_checksum(rsdp_table, 20)); -- cgit 1.4.1 From a37d5472b3d3ae0d8dc47ed5371c4ac505b32996 Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Thu, 2 May 2019 16:51:56 +0200 Subject: tests: acpi: add acpi_find_rsdp_address_uefi() helper introduce UEFI specific counterpart to acpi_find_rsdp_address() that will help to find RSDP address when [OA]VMF is used as firmware. It requires guest firmware or other guest app to place 1Mb aligned UefiTestSupport structure (defined in this patch) in RAM with UefiTestSupport::signature_guid set to AB87A6B1-2034-BDA0-71BD-375007757785 For test app details see commit (09a274d82f tests: introduce "uefi-test-tools" with the BiosTablesTest UEFI app) Signed-off-by: Igor Mammedov Reviewed-by: Laszlo Ersek Reviewed-by: Wei Yang Message-Id: <1556808723-226478-9-git-send-email-imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- tests/acpi-utils.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ tests/acpi-utils.h | 2 ++ 2 files changed, 46 insertions(+) (limited to 'tests/acpi-utils.c') diff --git a/tests/acpi-utils.c b/tests/acpi-utils.c index c216b9e0e9..d2a202efca 100644 --- a/tests/acpi-utils.c +++ b/tests/acpi-utils.c @@ -101,3 +101,47 @@ void acpi_fetch_table(QTestState *qts, uint8_t **aml, uint32_t *aml_len, g_assert(!acpi_calc_checksum(*aml, *aml_len)); } } + +#define GUID_SIZE 16 +static const uint8_t AcpiTestSupportGuid[GUID_SIZE] = { + 0xb1, 0xa6, 0x87, 0xab, + 0x34, 0x20, + 0xa0, 0xbd, + 0x71, 0xbd, 0x37, 0x50, 0x07, 0x75, 0x77, 0x85 }; + +typedef struct { + uint8_t signature_guid[GUID_SIZE]; + uint64_t rsdp10; + uint64_t rsdp20; +} __attribute__((packed)) UefiTestSupport; + +/* Wait at most 600 seconds (test is slow with TCG and --enable-debug) */ +#define TEST_DELAY (1 * G_USEC_PER_SEC / 10) +#define TEST_CYCLES MAX((600 * G_USEC_PER_SEC / TEST_DELAY), 1) +#define MB 0x100000ULL +uint64_t acpi_find_rsdp_address_uefi(QTestState *qts, uint64_t start, + uint64_t size) +{ + int i, j; + uint8_t data[GUID_SIZE]; + + for (i = 0; i < TEST_CYCLES; ++i) { + for (j = 0; j < size / MB; j++) { + /* look for GUID at every 1Mb block */ + uint64_t addr = start + j * MB; + + qtest_memread(qts, addr, data, sizeof(data)); + if (!memcmp(AcpiTestSupportGuid, data, sizeof(data))) { + UefiTestSupport ret; + + qtest_memread(qts, addr, &ret, sizeof(ret)); + ret.rsdp10 = le64_to_cpu(ret.rsdp10); + ret.rsdp20 = le64_to_cpu(ret.rsdp20); + return ret.rsdp20 ? ret.rsdp20 : ret.rsdp10; + } + } + g_usleep(TEST_DELAY); + } + g_assert_not_reached(); + return 0; +} diff --git a/tests/acpi-utils.h b/tests/acpi-utils.h index 0ceb499469..0c86780689 100644 --- a/tests/acpi-utils.h +++ b/tests/acpi-utils.h @@ -46,6 +46,8 @@ typedef struct { uint8_t acpi_calc_checksum(const uint8_t *data, int len); uint32_t acpi_find_rsdp_address(QTestState *qts); +uint64_t acpi_find_rsdp_address_uefi(QTestState *qts, uint64_t start, + uint64_t size); void acpi_fetch_rsdp_table(QTestState *qts, uint64_t addr, uint8_t *rsdp_table); void acpi_fetch_table(QTestState *qts, uint8_t **aml, uint32_t *aml_len, const uint8_t *addr_ptr, int addr_size, const char *sig, -- cgit 1.4.1