* [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names @ 2017-04-10 15:03 Ard Biesheuvel 2017-04-10 15:03 ` [Qemu-devel] [PATCH v3 2/2] hw/arm/virt: generate 64-bit addressable ACPI objects Ard Biesheuvel 2017-04-10 15:28 ` [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names Laszlo Ersek 0 siblings, 2 replies; 5+ messages in thread From: Ard Biesheuvel @ 2017-04-10 15:03 UTC (permalink / raw) To: qemu-devel, peter.maydell, lersek Cc: phil, mst, imammedo, drjones, zhaoshenglong, Ard Biesheuvel At the request of Michael, replace the leading capital X in the FADT field name Xfacs and Xdsdt with lower case x + underscore. Cc: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- include/hw/acpi/acpi-defs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h index 4cc3630e613e..db48807056b3 100644 --- a/include/hw/acpi/acpi-defs.h +++ b/include/hw/acpi/acpi-defs.h @@ -165,8 +165,8 @@ struct AcpiFadtDescriptorRev5_1 { /* ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */ uint16_t arm_boot_flags; uint8_t minor_revision; /* FADT Minor Revision (ACPI 5.1) */ - uint64_t Xfacs; /* 64-bit physical address of FACS */ - uint64_t Xdsdt; /* 64-bit physical address of DSDT */ + uint64_t x_facs; /* 64-bit physical address of FACS */ + uint64_t x_dsdt; /* 64-bit physical address of DSDT */ /* 64-bit Extended Power Mgt 1a Event Reg Blk address */ struct AcpiGenericAddress xpm1a_event_block; /* 64-bit Extended Power Mgt 1b Event Reg Blk address */ -- 2.9.3 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH v3 2/2] hw/arm/virt: generate 64-bit addressable ACPI objects 2017-04-10 15:03 [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names Ard Biesheuvel @ 2017-04-10 15:03 ` Ard Biesheuvel 2017-04-20 13:27 ` Peter Maydell 2017-04-10 15:28 ` [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names Laszlo Ersek 1 sibling, 1 reply; 5+ messages in thread From: Ard Biesheuvel @ 2017-04-10 15:03 UTC (permalink / raw) To: qemu-devel, peter.maydell, lersek Cc: phil, mst, imammedo, drjones, zhaoshenglong, Ard Biesheuvel Our current ACPI table generation code limits the placement of ACPI tables to 32-bit addressable memory, in order to be able to emit the root pointer (RSDP) and root table (RSDT) using table types from the ACPI 1.0 days. Since ARM was not supported by ACPI before version 5.0, it makes sense to lift this restriction. This is not crucial for mach-virt, which is guaranteed to have some memory available below the 4 GB mark, but it is a nice to have for QEMU machines that do not have any 32-bit addressable memory, which is not uncommon for real world 64-bit ARM systems. Since we already emit a version of the RSDP root pointer that has a secondary 64-bit wide address field for the 64-bit root table (XSDT), all we need to do is replace the RSDT generation with the generation of an XSDT table, and use a different slot in the FADT table to refer to the DSDT. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Andrew Jones <drjones@redhat.com> Acked-by: Laszlo Ersek <lersek@redhat.com> --- hw/acpi/aml-build.c | 27 ++++++++++++++++++++ hw/arm/virt-acpi-build.c | 26 +++++++++---------- include/hw/acpi/acpi-defs.h | 11 ++++++++ include/hw/acpi/aml-build.h | 3 +++ 4 files changed, 54 insertions(+), 13 deletions(-) diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index c6f2032decb1..4ddfb68b247f 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -1599,6 +1599,33 @@ build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, (void *)rsdt, "RSDT", rsdt_len, 1, oem_id, oem_table_id); } +/* Build xsdt table */ +void +build_xsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, + const char *oem_id, const char *oem_table_id) +{ + int i; + unsigned xsdt_entries_offset; + AcpiXsdtDescriptorRev2 *xsdt; + const unsigned table_data_len = (sizeof(uint64_t) * table_offsets->len); + const unsigned xsdt_entry_size = sizeof(xsdt->table_offset_entry[0]); + const size_t xsdt_len = sizeof(*xsdt) + table_data_len; + + xsdt = acpi_data_push(table_data, xsdt_len); + xsdt_entries_offset = (char *)xsdt->table_offset_entry - table_data->data; + for (i = 0; i < table_offsets->len; ++i) { + uint64_t ref_tbl_offset = g_array_index(table_offsets, uint32_t, i); + uint64_t xsdt_entry_offset = xsdt_entries_offset + xsdt_entry_size * i; + + /* xsdt->table_offset_entry to be filled by Guest linker */ + bios_linker_loader_add_pointer(linker, + ACPI_BUILD_TABLE_FILE, xsdt_entry_offset, xsdt_entry_size, + ACPI_BUILD_TABLE_FILE, ref_tbl_offset); + } + build_header(linker, table_data, + (void *)xsdt, "XSDT", xsdt_len, 1, oem_id, oem_table_id); +} + void build_srat_memory(AcpiSratMemoryAffinity *numamem, uint64_t base, uint64_t len, int node, MemoryAffinityFlags flags) { diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index b173bd109b91..711f18399d8f 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -391,12 +391,12 @@ static void acpi_dsdt_add_power_button(Aml *scope) /* RSDP */ static GArray * -build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset) +build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned xsdt_tbl_offset) { AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp); - unsigned rsdt_pa_size = sizeof(rsdp->rsdt_physical_address); - unsigned rsdt_pa_offset = - (char *)&rsdp->rsdt_physical_address - rsdp_table->data; + unsigned xsdt_pa_size = sizeof(rsdp->xsdt_physical_address); + unsigned xsdt_pa_offset = + (char *)&rsdp->xsdt_physical_address - rsdp_table->data; bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, rsdp_table, 16, true /* fseg memory */); @@ -408,8 +408,8 @@ build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset) /* Address to be filled by Guest linker */ bios_linker_loader_add_pointer(linker, - ACPI_BUILD_RSDP_FILE, rsdt_pa_offset, rsdt_pa_size, - ACPI_BUILD_TABLE_FILE, rsdt_tbl_offset); + ACPI_BUILD_RSDP_FILE, xsdt_pa_offset, xsdt_pa_size, + ACPI_BUILD_TABLE_FILE, xsdt_tbl_offset); /* Checksum to be filled by Guest linker */ bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE, @@ -686,7 +686,7 @@ static void build_fadt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms, unsigned dsdt_tbl_offset) { AcpiFadtDescriptorRev5_1 *fadt = acpi_data_push(table_data, sizeof(*fadt)); - unsigned dsdt_entry_offset = (char *)&fadt->dsdt - table_data->data; + unsigned xdsdt_entry_offset = (char *)&fadt->x_dsdt - table_data->data; uint16_t bootflags; switch (vms->psci_conduit) { @@ -712,7 +712,7 @@ static void build_fadt(GArray *table_data, BIOSLinker *linker, /* DSDT address to be filled by Guest linker */ bios_linker_loader_add_pointer(linker, - ACPI_BUILD_TABLE_FILE, dsdt_entry_offset, sizeof(fadt->dsdt), + ACPI_BUILD_TABLE_FILE, xdsdt_entry_offset, sizeof(fadt->x_dsdt), ACPI_BUILD_TABLE_FILE, dsdt_tbl_offset); build_header(linker, table_data, @@ -777,7 +777,7 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables) { VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms); GArray *table_offsets; - unsigned dsdt, rsdt; + unsigned dsdt, xsdt; GArray *tables_blob = tables->table_data; table_offsets = g_array_new(false, true /* clear */, @@ -817,12 +817,12 @@ void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables) build_iort(tables_blob, tables->linker); } - /* RSDT is pointed to by RSDP */ - rsdt = tables_blob->len; - build_rsdt(tables_blob, tables->linker, table_offsets, NULL, NULL); + /* XSDT is pointed to by RSDP */ + xsdt = tables_blob->len; + build_xsdt(tables_blob, tables->linker, table_offsets, NULL, NULL); /* RSDP is in FSEG memory, so allocate it separately */ - build_rsdp(tables->rsdp, tables->linker, rsdt); + build_rsdp(tables->rsdp, tables->linker, xsdt); /* Cleanup memory that's no longer used. */ g_array_free(table_offsets, true); diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h index db48807056b3..dff6d4fec8fc 100644 --- a/include/hw/acpi/acpi-defs.h +++ b/include/hw/acpi/acpi-defs.h @@ -238,6 +238,17 @@ struct AcpiRsdtDescriptorRev1 typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1; /* + * ACPI 2.0 eXtended System Description Table (XSDT) + */ +struct AcpiXsdtDescriptorRev2 +{ + ACPI_TABLE_HEADER_DEF /* ACPI common table header */ + uint64_t table_offset_entry[0]; /* Array of pointers to other */ + /* ACPI tables */ +} QEMU_PACKED; +typedef struct AcpiXsdtDescriptorRev2 AcpiXsdtDescriptorRev2; + +/* * ACPI 1.0 Firmware ACPI Control Structure (FACS) */ struct AcpiFacsDescriptorRev1 diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h index 00c21f160c19..eb07c2d43c99 100644 --- a/include/hw/acpi/aml-build.h +++ b/include/hw/acpi/aml-build.h @@ -381,6 +381,9 @@ void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre); void build_rsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, const char *oem_id, const char *oem_table_id); +void +build_xsdt(GArray *table_data, BIOSLinker *linker, GArray *table_offsets, + const char *oem_id, const char *oem_table_id); int build_append_named_dword(GArray *array, const char *name_format, ...) -- 2.9.3 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/2] hw/arm/virt: generate 64-bit addressable ACPI objects 2017-04-10 15:03 ` [Qemu-devel] [PATCH v3 2/2] hw/arm/virt: generate 64-bit addressable ACPI objects Ard Biesheuvel @ 2017-04-20 13:27 ` Peter Maydell 0 siblings, 0 replies; 5+ messages in thread From: Peter Maydell @ 2017-04-20 13:27 UTC (permalink / raw) To: Ard Biesheuvel Cc: QEMU Developers, Laszlo Ersek, phil, Michael S. Tsirkin, Igor Mammedov, Andrew Jones, Shannon Zhao On 10 April 2017 at 16:03, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote: > Our current ACPI table generation code limits the placement of ACPI > tables to 32-bit addressable memory, in order to be able to emit the > root pointer (RSDP) and root table (RSDT) using table types from the > ACPI 1.0 days. > > Since ARM was not supported by ACPI before version 5.0, it makes sense > to lift this restriction. This is not crucial for mach-virt, which is > guaranteed to have some memory available below the 4 GB mark, but it > is a nice to have for QEMU machines that do not have any 32-bit > addressable memory, which is not uncommon for real world 64-bit ARM > systems. > > Since we already emit a version of the RSDP root pointer that has a > secondary 64-bit wide address field for the 64-bit root table (XSDT), > all we need to do is replace the RSDT generation with the generation > of an XSDT table, and use a different slot in the FADT table to refer > to the DSDT. > > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > Reviewed-by: Andrew Jones <drjones@redhat.com> > Acked-by: Laszlo Ersek <lersek@redhat.com> Michael -- I'm assuming you're planning to take these 2 patches via the ACPI tree; let me know if you'd rather I take them via the ARM tree. Acked-by: Peter Maydell <peter.maydell@linaro.org> thanks -- PMM ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names 2017-04-10 15:03 [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names Ard Biesheuvel 2017-04-10 15:03 ` [Qemu-devel] [PATCH v3 2/2] hw/arm/virt: generate 64-bit addressable ACPI objects Ard Biesheuvel @ 2017-04-10 15:28 ` Laszlo Ersek 2017-04-10 20:21 ` Michael S. Tsirkin 1 sibling, 1 reply; 5+ messages in thread From: Laszlo Ersek @ 2017-04-10 15:28 UTC (permalink / raw) To: Ard Biesheuvel, qemu-devel, peter.maydell Cc: phil, mst, imammedo, drjones, zhaoshenglong On 04/10/17 17:03, Ard Biesheuvel wrote: > At the request of Michael, replace the leading capital X in the FADT > field name Xfacs and Xdsdt with lower case x + underscore. > > Cc: Michael S. Tsirkin <mst@redhat.com> > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > --- > include/hw/acpi/acpi-defs.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h > index 4cc3630e613e..db48807056b3 100644 > --- a/include/hw/acpi/acpi-defs.h > +++ b/include/hw/acpi/acpi-defs.h > @@ -165,8 +165,8 @@ struct AcpiFadtDescriptorRev5_1 { > /* ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */ > uint16_t arm_boot_flags; > uint8_t minor_revision; /* FADT Minor Revision (ACPI 5.1) */ > - uint64_t Xfacs; /* 64-bit physical address of FACS */ > - uint64_t Xdsdt; /* 64-bit physical address of DSDT */ > + uint64_t x_facs; /* 64-bit physical address of FACS */ > + uint64_t x_dsdt; /* 64-bit physical address of DSDT */ > /* 64-bit Extended Power Mgt 1a Event Reg Blk address */ > struct AcpiGenericAddress xpm1a_event_block; > /* 64-bit Extended Power Mgt 1b Event Reg Blk address */ > (This is for 2.10, or whatever comes after 2.9.) Reviewed-by: Laszlo Ersek <lersek@redhat.com> ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names 2017-04-10 15:28 ` [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names Laszlo Ersek @ 2017-04-10 20:21 ` Michael S. Tsirkin 0 siblings, 0 replies; 5+ messages in thread From: Michael S. Tsirkin @ 2017-04-10 20:21 UTC (permalink / raw) To: Laszlo Ersek Cc: Ard Biesheuvel, qemu-devel, peter.maydell, phil, imammedo, drjones, zhaoshenglong On Mon, Apr 10, 2017 at 05:28:44PM +0200, Laszlo Ersek wrote: > On 04/10/17 17:03, Ard Biesheuvel wrote: > > At the request of Michael, replace the leading capital X in the FADT > > field name Xfacs and Xdsdt with lower case x + underscore. > > > > Cc: Michael S. Tsirkin <mst@redhat.com> > > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> > > --- > > include/hw/acpi/acpi-defs.h | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h > > index 4cc3630e613e..db48807056b3 100644 > > --- a/include/hw/acpi/acpi-defs.h > > +++ b/include/hw/acpi/acpi-defs.h > > @@ -165,8 +165,8 @@ struct AcpiFadtDescriptorRev5_1 { > > /* ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */ > > uint16_t arm_boot_flags; > > uint8_t minor_revision; /* FADT Minor Revision (ACPI 5.1) */ > > - uint64_t Xfacs; /* 64-bit physical address of FACS */ > > - uint64_t Xdsdt; /* 64-bit physical address of DSDT */ > > + uint64_t x_facs; /* 64-bit physical address of FACS */ > > + uint64_t x_dsdt; /* 64-bit physical address of DSDT */ > > /* 64-bit Extended Power Mgt 1a Event Reg Blk address */ > > struct AcpiGenericAddress xpm1a_event_block; > > /* 64-bit Extended Power Mgt 1b Event Reg Blk address */ > > > > (This is for 2.10, or whatever comes after 2.9.) > > Reviewed-by: Laszlo Ersek <lersek@redhat.com> Thanks, pls remember to repost after 2.9 is out. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-04-20 13:27 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-04-10 15:03 [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names Ard Biesheuvel 2017-04-10 15:03 ` [Qemu-devel] [PATCH v3 2/2] hw/arm/virt: generate 64-bit addressable ACPI objects Ard Biesheuvel 2017-04-20 13:27 ` Peter Maydell 2017-04-10 15:28 ` [Qemu-devel] [PATCH v3 1/2] hw/acpi-defs: replace leading X with x_ in FADT field names Laszlo Ersek 2017-04-10 20:21 ` Michael S. Tsirkin
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.