qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Wainer dos Santos Moschetta <wainersm@redhat.com>
To: Igor Mammedov <imammedo@redhat.com>, qemu-devel@nongnu.org
Cc: Laurent Vivier <lvivier@redhat.com>,
	Thomas Huth <thuth@redhat.com>,
	Samuel Ortiz <sameo@linux.intel.com>,
	"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 2/9] tests: acpi: use AcpiSdtTable::aml in consistent way
Date: Wed, 19 Dec 2018 17:02:36 -0200	[thread overview]
Message-ID: <1dea82d6-6bfd-8837-f1ba-b64b4f9e94ad@redhat.com> (raw)
In-Reply-To: <1544465415-207855-3-git-send-email-imammedo@redhat.com>


On 12/10/2018 04:10 PM, Igor Mammedov wrote:
> 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 <imammedo@redhat.com>
> ---
>   tests/acpi-utils.h       |  6 +++--
>   tests/bios-tables-test.c | 59 +++++++++++++++++-------------------------------
>   2 files changed, 25 insertions(+), 40 deletions(-)
>
> diff --git a/tests/acpi-utils.h b/tests/acpi-utils.h
> index c8844a2..2244e8e 100644
> --- a/tests/acpi-utils.h
> +++ b/tests/acpi-utils.h
> @@ -18,8 +18,10 @@
>   
>   /* 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 8749b77..1666cf7 100644
> --- a/tests/bios-tables-test.c
> +++ b/tests/bios-tables-test.c
> @@ -161,29 +161,24 @@ static void sanitize_fadt_ptrs(test_data *data)
>       for (i = 0; i < data->tables->len; i++) {
>           AcpiSdtTable *sdt = &g_array_index(data->tables, AcpiSdtTable, i);
>   
> -        if (memcmp(&sdt->header.signature, "FACP", 4)) {
> +        if (memcmp(&sdt->header->signature, "FACP", 4)) {
>               continue;
>           }
>   
>           /* 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((uint8_t *)sdt->aml, sdt->aml_len));

Being uint8_t * aml, does it still need that cast to uint8_t?

>   
>           /* sdt->aml field offset := spec offset - header size */

Need to change ^ comment too since offset is not relative to header 
length anymore.


- Wainer

> -        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 */
> +        memset(sdt->aml + 36, 0, 4); /* sanitize FIRMWARE_CTRL ptr */
> +        memset(sdt->aml + 40, 0, 4); /* sanitize DSDT ptr */
> +        if (sdt->header->revision >= 3) {
> +            memset(sdt->aml + 132, 0, 8); /* sanitize X_FIRMWARE_CTRL ptr */
> +            memset(sdt->aml + 140, 0, 8); /* sanitize X_DSDT 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);
> +        sdt->header->checksum = 0;
> +        sdt->header->checksum -= acpi_calc_checksum(sdt->aml, sdt->aml_len);
>           break;
>       }
>   }
> @@ -210,30 +205,21 @@ static void test_acpi_facs_table(test_data *data)
>    */
>   static void fetch_table(AcpiSdtTable *sdt_table, uint32_t addr)
>   {
> -    uint8_t checksum;
> -
> -    memset(sdt_table, 0, sizeof(*sdt_table));
> -    ACPI_READ_TABLE_HEADER(&sdt_table->header, addr);
> -
> -    sdt_table->aml_len = le32_to_cpu(sdt_table->header.length)
> -                         - sizeof(AcpiTableHeader);
> +    memread(addr + 4, &sdt_table->aml_len, 4); /* Length of ACPI table */
> +    sdt_table->aml_len = le32_to_cpu(sdt_table->aml_len);
>       sdt_table->aml = g_malloc0(sdt_table->aml_len);
> -    ACPI_READ_ARRAY_PTR(sdt_table->aml, sdt_table->aml_len, addr);
> +    memread(addr, sdt_table->aml, sdt_table->aml_len); /* get whole table */
>   
> -    checksum = 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));
>   }
>   
>   static void test_acpi_dsdt_table(test_data *data)
>   {
> -    AcpiSdtTable dsdt_table;
> +    AcpiSdtTable dsdt_table = {};
>       uint32_t addr = le32_to_cpu(data->dsdt_addr);
>   
>       fetch_table(&dsdt_table, addr);
> -    ACPI_ASSERT_CMP(dsdt_table.header.signature, "DSDT");
> +    ACPI_ASSERT_CMP(dsdt_table.header->signature, "DSDT");
>   
>       /* Since DSDT isn't in RSDT, add DSDT to ASL test tables list manually */
>       g_array_append_val(data->tables, dsdt_table);
> @@ -246,7 +232,7 @@ static void fetch_rsdt_referenced_tables(test_data *data)
>       int i;
>   
>       for (i = 0; i < tables_nr; i++) {
> -        AcpiSdtTable ssdt_table;
> +        AcpiSdtTable ssdt_table = {};
>           uint32_t addr;
>   
>           addr = le32_to_cpu(data->rsdt_tables_addr[i]);
> @@ -273,7 +259,7 @@ static void dump_aml_files(test_data *data, bool rebuild)
>   
>           if (rebuild) {
>               aml_file = g_strdup_printf("%s/%s/%.4s%s", data_dir, data->machine,
> -                                       (gchar *)&sdt->header.signature, ext);
> +                                       (gchar *)&sdt->header->signature, ext);
>               fd = g_open(aml_file, O_WRONLY|O_TRUNC|O_CREAT,
>                           S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
>           } else {
> @@ -282,8 +268,6 @@ static void dump_aml_files(test_data *data, bool rebuild)
>           }
>           g_assert(fd >= 0);
>   
> -        ret = qemu_write_full(fd, sdt, sizeof(AcpiTableHeader));
> -        g_assert(ret == sizeof(AcpiTableHeader));
>           ret = qemu_write_full(fd, sdt->aml, sdt->aml_len);
>           g_assert(ret == sdt->aml_len);
>   
> @@ -295,7 +279,7 @@ static void dump_aml_files(test_data *data, bool rebuild)
>   
>   static bool compare_signature(AcpiSdtTable *sdt, const char *signature)
>   {
> -   return !memcmp(&sdt->header.signature, signature, 4);
> +   return !memcmp(&sdt->header->signature, signature, 4);
>   }
>   
>   static bool load_asl(GArray *sdts, AcpiSdtTable *sdt)
> @@ -390,11 +374,10 @@ static GArray *load_expected_aml(test_data *data)
>           sdt = &g_array_index(data->tables, AcpiSdtTable, i);
>   
>           memset(&exp_sdt, 0, sizeof(exp_sdt));
> -        exp_sdt.header.signature = sdt->header.signature;
>   
>   try_again:
>           aml_file = g_strdup_printf("%s/%s/%.4s%s", data_dir, data->machine,
> -                                   (gchar *)&sdt->header.signature, ext);
> +                                   (gchar *)&sdt->header->signature, ext);
>           if (getenv("V")) {
>               fprintf(stderr, "\nLooking for expected file '%s'\n", aml_file);
>           }
> @@ -410,7 +393,7 @@ try_again:
>           if (getenv("V")) {
>               fprintf(stderr, "\nUsing expected file '%s'\n", aml_file);
>           }
> -        ret = g_file_get_contents(aml_file, &exp_sdt.aml,
> +        ret = g_file_get_contents(aml_file, (gchar **)&exp_sdt.aml,
>                                     &exp_sdt.aml_len, &error);
>           g_assert(ret);
>           g_assert_no_error(error);
> @@ -454,7 +437,7 @@ static void test_acpi_asl(test_data *data)
>                   fprintf(stderr,
>                           "Warning! iasl couldn't parse the expected aml\n");
>               } else {
> -                uint32_t signature = cpu_to_le32(exp_sdt->header.signature);
> +                uint32_t signature = cpu_to_le32(exp_sdt->header->signature);
>                   sdt->tmp_files_retain = true;
>                   exp_sdt->tmp_files_retain = true;
>                   fprintf(stderr,

  reply	other threads:[~2018-12-19 19:02 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-10 18:10 [Qemu-devel] [PATCH 0/9] tests: apci: consolidate and cleanup ACPI test code Igor Mammedov
2018-12-10 18:10 ` [Qemu-devel] [PATCH 1/9] tests: acpi: remove not used ACPI_READ_GENERIC_ADDRESS macro Igor Mammedov
2018-12-10 18:26   ` Philippe Mathieu-Daudé
2018-12-10 18:10 ` [Qemu-devel] [PATCH 2/9] tests: acpi: use AcpiSdtTable::aml in consistent way Igor Mammedov
2018-12-19 19:02   ` Wainer dos Santos Moschetta [this message]
2018-12-20 12:09     ` Igor Mammedov
2018-12-10 18:10 ` [Qemu-devel] [PATCH 3/9] tests: acpi: make sure FADT is fetched only once Igor Mammedov
2018-12-10 18:10 ` [Qemu-devel] [PATCH 4/9] tests: acpi: simplify rsdt handling Igor Mammedov
2018-12-10 18:10 ` [Qemu-devel] [PATCH 5/9] tests: acpi: reuse fetch_table() for fetching FACS and DSDT Igor Mammedov
2018-12-10 18:10 ` [Qemu-devel] [PATCH 6/9] tests: acpi: reuse fetch_table() in vmgenid-test Igor Mammedov
2018-12-10 18:10 ` [Qemu-devel] [PATCH 7/9] tests: smbios: fetch whole table in one step instead of reading it step by step Igor Mammedov
2018-12-10 18:10 ` [Qemu-devel] [PATCH 8/9] tests: acpi: squash sanitize_fadt_ptrs() into test_acpi_fadt_table() Igor Mammedov
2018-12-10 18:10 ` [Qemu-devel] [PATCH 9/9] tests: acpi: use AcpiSdtTable::aml instead of AcpiSdtTable::header::signature Igor Mammedov
2018-12-19 16:38 ` [Qemu-devel] [PATCH 0/9] tests: apci: consolidate and cleanup ACPI test code Michael S. Tsirkin
2018-12-19 16:45   ` Daniel P. Berrangé
2018-12-19 16:56     ` Michael S. Tsirkin
2018-12-20 12:14   ` Igor Mammedov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1dea82d6-6bfd-8837-f1ba-b64b4f9e94ad@redhat.com \
    --to=wainersm@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=sameo@linux.intel.com \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).