Commit 77321eaf authored by Samuel Ortiz's avatar Samuel Ortiz Committed by Michael S. Tsirkin
Browse files

hw: arm: Convert the RSDP build to the buid_append_foo() API



Instead of filling a mapped and packed C structure field in random order
and being careful about endianness and sizes, build_rsdp() now uses
build_append_int_noprefix() to compose RSDP table.

This makes reviewing and maintaining code easier as this is almost
matching 1:1 the ACPI spec itself.

Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
Reviewed-by: default avatarIgor Mammedov <imammedo@redhat.com>
Reviewed-by: default avatarAndrew Jones <drjones@redhat.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 5c5fce1a
Loading
Loading
Loading
Loading
+23 −19
Original line number Diff line number Diff line
@@ -368,35 +368,39 @@ static void acpi_dsdt_add_power_button(Aml *scope)

/* RSDP */
static void
build_rsdp(GArray *rsdp_table, BIOSLinker *linker, AcpiRsdpData *rsdp_data)
build_rsdp(GArray *tbl, BIOSLinker *linker, AcpiRsdpData *rsdp_data)
{
    AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
    unsigned xsdt_pa_size = sizeof(rsdp->xsdt_physical_address);
    unsigned xsdt_pa_offset =
        (char *)&rsdp->xsdt_physical_address - rsdp_table->data;
    int tbl_off = tbl->len; /* Table offset in the RSDP file */

    bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, rsdp_table, 16,
    bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, tbl, 16,
                             true /* fseg memory */);

    memcpy(&rsdp->signature, "RSD PTR ", sizeof(rsdp->signature));
    memcpy(rsdp->oem_id, rsdp_data->oem_id, sizeof(rsdp->oem_id));
    rsdp->length = cpu_to_le32(sizeof(*rsdp));
    rsdp->revision = rsdp_data->revision;
    g_array_append_vals(tbl, "RSD PTR ", 8); /* Signature */
    build_append_int_noprefix(tbl, 0, 1); /* Checksum */
    g_array_append_vals(tbl, rsdp_data->oem_id, 6); /* OEMID */
    build_append_int_noprefix(tbl, rsdp_data->revision, 1); /* Revision */
    build_append_int_noprefix(tbl, 0, 4); /* RsdtAddress */
    build_append_int_noprefix(tbl, 36, 4); /* Length */

    /* XSDT address to be filled by guest linker */
    build_append_int_noprefix(tbl, 0, 8); /* XsdtAddress */
    bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
                                   tbl_off + 24, 8,
                                   ACPI_BUILD_TABLE_FILE,
                                   *rsdp_data->xsdt_tbl_offset);

    /* Address to be filled by Guest linker */
    bios_linker_loader_add_pointer(linker,
        ACPI_BUILD_RSDP_FILE, xsdt_pa_offset, xsdt_pa_size,
        ACPI_BUILD_TABLE_FILE, *rsdp_data->xsdt_tbl_offset);
    build_append_int_noprefix(tbl, 0, 1); /* Extended Checksum */
    build_append_int_noprefix(tbl, 0, 3); /* Reserved */

    /* Checksum to be filled by Guest linker */
    /* Checksum to be filled by guest linker */
    bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
        (char *)rsdp - rsdp_table->data, 20 /* ACPI rev 1.0 RSDP size */,
        (char *)&rsdp->checksum - rsdp_table->data);
                                    tbl_off, 20, /* ACPI rev 1.0 RSDP size */
                                    8);

    /* Extended checksum to be filled by Guest linker */
    bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
        (char *)rsdp - rsdp_table->data, 36 /* ACPI rev 2.0 RSDP size */,
        (char *)&rsdp->extended_checksum - rsdp_table->data);
                                    tbl_off, 36, /* ACPI rev 2.0 RSDP size */
                                    32);
}

static void