* [Qemu-devel] [PATCH 0/4] acpi: xsdt support
@ 2015-06-04 16:21 Michael S. Tsirkin
2015-06-04 16:21 ` [Qemu-devel] [PATCH 1/4] acpi: add API for 64 bit offsets Michael S. Tsirkin
` (4 more replies)
0 siblings, 5 replies; 16+ messages in thread
From: Michael S. Tsirkin @ 2015-06-04 16:21 UTC (permalink / raw)
To: qemu-devel; +Cc: ghammer, pbonzini, lersek, shannon.zhao, imammedo
XSDT support allows using ACPI 2 features while
avoiding breaking legacy windows XP guests:
ACPI 2 tables are linked from XSDT only,
ACPI 1 tables from both RSDT and XSDT, this way
XP does not see ACPI 2 tables.
As a first step, this patchset generates v2 RSDP
and fills in XSDT matching RSDT exactly.
ARM patch is untested: I don't know how to test ARM ACPI.
Testing reports would be greatly appreciated.
Michael S. Tsirkin (4):
acpi: add API for 64 bit offsets
i386/acpi: collect 64 bit offsets for xsdt
i386/acpi: add XSDT
acpi: unify rsdp generation
include/hw/acpi/acpi-defs.h | 15 +++++--
include/hw/acpi/aml-build.h | 7 +++-
hw/acpi/aml-build.c | 99 +++++++++++++++++++++++++++++++++++++--------
hw/arm/virt-acpi-build.c | 39 +++---------------
hw/i386/acpi-build.c | 64 +++++++++++------------------
5 files changed, 129 insertions(+), 95 deletions(-)
--
MST
^ permalink raw reply [flat|nested] 16+ messages in thread
* [Qemu-devel] [PATCH 1/4] acpi: add API for 64 bit offsets
2015-06-04 16:21 [Qemu-devel] [PATCH 0/4] acpi: xsdt support Michael S. Tsirkin
@ 2015-06-04 16:21 ` Michael S. Tsirkin
2015-06-05 2:38 ` Shannon Zhao
2015-06-04 16:21 ` [Qemu-devel] [PATCH 2/4] i386/acpi: collect 64 bit offsets for xsdt Michael S. Tsirkin
` (3 subsequent siblings)
4 siblings, 1 reply; 16+ messages in thread
From: Michael S. Tsirkin @ 2015-06-04 16:21 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Maydell, Eduardo Habkost, ghammer, shannon.zhao, imammedo,
pbonzini, lersek, Richard Henderson
Collecting these is useful for implementing the XSDT.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
include/hw/acpi/aml-build.h | 3 ++-
hw/acpi/aml-build.c | 13 ++++++++++---
hw/arm/virt-acpi-build.c | 8 ++++----
hw/i386/acpi-build.c | 20 ++++++++++----------
4 files changed, 26 insertions(+), 18 deletions(-)
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index e3afa13..edc1dfa 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -281,7 +281,8 @@ build_header(GArray *linker, GArray *table_data,
AcpiTableHeader *h, const char *sig, int len, uint8_t rev);
void *acpi_data_push(GArray *table_data, unsigned size);
unsigned acpi_data_len(GArray *table);
-void acpi_add_table(GArray *table_offsets, GArray *table_data);
+void acpi_add_table(GArray *table_offsets32, GArray *table_offsets64,
+ GArray *table_data);
void acpi_build_tables_init(AcpiBuildTables *tables);
void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre);
void
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 0d4b324..4c930b6 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1169,10 +1169,17 @@ unsigned acpi_data_len(GArray *table)
return table->len;
}
-void acpi_add_table(GArray *table_offsets, GArray *table_data)
+void acpi_add_table(GArray *table_offsets32, GArray *table_offsets64,
+ GArray *table_data)
{
- uint32_t offset = cpu_to_le32(table_data->len);
- g_array_append_val(table_offsets, offset);
+ uint32_t offset32 = cpu_to_le32(table_data->len);
+ uint64_t offset64 = cpu_to_le64(table_data->len);
+ if (table_offsets32) {
+ g_array_append_val(table_offsets32, offset32);
+ }
+ if (table_offsets64) {
+ g_array_append_val(table_offsets64, offset64);
+ }
}
void acpi_build_tables_init(AcpiBuildTables *tables)
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index a9373cc..42c8dd9 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -515,16 +515,16 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables)
build_dsdt(tables_blob, tables->linker, guest_info);
/* FADT MADT GTDT pointed to by RSDT */
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_fadt(tables_blob, tables->linker, dsdt);
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_madt(tables_blob, tables->linker, guest_info, &cpuinfo);
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_gtdt(tables_blob, tables->linker);
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_mcfg(tables_blob, tables->linker, guest_info);
/* RSDT is pointed to by RSDP */
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index db32fd1..e5b0b7a 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1706,27 +1706,27 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
aml_len += tables_blob->len - dsdt;
/* ACPI tables pointed to by RSDT */
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_fadt(tables_blob, tables->linker, &pm, facs, dsdt);
ssdt = tables_blob->len;
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_ssdt(tables_blob, tables->linker, &cpu, &pm, &misc, &pci,
guest_info);
aml_len += tables_blob->len - ssdt;
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_madt(tables_blob, tables->linker, &cpu, guest_info);
if (misc.has_hpet) {
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_hpet(tables_blob, tables->linker);
}
if (misc.tpm_version != TPM_VERSION_UNSPEC) {
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_tpm_tcpa(tables_blob, tables->linker, tables->tcpalog);
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
switch (misc.tpm_version) {
case TPM_VERSION_1_2:
build_tpm_ssdt(tables_blob, tables->linker);
@@ -1739,15 +1739,15 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
}
}
if (guest_info->numa_nodes) {
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_srat(tables_blob, tables->linker, guest_info);
}
if (acpi_get_mcfg(&mcfg)) {
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_mcfg_q35(tables_blob, tables->linker, &mcfg);
}
if (acpi_has_iommu()) {
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
build_dmar_q35(tables_blob, tables->linker);
}
@@ -1755,7 +1755,7 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
for (u = acpi_table_first(); u; u = acpi_table_next(u)) {
unsigned len = acpi_table_len(u);
- acpi_add_table(table_offsets, tables_blob);
+ acpi_add_table(table_offsets, NULL, tables_blob);
g_array_append_vals(tables_blob, u, len);
}
--
MST
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [Qemu-devel] [PATCH 2/4] i386/acpi: collect 64 bit offsets for xsdt
2015-06-04 16:21 [Qemu-devel] [PATCH 0/4] acpi: xsdt support Michael S. Tsirkin
2015-06-04 16:21 ` [Qemu-devel] [PATCH 1/4] acpi: add API for 64 bit offsets Michael S. Tsirkin
@ 2015-06-04 16:21 ` Michael S. Tsirkin
2015-06-04 16:21 ` [Qemu-devel] [PATCH 3/4] i386/acpi: add XSDT Michael S. Tsirkin
` (2 subsequent siblings)
4 siblings, 0 replies; 16+ messages in thread
From: Michael S. Tsirkin @ 2015-06-04 16:21 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, ghammer, shannon.zhao, imammedo, pbonzini,
lersek, Richard Henderson
collect then discard, they are unused for now.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/i386/acpi-build.c | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index e5b0b7a..aaa149b 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1663,7 +1663,8 @@ static bool acpi_has_iommu(void)
static
void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
{
- GArray *table_offsets;
+ GArray *rsdt_table_offsets;
+ GArray *xsdt_table_offsets;
unsigned facs, ssdt, dsdt, rsdt;
AcpiCpuInfo cpu;
AcpiPmInfo pm;
@@ -1680,8 +1681,10 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
acpi_get_misc_info(&misc);
acpi_get_pci_info(&pci);
- table_offsets = g_array_new(false, true /* clear */,
+ rsdt_table_offsets = g_array_new(false, true /* clear */,
sizeof(uint32_t));
+ xsdt_table_offsets = g_array_new(false, true /* clear */,
+ sizeof(uint64_t));
ACPI_BUILD_DPRINTF("init ACPI tables\n");
bios_linker_loader_alloc(tables->linker, ACPI_BUILD_TABLE_FILE,
@@ -1706,27 +1709,27 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
aml_len += tables_blob->len - dsdt;
/* ACPI tables pointed to by RSDT */
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
build_fadt(tables_blob, tables->linker, &pm, facs, dsdt);
ssdt = tables_blob->len;
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
build_ssdt(tables_blob, tables->linker, &cpu, &pm, &misc, &pci,
guest_info);
aml_len += tables_blob->len - ssdt;
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
build_madt(tables_blob, tables->linker, &cpu, guest_info);
if (misc.has_hpet) {
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
build_hpet(tables_blob, tables->linker);
}
if (misc.tpm_version != TPM_VERSION_UNSPEC) {
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
build_tpm_tcpa(tables_blob, tables->linker, tables->tcpalog);
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
switch (misc.tpm_version) {
case TPM_VERSION_1_2:
build_tpm_ssdt(tables_blob, tables->linker);
@@ -1739,15 +1742,15 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
}
}
if (guest_info->numa_nodes) {
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
build_srat(tables_blob, tables->linker, guest_info);
}
if (acpi_get_mcfg(&mcfg)) {
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
build_mcfg_q35(tables_blob, tables->linker, &mcfg);
}
if (acpi_has_iommu()) {
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
build_dmar_q35(tables_blob, tables->linker);
}
@@ -1755,13 +1758,13 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
for (u = acpi_table_first(); u; u = acpi_table_next(u)) {
unsigned len = acpi_table_len(u);
- acpi_add_table(table_offsets, NULL, tables_blob);
+ acpi_add_table(rsdt_table_offsets, xsdt_table_offsets, tables_blob);
g_array_append_vals(tables_blob, u, len);
}
/* RSDT is pointed to by RSDP */
rsdt = tables_blob->len;
- build_rsdt(tables_blob, tables->linker, table_offsets);
+ build_rsdt(tables_blob, tables->linker, rsdt_table_offsets);
/* RSDP is in FSEG memory, so allocate it separately */
build_rsdp(tables->rsdp, tables->linker, rsdt);
@@ -1813,7 +1816,8 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
acpi_align_size(tables->linker, ACPI_BUILD_ALIGN_SIZE);
/* Cleanup memory that's no longer used. */
- g_array_free(table_offsets, true);
+ g_array_free(xsdt_table_offsets, true);
+ g_array_free(rsdt_table_offsets, true);
}
static void acpi_ram_update(MemoryRegion *mr, GArray *data)
--
MST
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [Qemu-devel] [PATCH 3/4] i386/acpi: add XSDT
2015-06-04 16:21 [Qemu-devel] [PATCH 0/4] acpi: xsdt support Michael S. Tsirkin
2015-06-04 16:21 ` [Qemu-devel] [PATCH 1/4] acpi: add API for 64 bit offsets Michael S. Tsirkin
2015-06-04 16:21 ` [Qemu-devel] [PATCH 2/4] i386/acpi: collect 64 bit offsets for xsdt Michael S. Tsirkin
@ 2015-06-04 16:21 ` Michael S. Tsirkin
2015-06-05 2:38 ` Shannon Zhao
2015-06-04 16:21 ` [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation Michael S. Tsirkin
2015-06-05 2:48 ` [Qemu-devel] [PATCH 0/4] acpi: xsdt support Shannon Zhao
4 siblings, 1 reply; 16+ messages in thread
From: Michael S. Tsirkin @ 2015-06-04 16:21 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, ghammer, shannon.zhao, imammedo, pbonzini,
lersek, Richard Henderson
At the moment it mirrors RSDT exactly.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
include/hw/acpi/acpi-defs.h | 15 ++++++++++++---
include/hw/acpi/aml-build.h | 2 ++
hw/acpi/aml-build.c | 41 ++++++++++++++++++++++++++++-------------
hw/i386/acpi-build.c | 29 ++++++++++++++++++++++++-----
4 files changed, 66 insertions(+), 21 deletions(-)
diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
index 59cf277..fe1dc7d 100644
--- a/include/hw/acpi/acpi-defs.h
+++ b/include/hw/acpi/acpi-defs.h
@@ -201,13 +201,22 @@ enum {
*/
struct AcpiRsdtDescriptorRev1
{
- ACPI_TABLE_HEADER_DEF /* ACPI common table header */
- uint32_t table_offset_entry[0]; /* Array of pointers to other */
- /* ACPI tables */
+ ACPI_TABLE_HEADER_DEF /* ACPI common table header */
+ uint32_t table_offset_entry[0]; /* Array of pointers to other ACPI tables */
} QEMU_PACKED;
typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1;
/*
+ * ACPI 2.0 Extended System Description Table (XSDT)
+ */
+struct AcpiXsdtDescriptor
+{
+ 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 AcpiXsdtDescriptor AcpiXsdtDescriptor;
+
+/*
* 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 edc1dfa..0a00402 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -287,5 +287,7 @@ void acpi_build_tables_init(AcpiBuildTables *tables);
void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre);
void
build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
+void
+build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
#endif
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index 4c930b6..d0e52c4 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1200,25 +1200,40 @@ void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre)
}
/* Build rsdt table */
-void
-build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
+static void
+build_sdt(GArray *table_data, GArray *linker, GArray *table_offsets,
+ const char *sig, int entry_size)
{
- AcpiRsdtDescriptorRev1 *rsdt;
- size_t rsdt_len;
+ AcpiTableHeader *sdt;
+ size_t sdt_len;
int i;
- const int table_data_len = (sizeof(uint32_t) * table_offsets->len);
+ const int table_data_len = (entry_size * table_offsets->len);
+ char *entries;
- rsdt_len = sizeof(*rsdt) + table_data_len;
- rsdt = acpi_data_push(table_data, rsdt_len);
- memcpy(rsdt->table_offset_entry, table_offsets->data, table_data_len);
+ sdt_len = sizeof(*sdt) + table_data_len;
+ sdt = acpi_data_push(table_data, sdt_len);
+ entries = ((char *)sdt) + sizeof(*sdt);
+ memcpy(entries, table_offsets->data, table_data_len);
for (i = 0; i < table_offsets->len; ++i) {
- /* rsdt->table_offset_entry to be filled by Guest linker */
+ /* entry to be filled by Guest linker */
bios_linker_loader_add_pointer(linker,
ACPI_BUILD_TABLE_FILE,
ACPI_BUILD_TABLE_FILE,
- table_data, &rsdt->table_offset_entry[i],
- sizeof(uint32_t));
+ table_data, entries + i * entry_size,
+ entry_size);
}
- build_header(linker, table_data,
- (void *)rsdt, "RSDT", rsdt_len, 1);
+ build_header(linker, table_data, sdt, sig, sdt_len, 1);
+}
+
+void
+build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
+{
+ build_sdt(table_data, linker, table_offsets, "RSDT", sizeof(uint32_t));
+}
+
+/* Build xsdt table */
+void
+build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
+{
+ build_sdt(table_data, linker, table_offsets, "XSDT", sizeof(uint64_t));
}
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index aaa149b..3551a08 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1593,7 +1593,7 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
}
static GArray *
-build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
+build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
{
AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
@@ -1602,16 +1602,33 @@ build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
memcpy(&rsdp->signature, "RSD PTR ", 8);
memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
+
+ rsdp->revision = 0x02;
+ rsdp->length = cpu_to_le32(sizeof *rsdp);
+
rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
/* Address to be filled by Guest linker */
bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
ACPI_BUILD_TABLE_FILE,
rsdp_table, &rsdp->rsdt_physical_address,
sizeof rsdp->rsdt_physical_address);
+
+ rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
+ bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
+ ACPI_BUILD_TABLE_FILE,
+ rsdp_table, &rsdp->xsdt_physical_address,
+ sizeof rsdp->xsdt_physical_address);
rsdp->checksum = 0;
/* Checksum to be filled by Guest linker */
bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
- rsdp, rsdp, sizeof *rsdp, &rsdp->checksum);
+ rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
+ &rsdp->checksum);
+
+ rsdp->extended_checksum = 0;
+ /* Checksum to be filled by Guest linker */
+ bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
+ rsdp, rsdp, sizeof *rsdp,
+ &rsdp->extended_checksum);
return rsdp_table;
}
@@ -1665,7 +1682,7 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
{
GArray *rsdt_table_offsets;
GArray *xsdt_table_offsets;
- unsigned facs, ssdt, dsdt, rsdt;
+ unsigned facs, ssdt, dsdt, rsdt, xsdt;
AcpiCpuInfo cpu;
AcpiPmInfo pm;
AcpiMiscInfo misc;
@@ -1762,12 +1779,14 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
g_array_append_vals(tables_blob, u, len);
}
- /* RSDT is pointed to by RSDP */
+ /* RSDT and XSDT pointed to by RSDP */
rsdt = tables_blob->len;
build_rsdt(tables_blob, tables->linker, rsdt_table_offsets);
+ xsdt = tables_blob->len;
+ build_xsdt(tables_blob, tables->linker, xsdt_table_offsets);
/* RSDP is in FSEG memory, so allocate it separately */
- build_rsdp(tables->rsdp, tables->linker, rsdt);
+ build_rsdp(tables->rsdp, tables->linker, rsdt, xsdt);
/* We'll expose it all to Guest so we want to reduce
* chance of size changes.
--
MST
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation
2015-06-04 16:21 [Qemu-devel] [PATCH 0/4] acpi: xsdt support Michael S. Tsirkin
` (2 preceding siblings ...)
2015-06-04 16:21 ` [Qemu-devel] [PATCH 3/4] i386/acpi: add XSDT Michael S. Tsirkin
@ 2015-06-04 16:21 ` Michael S. Tsirkin
2015-06-05 2:47 ` Shannon Zhao
2015-06-05 2:48 ` [Qemu-devel] [PATCH 0/4] acpi: xsdt support Shannon Zhao
4 siblings, 1 reply; 16+ messages in thread
From: Michael S. Tsirkin @ 2015-06-04 16:21 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Maydell, Eduardo Habkost, ghammer, shannon.zhao, imammedo,
pbonzini, lersek, Richard Henderson
Now that both i386 and arm use v2 tables,
use common code for both.
Warning: untested.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
include/hw/acpi/aml-build.h | 2 ++
hw/acpi/aml-build.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
hw/arm/virt-acpi-build.c | 31 +------------------------------
hw/i386/acpi-build.c | 41 -----------------------------------------
4 files changed, 48 insertions(+), 71 deletions(-)
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
index 0a00402..ae169fa 100644
--- a/include/hw/acpi/aml-build.h
+++ b/include/hw/acpi/aml-build.h
@@ -289,5 +289,7 @@ void
build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
void
build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
+GArray *
+build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt);
#endif
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index d0e52c4..d0bd953 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1237,3 +1237,48 @@ build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
{
build_sdt(table_data, linker, table_offsets, "XSDT", sizeof(uint64_t));
}
+
+GArray *
+build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
+{
+ AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
+
+ bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
+ true /* fseg memory */);
+
+ memcpy(&rsdp->signature, "RSD PTR ", 8);
+ memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
+
+ rsdp->revision = 0x02;
+ rsdp->length = cpu_to_le32(sizeof *rsdp);
+
+ if (rsdt) {
+ rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
+ /* Address to be filled by Guest linker */
+ bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
+ ACPI_BUILD_TABLE_FILE,
+ rsdp_table, &rsdp->rsdt_physical_address,
+ sizeof rsdp->rsdt_physical_address);
+ }
+
+ if (xsdt) {
+ rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
+ bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
+ ACPI_BUILD_TABLE_FILE,
+ rsdp_table, &rsdp->xsdt_physical_address,
+ sizeof rsdp->xsdt_physical_address);
+ }
+ rsdp->checksum = 0;
+ /* Checksum to be filled by Guest linker */
+ bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
+ rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
+ &rsdp->checksum);
+
+ rsdp->extended_checksum = 0;
+ /* Checksum to be filled by Guest linker */
+ bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
+ rsdp, rsdp, sizeof *rsdp,
+ &rsdp->extended_checksum);
+
+ return rsdp_table;
+}
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 42c8dd9..c164f65 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -304,35 +304,6 @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap, int irq)
aml_append(scope, dev);
}
-/* RSDP */
-static GArray *
-build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
-{
- AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
-
- bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
- true /* fseg memory */);
-
- memcpy(&rsdp->signature, "RSD PTR ", sizeof(rsdp->signature));
- memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, sizeof(rsdp->oem_id));
- rsdp->length = cpu_to_le32(sizeof(*rsdp));
- rsdp->revision = 0x02;
-
- /* Point to RSDT */
- rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
- /* Address to be filled by Guest linker */
- bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
- ACPI_BUILD_TABLE_FILE,
- rsdp_table, &rsdp->rsdt_physical_address,
- sizeof rsdp->rsdt_physical_address);
- rsdp->checksum = 0;
- /* Checksum to be filled by Guest linker */
- bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
- rsdp, rsdp, sizeof *rsdp, &rsdp->checksum);
-
- return rsdp_table;
-}
-
static void
build_mcfg(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
{
@@ -532,7 +503,7 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables)
build_rsdt(tables_blob, tables->linker, table_offsets);
/* RSDP is in FSEG memory, so allocate it separately */
- build_rsdp(tables->rsdp, tables->linker, rsdt);
+ build_rsdp(tables->rsdp, tables->linker, rsdt, 0);
/* Cleanup memory that's no longer used. */
g_array_free(table_offsets, true);
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 3551a08..8c6d7f5 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1592,47 +1592,6 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
misc->dsdt_size, 1);
}
-static GArray *
-build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
-{
- AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
-
- bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
- true /* fseg memory */);
-
- memcpy(&rsdp->signature, "RSD PTR ", 8);
- memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
-
- rsdp->revision = 0x02;
- rsdp->length = cpu_to_le32(sizeof *rsdp);
-
- rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
- /* Address to be filled by Guest linker */
- bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
- ACPI_BUILD_TABLE_FILE,
- rsdp_table, &rsdp->rsdt_physical_address,
- sizeof rsdp->rsdt_physical_address);
-
- rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
- bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
- ACPI_BUILD_TABLE_FILE,
- rsdp_table, &rsdp->xsdt_physical_address,
- sizeof rsdp->xsdt_physical_address);
- rsdp->checksum = 0;
- /* Checksum to be filled by Guest linker */
- bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
- rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
- &rsdp->checksum);
-
- rsdp->extended_checksum = 0;
- /* Checksum to be filled by Guest linker */
- bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
- rsdp, rsdp, sizeof *rsdp,
- &rsdp->extended_checksum);
-
- return rsdp_table;
-}
-
typedef
struct AcpiBuildState {
/* Copy of table in RAM (for patching). */
--
MST
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 3/4] i386/acpi: add XSDT
2015-06-04 16:21 ` [Qemu-devel] [PATCH 3/4] i386/acpi: add XSDT Michael S. Tsirkin
@ 2015-06-05 2:38 ` Shannon Zhao
2015-06-07 9:42 ` Michael S. Tsirkin
0 siblings, 1 reply; 16+ messages in thread
From: Shannon Zhao @ 2015-06-05 2:38 UTC (permalink / raw)
To: Michael S. Tsirkin, qemu-devel
Cc: Eduardo Habkost, ghammer, shannon.zhao, pbonzini, imammedo,
lersek, Richard Henderson
On 2015/6/5 0:21, Michael S. Tsirkin wrote:
> At the moment it mirrors RSDT exactly.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> include/hw/acpi/acpi-defs.h | 15 ++++++++++++---
> include/hw/acpi/aml-build.h | 2 ++
> hw/acpi/aml-build.c | 41 ++++++++++++++++++++++++++++-------------
> hw/i386/acpi-build.c | 29 ++++++++++++++++++++++++-----
> 4 files changed, 66 insertions(+), 21 deletions(-)
>
> diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
> index 59cf277..fe1dc7d 100644
> --- a/include/hw/acpi/acpi-defs.h
> +++ b/include/hw/acpi/acpi-defs.h
> @@ -201,13 +201,22 @@ enum {
> */
> struct AcpiRsdtDescriptorRev1
> {
> - ACPI_TABLE_HEADER_DEF /* ACPI common table header */
> - uint32_t table_offset_entry[0]; /* Array of pointers to other */
> - /* ACPI tables */
> + ACPI_TABLE_HEADER_DEF /* ACPI common table header */
> + uint32_t table_offset_entry[0]; /* Array of pointers to other ACPI tables */
> } QEMU_PACKED;
> typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1;
>
> /*
> + * ACPI 2.0 Extended System Description Table (XSDT)
> + */
> +struct AcpiXsdtDescriptor
> +{
> + 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 AcpiXsdtDescriptor AcpiXsdtDescriptor;
> +
> +/*
> * 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 edc1dfa..0a00402 100644
> --- a/include/hw/acpi/aml-build.h
> +++ b/include/hw/acpi/aml-build.h
> @@ -287,5 +287,7 @@ void acpi_build_tables_init(AcpiBuildTables *tables);
> void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre);
> void
> build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
> +void
> +build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
>
> #endif
> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> index 4c930b6..d0e52c4 100644
> --- a/hw/acpi/aml-build.c
> +++ b/hw/acpi/aml-build.c
> @@ -1200,25 +1200,40 @@ void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre)
> }
>
> /* Build rsdt table */
> -void
> -build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
> +static void
> +build_sdt(GArray *table_data, GArray *linker, GArray *table_offsets,
> + const char *sig, int entry_size)
> {
> - AcpiRsdtDescriptorRev1 *rsdt;
> - size_t rsdt_len;
> + AcpiTableHeader *sdt;
> + size_t sdt_len;
> int i;
> - const int table_data_len = (sizeof(uint32_t) * table_offsets->len);
> + const int table_data_len = (entry_size * table_offsets->len);
> + char *entries;
>
> - rsdt_len = sizeof(*rsdt) + table_data_len;
> - rsdt = acpi_data_push(table_data, rsdt_len);
> - memcpy(rsdt->table_offset_entry, table_offsets->data, table_data_len);
> + sdt_len = sizeof(*sdt) + table_data_len;
> + sdt = acpi_data_push(table_data, sdt_len);
> + entries = ((char *)sdt) + sizeof(*sdt);
> + memcpy(entries, table_offsets->data, table_data_len);
> for (i = 0; i < table_offsets->len; ++i) {
> - /* rsdt->table_offset_entry to be filled by Guest linker */
> + /* entry to be filled by Guest linker */
> bios_linker_loader_add_pointer(linker,
> ACPI_BUILD_TABLE_FILE,
> ACPI_BUILD_TABLE_FILE,
> - table_data, &rsdt->table_offset_entry[i],
> - sizeof(uint32_t));
> + table_data, entries + i * entry_size,
> + entry_size);
> }
> - build_header(linker, table_data,
> - (void *)rsdt, "RSDT", rsdt_len, 1);
> + build_header(linker, table_data, sdt, sig, sdt_len, 1);
The table revision should update as well. Make it as a parameter of
build_sdt.
> +}
> +
> +void
> +build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
> +{
> + build_sdt(table_data, linker, table_offsets, "RSDT", sizeof(uint32_t));
> +}
> +
> +/* Build xsdt table */
> +void
> +build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
> +{
> + build_sdt(table_data, linker, table_offsets, "XSDT", sizeof(uint64_t));
> }
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index aaa149b..3551a08 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -1593,7 +1593,7 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
> }
>
> static GArray *
> -build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
> +build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
uint64_t xsdt?
> {
> AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
>
> @@ -1602,16 +1602,33 @@ build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
>
> memcpy(&rsdp->signature, "RSD PTR ", 8);
> memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
> +
> + rsdp->revision = 0x02;
> + rsdp->length = cpu_to_le32(sizeof *rsdp);
> +
> rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
> /* Address to be filled by Guest linker */
> bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> ACPI_BUILD_TABLE_FILE,
> rsdp_table, &rsdp->rsdt_physical_address,
> sizeof rsdp->rsdt_physical_address);
> +
> + rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
cpu_to_le64(xsdt) ?
> + bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> + ACPI_BUILD_TABLE_FILE,
> + rsdp_table, &rsdp->xsdt_physical_address,
> + sizeof rsdp->xsdt_physical_address);
> rsdp->checksum = 0;
> /* Checksum to be filled by Guest linker */
> bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> - rsdp, rsdp, sizeof *rsdp, &rsdp->checksum);
> + rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
> + &rsdp->checksum);
> +
> + rsdp->extended_checksum = 0;
> + /* Checksum to be filled by Guest linker */
> + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> + rsdp, rsdp, sizeof *rsdp,
> + &rsdp->extended_checksum);
>
> return rsdp_table;
> }
> @@ -1665,7 +1682,7 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
> {
> GArray *rsdt_table_offsets;
> GArray *xsdt_table_offsets;
> - unsigned facs, ssdt, dsdt, rsdt;
> + unsigned facs, ssdt, dsdt, rsdt, xsdt;
> AcpiCpuInfo cpu;
> AcpiPmInfo pm;
> AcpiMiscInfo misc;
> @@ -1762,12 +1779,14 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
> g_array_append_vals(tables_blob, u, len);
> }
>
> - /* RSDT is pointed to by RSDP */
> + /* RSDT and XSDT pointed to by RSDP */
> rsdt = tables_blob->len;
> build_rsdt(tables_blob, tables->linker, rsdt_table_offsets);
> + xsdt = tables_blob->len;
> + build_xsdt(tables_blob, tables->linker, xsdt_table_offsets);
>
> /* RSDP is in FSEG memory, so allocate it separately */
> - build_rsdp(tables->rsdp, tables->linker, rsdt);
> + build_rsdp(tables->rsdp, tables->linker, rsdt, xsdt);
>
> /* We'll expose it all to Guest so we want to reduce
> * chance of size changes.
>
--
Shannon
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 1/4] acpi: add API for 64 bit offsets
2015-06-04 16:21 ` [Qemu-devel] [PATCH 1/4] acpi: add API for 64 bit offsets Michael S. Tsirkin
@ 2015-06-05 2:38 ` Shannon Zhao
0 siblings, 0 replies; 16+ messages in thread
From: Shannon Zhao @ 2015-06-05 2:38 UTC (permalink / raw)
To: Michael S. Tsirkin, qemu-devel
Cc: Peter Maydell, Eduardo Habkost, ghammer, shannon.zhao, pbonzini,
imammedo, lersek, Richard Henderson
On 2015/6/5 0:21, Michael S. Tsirkin wrote:
> Collecting these is useful for implementing the XSDT.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> include/hw/acpi/aml-build.h | 3 ++-
> hw/acpi/aml-build.c | 13 ++++++++++---
> hw/arm/virt-acpi-build.c | 8 ++++----
> hw/i386/acpi-build.c | 20 ++++++++++----------
> 4 files changed, 26 insertions(+), 18 deletions(-)
>
> diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
> index e3afa13..edc1dfa 100644
> --- a/include/hw/acpi/aml-build.h
> +++ b/include/hw/acpi/aml-build.h
> @@ -281,7 +281,8 @@ build_header(GArray *linker, GArray *table_data,
> AcpiTableHeader *h, const char *sig, int len, uint8_t rev);
> void *acpi_data_push(GArray *table_data, unsigned size);
> unsigned acpi_data_len(GArray *table);
> -void acpi_add_table(GArray *table_offsets, GArray *table_data);
> +void acpi_add_table(GArray *table_offsets32, GArray *table_offsets64,
> + GArray *table_data);
> void acpi_build_tables_init(AcpiBuildTables *tables);
> void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre);
> void
> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> index 0d4b324..4c930b6 100644
> --- a/hw/acpi/aml-build.c
> +++ b/hw/acpi/aml-build.c
> @@ -1169,10 +1169,17 @@ unsigned acpi_data_len(GArray *table)
> return table->len;
> }
>
> -void acpi_add_table(GArray *table_offsets, GArray *table_data)
> +void acpi_add_table(GArray *table_offsets32, GArray *table_offsets64,
> + GArray *table_data)
> {
> - uint32_t offset = cpu_to_le32(table_data->len);
> - g_array_append_val(table_offsets, offset);
> + uint32_t offset32 = cpu_to_le32(table_data->len);
> + uint64_t offset64 = cpu_to_le64(table_data->len);
Maybe move them into below if{} separately.
> + if (table_offsets32) {
> + g_array_append_val(table_offsets32, offset32);
> + }
> + if (table_offsets64) {
> + g_array_append_val(table_offsets64, offset64);
> + }
> }
>
> void acpi_build_tables_init(AcpiBuildTables *tables)
> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> index a9373cc..42c8dd9 100644
> --- a/hw/arm/virt-acpi-build.c
> +++ b/hw/arm/virt-acpi-build.c
> @@ -515,16 +515,16 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables)
> build_dsdt(tables_blob, tables->linker, guest_info);
>
> /* FADT MADT GTDT pointed to by RSDT */
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_fadt(tables_blob, tables->linker, dsdt);
>
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_madt(tables_blob, tables->linker, guest_info, &cpuinfo);
>
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_gtdt(tables_blob, tables->linker);
>
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_mcfg(tables_blob, tables->linker, guest_info);
>
> /* RSDT is pointed to by RSDP */
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index db32fd1..e5b0b7a 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -1706,27 +1706,27 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
> aml_len += tables_blob->len - dsdt;
>
> /* ACPI tables pointed to by RSDT */
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_fadt(tables_blob, tables->linker, &pm, facs, dsdt);
>
> ssdt = tables_blob->len;
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_ssdt(tables_blob, tables->linker, &cpu, &pm, &misc, &pci,
> guest_info);
> aml_len += tables_blob->len - ssdt;
>
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_madt(tables_blob, tables->linker, &cpu, guest_info);
>
> if (misc.has_hpet) {
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_hpet(tables_blob, tables->linker);
> }
> if (misc.tpm_version != TPM_VERSION_UNSPEC) {
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_tpm_tcpa(tables_blob, tables->linker, tables->tcpalog);
>
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> switch (misc.tpm_version) {
> case TPM_VERSION_1_2:
> build_tpm_ssdt(tables_blob, tables->linker);
> @@ -1739,15 +1739,15 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
> }
> }
> if (guest_info->numa_nodes) {
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_srat(tables_blob, tables->linker, guest_info);
> }
> if (acpi_get_mcfg(&mcfg)) {
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_mcfg_q35(tables_blob, tables->linker, &mcfg);
> }
> if (acpi_has_iommu()) {
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> build_dmar_q35(tables_blob, tables->linker);
> }
>
> @@ -1755,7 +1755,7 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
> for (u = acpi_table_first(); u; u = acpi_table_next(u)) {
> unsigned len = acpi_table_len(u);
>
> - acpi_add_table(table_offsets, tables_blob);
> + acpi_add_table(table_offsets, NULL, tables_blob);
> g_array_append_vals(tables_blob, u, len);
> }
>
>
--
Shannon
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation
2015-06-04 16:21 ` [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation Michael S. Tsirkin
@ 2015-06-05 2:47 ` Shannon Zhao
2015-06-07 9:45 ` Michael S. Tsirkin
0 siblings, 1 reply; 16+ messages in thread
From: Shannon Zhao @ 2015-06-05 2:47 UTC (permalink / raw)
To: Michael S. Tsirkin, qemu-devel
Cc: Peter Maydell, Eduardo Habkost, ghammer, shannon.zhao, pbonzini,
imammedo, lersek, Richard Henderson
On 2015/6/5 0:21, Michael S. Tsirkin wrote:
> Now that both i386 and arm use v2 tables,
> use common code for both.
>
> Warning: untested.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
> include/hw/acpi/aml-build.h | 2 ++
> hw/acpi/aml-build.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> hw/arm/virt-acpi-build.c | 31 +------------------------------
> hw/i386/acpi-build.c | 41 -----------------------------------------
> 4 files changed, 48 insertions(+), 71 deletions(-)
>
> diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
> index 0a00402..ae169fa 100644
> --- a/include/hw/acpi/aml-build.h
> +++ b/include/hw/acpi/aml-build.h
> @@ -289,5 +289,7 @@ void
> build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
> void
> build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
> +GArray *
> +build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt);
>
> #endif
> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> index d0e52c4..d0bd953 100644
> --- a/hw/acpi/aml-build.c
> +++ b/hw/acpi/aml-build.c
> @@ -1237,3 +1237,48 @@ build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
> {
> build_sdt(table_data, linker, table_offsets, "XSDT", sizeof(uint64_t));
> }
> +
> +GArray *
> +build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
> +{
> + AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
> +
> + bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
> + true /* fseg memory */);
> +
> + memcpy(&rsdp->signature, "RSD PTR ", 8);
> + memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
> +
> + rsdp->revision = 0x02;
> + rsdp->length = cpu_to_le32(sizeof *rsdp);
> +
> + if (rsdt) {
> + rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
> + /* Address to be filled by Guest linker */
> + bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> + ACPI_BUILD_TABLE_FILE,
> + rsdp_table, &rsdp->rsdt_physical_address,
> + sizeof rsdp->rsdt_physical_address);
> + }
> +
> + if (xsdt) {
> + rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
> + bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> + ACPI_BUILD_TABLE_FILE,
> + rsdp_table, &rsdp->xsdt_physical_address,
> + sizeof rsdp->xsdt_physical_address);
> + }
> + rsdp->checksum = 0;
> + /* Checksum to be filled by Guest linker */
> + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> + rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
> + &rsdp->checksum);
> +
> + rsdp->extended_checksum = 0;
> + /* Checksum to be filled by Guest linker */
> + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> + rsdp, rsdp, sizeof *rsdp,
> + &rsdp->extended_checksum);
> +
> + return rsdp_table;
> +}
> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> index 42c8dd9..c164f65 100644
> --- a/hw/arm/virt-acpi-build.c
> +++ b/hw/arm/virt-acpi-build.c
> @@ -304,35 +304,6 @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap, int irq)
> aml_append(scope, dev);
> }
>
> -/* RSDP */
> -static GArray *
> -build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
> -{
> - AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
> -
> - bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
> - true /* fseg memory */);
> -
> - memcpy(&rsdp->signature, "RSD PTR ", sizeof(rsdp->signature));
> - memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, sizeof(rsdp->oem_id));
> - rsdp->length = cpu_to_le32(sizeof(*rsdp));
> - rsdp->revision = 0x02;
> -
> - /* Point to RSDT */
> - rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
> - /* Address to be filled by Guest linker */
> - bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> - ACPI_BUILD_TABLE_FILE,
> - rsdp_table, &rsdp->rsdt_physical_address,
> - sizeof rsdp->rsdt_physical_address);
> - rsdp->checksum = 0;
> - /* Checksum to be filled by Guest linker */
> - bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> - rsdp, rsdp, sizeof *rsdp, &rsdp->checksum);
> -
> - return rsdp_table;
> -}
> -
> static void
> build_mcfg(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
> {
> @@ -532,7 +503,7 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables)
> build_rsdt(tables_blob, tables->linker, table_offsets);
>
> /* RSDP is in FSEG memory, so allocate it separately */
> - build_rsdp(tables->rsdp, tables->linker, rsdt);
> + build_rsdp(tables->rsdp, tables->linker, rsdt, 0);
>
So ARM virt can use xsdt as well. Maybe could do by another patch on top
of this.
> /* Cleanup memory that's no longer used. */
> g_array_free(table_offsets, true);
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index 3551a08..8c6d7f5 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -1592,47 +1592,6 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
> misc->dsdt_size, 1);
> }
>
> -static GArray *
> -build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
> -{
> - AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
> -
> - bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
> - true /* fseg memory */);
> -
> - memcpy(&rsdp->signature, "RSD PTR ", 8);
> - memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
> -
> - rsdp->revision = 0x02;
> - rsdp->length = cpu_to_le32(sizeof *rsdp);
> -
> - rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
> - /* Address to be filled by Guest linker */
> - bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> - ACPI_BUILD_TABLE_FILE,
> - rsdp_table, &rsdp->rsdt_physical_address,
> - sizeof rsdp->rsdt_physical_address);
> -
> - rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
> - bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> - ACPI_BUILD_TABLE_FILE,
> - rsdp_table, &rsdp->xsdt_physical_address,
> - sizeof rsdp->xsdt_physical_address);
> - rsdp->checksum = 0;
> - /* Checksum to be filled by Guest linker */
> - bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> - rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
> - &rsdp->checksum);
> -
> - rsdp->extended_checksum = 0;
> - /* Checksum to be filled by Guest linker */
> - bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> - rsdp, rsdp, sizeof *rsdp,
> - &rsdp->extended_checksum);
> -
> - return rsdp_table;
> -}
> -
> typedef
> struct AcpiBuildState {
> /* Copy of table in RAM (for patching). */
>
--
Shannon
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 0/4] acpi: xsdt support
2015-06-04 16:21 [Qemu-devel] [PATCH 0/4] acpi: xsdt support Michael S. Tsirkin
` (3 preceding siblings ...)
2015-06-04 16:21 ` [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation Michael S. Tsirkin
@ 2015-06-05 2:48 ` Shannon Zhao
4 siblings, 0 replies; 16+ messages in thread
From: Shannon Zhao @ 2015-06-05 2:48 UTC (permalink / raw)
To: Michael S. Tsirkin, qemu-devel
Cc: ghammer, pbonzini, lersek, shannon.zhao, imammedo
On 2015/6/5 0:21, Michael S. Tsirkin wrote:
> XSDT support allows using ACPI 2 features while
> avoiding breaking legacy windows XP guests:
> ACPI 2 tables are linked from XSDT only,
> ACPI 1 tables from both RSDT and XSDT, this way
> XP does not see ACPI 2 tables.
>
> As a first step, this patchset generates v2 RSDP
> and fills in XSDT matching RSDT exactly.
>
> ARM patch is untested: I don't know how to test ARM ACPI.
> Testing reports would be greatly appreciated.
>
I've tested it on ARM, no error appears.
> Michael S. Tsirkin (4):
> acpi: add API for 64 bit offsets
> i386/acpi: collect 64 bit offsets for xsdt
> i386/acpi: add XSDT
> acpi: unify rsdp generation
>
> include/hw/acpi/acpi-defs.h | 15 +++++--
> include/hw/acpi/aml-build.h | 7 +++-
> hw/acpi/aml-build.c | 99 +++++++++++++++++++++++++++++++++++++--------
> hw/arm/virt-acpi-build.c | 39 +++---------------
> hw/i386/acpi-build.c | 64 +++++++++++------------------
> 5 files changed, 129 insertions(+), 95 deletions(-)
>
--
Shannon
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 3/4] i386/acpi: add XSDT
2015-06-05 2:38 ` Shannon Zhao
@ 2015-06-07 9:42 ` Michael S. Tsirkin
2015-06-08 1:49 ` Shannon Zhao
0 siblings, 1 reply; 16+ messages in thread
From: Michael S. Tsirkin @ 2015-06-07 9:42 UTC (permalink / raw)
To: Shannon Zhao
Cc: Eduardo Habkost, ghammer, qemu-devel, shannon.zhao, pbonzini,
imammedo, lersek, Richard Henderson
On Fri, Jun 05, 2015 at 10:38:24AM +0800, Shannon Zhao wrote:
>
>
> On 2015/6/5 0:21, Michael S. Tsirkin wrote:
> > At the moment it mirrors RSDT exactly.
> >
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> > include/hw/acpi/acpi-defs.h | 15 ++++++++++++---
> > include/hw/acpi/aml-build.h | 2 ++
> > hw/acpi/aml-build.c | 41 ++++++++++++++++++++++++++++-------------
> > hw/i386/acpi-build.c | 29 ++++++++++++++++++++++++-----
> > 4 files changed, 66 insertions(+), 21 deletions(-)
> >
> > diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
> > index 59cf277..fe1dc7d 100644
> > --- a/include/hw/acpi/acpi-defs.h
> > +++ b/include/hw/acpi/acpi-defs.h
> > @@ -201,13 +201,22 @@ enum {
> > */
> > struct AcpiRsdtDescriptorRev1
> > {
> > - ACPI_TABLE_HEADER_DEF /* ACPI common table header */
> > - uint32_t table_offset_entry[0]; /* Array of pointers to other */
> > - /* ACPI tables */
> > + ACPI_TABLE_HEADER_DEF /* ACPI common table header */
> > + uint32_t table_offset_entry[0]; /* Array of pointers to other ACPI tables */
> > } QEMU_PACKED;
> > typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1;
> >
> > /*
> > + * ACPI 2.0 Extended System Description Table (XSDT)
> > + */
> > +struct AcpiXsdtDescriptor
> > +{
> > + 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 AcpiXsdtDescriptor AcpiXsdtDescriptor;
> > +
> > +/*
> > * 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 edc1dfa..0a00402 100644
> > --- a/include/hw/acpi/aml-build.h
> > +++ b/include/hw/acpi/aml-build.h
> > @@ -287,5 +287,7 @@ void acpi_build_tables_init(AcpiBuildTables *tables);
> > void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre);
> > void
> > build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
> > +void
> > +build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
> >
> > #endif
> > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> > index 4c930b6..d0e52c4 100644
> > --- a/hw/acpi/aml-build.c
> > +++ b/hw/acpi/aml-build.c
> > @@ -1200,25 +1200,40 @@ void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre)
> > }
> >
> > /* Build rsdt table */
> > -void
> > -build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
> > +static void
> > +build_sdt(GArray *table_data, GArray *linker, GArray *table_offsets,
> > + const char *sig, int entry_size)
> > {
> > - AcpiRsdtDescriptorRev1 *rsdt;
> > - size_t rsdt_len;
> > + AcpiTableHeader *sdt;
> > + size_t sdt_len;
> > int i;
> > - const int table_data_len = (sizeof(uint32_t) * table_offsets->len);
> > + const int table_data_len = (entry_size * table_offsets->len);
> > + char *entries;
> >
> > - rsdt_len = sizeof(*rsdt) + table_data_len;
> > - rsdt = acpi_data_push(table_data, rsdt_len);
> > - memcpy(rsdt->table_offset_entry, table_offsets->data, table_data_len);
> > + sdt_len = sizeof(*sdt) + table_data_len;
> > + sdt = acpi_data_push(table_data, sdt_len);
> > + entries = ((char *)sdt) + sizeof(*sdt);
> > + memcpy(entries, table_offsets->data, table_data_len);
> > for (i = 0; i < table_offsets->len; ++i) {
> > - /* rsdt->table_offset_entry to be filled by Guest linker */
> > + /* entry to be filled by Guest linker */
> > bios_linker_loader_add_pointer(linker,
> > ACPI_BUILD_TABLE_FILE,
> > ACPI_BUILD_TABLE_FILE,
> > - table_data, &rsdt->table_offset_entry[i],
> > - sizeof(uint32_t));
> > + table_data, entries + i * entry_size,
> > + entry_size);
> > }
> > - build_header(linker, table_data,
> > - (void *)rsdt, "RSDT", rsdt_len, 1);
> > + build_header(linker, table_data, sdt, sig, sdt_len, 1);
>
> The table revision should update as well. Make it as a parameter of
> build_sdt.
How do you figure this?
The spec I have lists XSDT revision as 1.
> > +}
> > +
> > +void
> > +build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
> > +{
> > + build_sdt(table_data, linker, table_offsets, "RSDT", sizeof(uint32_t));
> > +}
> > +
> > +/* Build xsdt table */
> > +void
> > +build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
> > +{
> > + build_sdt(table_data, linker, table_offsets, "XSDT", sizeof(uint64_t));
> > }
> > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> > index aaa149b..3551a08 100644
> > --- a/hw/i386/acpi-build.c
> > +++ b/hw/i386/acpi-build.c
> > @@ -1593,7 +1593,7 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
> > }
> >
> > static GArray *
> > -build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
> > +build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
>
> uint64_t xsdt?
No, because it's an offset within the blob, not the physical address.
We can't really ask bios to allocate > 4G blob for us.
> > {
> > AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
> >
> > @@ -1602,16 +1602,33 @@ build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
> >
> > memcpy(&rsdp->signature, "RSD PTR ", 8);
> > memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
> > +
> > + rsdp->revision = 0x02;
> > + rsdp->length = cpu_to_le32(sizeof *rsdp);
> > +
> > rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
> > /* Address to be filled by Guest linker */
> > bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> > ACPI_BUILD_TABLE_FILE,
> > rsdp_table, &rsdp->rsdt_physical_address,
> > sizeof rsdp->rsdt_physical_address);
> > +
> > + rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
>
> cpu_to_le64(xsdt) ?
Good catch. Will fix, thanks!
> > + bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> > + ACPI_BUILD_TABLE_FILE,
> > + rsdp_table, &rsdp->xsdt_physical_address,
> > + sizeof rsdp->xsdt_physical_address);
> > rsdp->checksum = 0;
> > /* Checksum to be filled by Guest linker */
> > bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> > - rsdp, rsdp, sizeof *rsdp, &rsdp->checksum);
> > + rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
> > + &rsdp->checksum);
> > +
> > + rsdp->extended_checksum = 0;
> > + /* Checksum to be filled by Guest linker */
> > + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> > + rsdp, rsdp, sizeof *rsdp,
> > + &rsdp->extended_checksum);
> >
> > return rsdp_table;
> > }
> > @@ -1665,7 +1682,7 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
> > {
> > GArray *rsdt_table_offsets;
> > GArray *xsdt_table_offsets;
> > - unsigned facs, ssdt, dsdt, rsdt;
> > + unsigned facs, ssdt, dsdt, rsdt, xsdt;
> > AcpiCpuInfo cpu;
> > AcpiPmInfo pm;
> > AcpiMiscInfo misc;
> > @@ -1762,12 +1779,14 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
> > g_array_append_vals(tables_blob, u, len);
> > }
> >
> > - /* RSDT is pointed to by RSDP */
> > + /* RSDT and XSDT pointed to by RSDP */
> > rsdt = tables_blob->len;
> > build_rsdt(tables_blob, tables->linker, rsdt_table_offsets);
> > + xsdt = tables_blob->len;
> > + build_xsdt(tables_blob, tables->linker, xsdt_table_offsets);
> >
> > /* RSDP is in FSEG memory, so allocate it separately */
> > - build_rsdp(tables->rsdp, tables->linker, rsdt);
> > + build_rsdp(tables->rsdp, tables->linker, rsdt, xsdt);
> >
> > /* We'll expose it all to Guest so we want to reduce
> > * chance of size changes.
> >
>
> --
> Shannon
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation
2015-06-05 2:47 ` Shannon Zhao
@ 2015-06-07 9:45 ` Michael S. Tsirkin
2015-06-08 1:52 ` Shannon Zhao
0 siblings, 1 reply; 16+ messages in thread
From: Michael S. Tsirkin @ 2015-06-07 9:45 UTC (permalink / raw)
To: Shannon Zhao
Cc: Peter Maydell, Eduardo Habkost, ghammer, qemu-devel, shannon.zhao,
pbonzini, imammedo, lersek, Richard Henderson
On Fri, Jun 05, 2015 at 10:47:16AM +0800, Shannon Zhao wrote:
>
>
> On 2015/6/5 0:21, Michael S. Tsirkin wrote:
> > Now that both i386 and arm use v2 tables,
> > use common code for both.
> >
> > Warning: untested.
> >
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> > include/hw/acpi/aml-build.h | 2 ++
> > hw/acpi/aml-build.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> > hw/arm/virt-acpi-build.c | 31 +------------------------------
> > hw/i386/acpi-build.c | 41 -----------------------------------------
> > 4 files changed, 48 insertions(+), 71 deletions(-)
> >
> > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
> > index 0a00402..ae169fa 100644
> > --- a/include/hw/acpi/aml-build.h
> > +++ b/include/hw/acpi/aml-build.h
> > @@ -289,5 +289,7 @@ void
> > build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
> > void
> > build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
> > +GArray *
> > +build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt);
> >
> > #endif
> > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> > index d0e52c4..d0bd953 100644
> > --- a/hw/acpi/aml-build.c
> > +++ b/hw/acpi/aml-build.c
> > @@ -1237,3 +1237,48 @@ build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
> > {
> > build_sdt(table_data, linker, table_offsets, "XSDT", sizeof(uint64_t));
> > }
> > +
> > +GArray *
> > +build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
> > +{
> > + AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
> > +
> > + bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
> > + true /* fseg memory */);
> > +
> > + memcpy(&rsdp->signature, "RSD PTR ", 8);
> > + memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
> > +
> > + rsdp->revision = 0x02;
> > + rsdp->length = cpu_to_le32(sizeof *rsdp);
> > +
> > + if (rsdt) {
> > + rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
> > + /* Address to be filled by Guest linker */
> > + bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> > + ACPI_BUILD_TABLE_FILE,
> > + rsdp_table, &rsdp->rsdt_physical_address,
> > + sizeof rsdp->rsdt_physical_address);
> > + }
> > +
> > + if (xsdt) {
> > + rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
> > + bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> > + ACPI_BUILD_TABLE_FILE,
> > + rsdp_table, &rsdp->xsdt_physical_address,
> > + sizeof rsdp->xsdt_physical_address);
> > + }
> > + rsdp->checksum = 0;
> > + /* Checksum to be filled by Guest linker */
> > + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> > + rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
> > + &rsdp->checksum);
> > +
> > + rsdp->extended_checksum = 0;
> > + /* Checksum to be filled by Guest linker */
> > + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> > + rsdp, rsdp, sizeof *rsdp,
> > + &rsdp->extended_checksum);
> > +
> > + return rsdp_table;
> > +}
> > diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> > index 42c8dd9..c164f65 100644
> > --- a/hw/arm/virt-acpi-build.c
> > +++ b/hw/arm/virt-acpi-build.c
> > @@ -304,35 +304,6 @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap, int irq)
> > aml_append(scope, dev);
> > }
> >
> > -/* RSDP */
> > -static GArray *
> > -build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
> > -{
> > - AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
> > -
> > - bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
> > - true /* fseg memory */);
> > -
> > - memcpy(&rsdp->signature, "RSD PTR ", sizeof(rsdp->signature));
> > - memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, sizeof(rsdp->oem_id));
> > - rsdp->length = cpu_to_le32(sizeof(*rsdp));
> > - rsdp->revision = 0x02;
> > -
> > - /* Point to RSDT */
> > - rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
> > - /* Address to be filled by Guest linker */
> > - bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> > - ACPI_BUILD_TABLE_FILE,
> > - rsdp_table, &rsdp->rsdt_physical_address,
> > - sizeof rsdp->rsdt_physical_address);
> > - rsdp->checksum = 0;
> > - /* Checksum to be filled by Guest linker */
> > - bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> > - rsdp, rsdp, sizeof *rsdp, &rsdp->checksum);
> > -
> > - return rsdp_table;
> > -}
> > -
> > static void
> > build_mcfg(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
> > {
> > @@ -532,7 +503,7 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables)
> > build_rsdt(tables_blob, tables->linker, table_offsets);
> >
> > /* RSDP is in FSEG memory, so allocate it separately */
> > - build_rsdp(tables->rsdp, tables->linker, rsdt);
> > + build_rsdp(tables->rsdp, tables->linker, rsdt, 0);
> >
>
> So ARM virt can use xsdt as well. Maybe could do by another patch on top
> of this.
In fact, there's probably no reason to have an rsdt at all.
But how does one test ARM ACPI code?
Could you upload an image with instructions to the wiki?
http://wiki.qemu.org/System_Images
> > /* Cleanup memory that's no longer used. */
> > g_array_free(table_offsets, true);
> > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> > index 3551a08..8c6d7f5 100644
> > --- a/hw/i386/acpi-build.c
> > +++ b/hw/i386/acpi-build.c
> > @@ -1592,47 +1592,6 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
> > misc->dsdt_size, 1);
> > }
> >
> > -static GArray *
> > -build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
> > -{
> > - AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
> > -
> > - bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
> > - true /* fseg memory */);
> > -
> > - memcpy(&rsdp->signature, "RSD PTR ", 8);
> > - memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
> > -
> > - rsdp->revision = 0x02;
> > - rsdp->length = cpu_to_le32(sizeof *rsdp);
> > -
> > - rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
> > - /* Address to be filled by Guest linker */
> > - bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> > - ACPI_BUILD_TABLE_FILE,
> > - rsdp_table, &rsdp->rsdt_physical_address,
> > - sizeof rsdp->rsdt_physical_address);
> > -
> > - rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
> > - bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
> > - ACPI_BUILD_TABLE_FILE,
> > - rsdp_table, &rsdp->xsdt_physical_address,
> > - sizeof rsdp->xsdt_physical_address);
> > - rsdp->checksum = 0;
> > - /* Checksum to be filled by Guest linker */
> > - bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> > - rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
> > - &rsdp->checksum);
> > -
> > - rsdp->extended_checksum = 0;
> > - /* Checksum to be filled by Guest linker */
> > - bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
> > - rsdp, rsdp, sizeof *rsdp,
> > - &rsdp->extended_checksum);
> > -
> > - return rsdp_table;
> > -}
> > -
> > typedef
> > struct AcpiBuildState {
> > /* Copy of table in RAM (for patching). */
> >
>
> --
> Shannon
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 3/4] i386/acpi: add XSDT
2015-06-07 9:42 ` Michael S. Tsirkin
@ 2015-06-08 1:49 ` Shannon Zhao
0 siblings, 0 replies; 16+ messages in thread
From: Shannon Zhao @ 2015-06-08 1:49 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Eduardo Habkost, ghammer, qemu-devel, shannon.zhao, pbonzini,
imammedo, lersek, Richard Henderson
On 2015/6/7 17:42, Michael S. Tsirkin wrote:
> On Fri, Jun 05, 2015 at 10:38:24AM +0800, Shannon Zhao wrote:
>>
>>
>> On 2015/6/5 0:21, Michael S. Tsirkin wrote:
>>> At the moment it mirrors RSDT exactly.
>>>
>>> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>>> ---
>>> include/hw/acpi/acpi-defs.h | 15 ++++++++++++---
>>> include/hw/acpi/aml-build.h | 2 ++
>>> hw/acpi/aml-build.c | 41 ++++++++++++++++++++++++++++-------------
>>> hw/i386/acpi-build.c | 29 ++++++++++++++++++++++++-----
>>> 4 files changed, 66 insertions(+), 21 deletions(-)
>>>
>>> diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h
>>> index 59cf277..fe1dc7d 100644
>>> --- a/include/hw/acpi/acpi-defs.h
>>> +++ b/include/hw/acpi/acpi-defs.h
>>> @@ -201,13 +201,22 @@ enum {
>>> */
>>> struct AcpiRsdtDescriptorRev1
>>> {
>>> - ACPI_TABLE_HEADER_DEF /* ACPI common table header */
>>> - uint32_t table_offset_entry[0]; /* Array of pointers to other */
>>> - /* ACPI tables */
>>> + ACPI_TABLE_HEADER_DEF /* ACPI common table header */
>>> + uint32_t table_offset_entry[0]; /* Array of pointers to other ACPI tables */
>>> } QEMU_PACKED;
>>> typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1;
>>>
>>> /*
>>> + * ACPI 2.0 Extended System Description Table (XSDT)
>>> + */
>>> +struct AcpiXsdtDescriptor
>>> +{
>>> + 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 AcpiXsdtDescriptor AcpiXsdtDescriptor;
>>> +
>>> +/*
>>> * 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 edc1dfa..0a00402 100644
>>> --- a/include/hw/acpi/aml-build.h
>>> +++ b/include/hw/acpi/aml-build.h
>>> @@ -287,5 +287,7 @@ void acpi_build_tables_init(AcpiBuildTables *tables);
>>> void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre);
>>> void
>>> build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
>>> +void
>>> +build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
>>>
>>> #endif
>>> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
>>> index 4c930b6..d0e52c4 100644
>>> --- a/hw/acpi/aml-build.c
>>> +++ b/hw/acpi/aml-build.c
>>> @@ -1200,25 +1200,40 @@ void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre)
>>> }
>>>
>>> /* Build rsdt table */
>>> -void
>>> -build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
>>> +static void
>>> +build_sdt(GArray *table_data, GArray *linker, GArray *table_offsets,
>>> + const char *sig, int entry_size)
>>> {
>>> - AcpiRsdtDescriptorRev1 *rsdt;
>>> - size_t rsdt_len;
>>> + AcpiTableHeader *sdt;
>>> + size_t sdt_len;
>>> int i;
>>> - const int table_data_len = (sizeof(uint32_t) * table_offsets->len);
>>> + const int table_data_len = (entry_size * table_offsets->len);
>>> + char *entries;
>>>
>>> - rsdt_len = sizeof(*rsdt) + table_data_len;
>>> - rsdt = acpi_data_push(table_data, rsdt_len);
>>> - memcpy(rsdt->table_offset_entry, table_offsets->data, table_data_len);
>>> + sdt_len = sizeof(*sdt) + table_data_len;
>>> + sdt = acpi_data_push(table_data, sdt_len);
>>> + entries = ((char *)sdt) + sizeof(*sdt);
>>> + memcpy(entries, table_offsets->data, table_data_len);
>>> for (i = 0; i < table_offsets->len; ++i) {
>>> - /* rsdt->table_offset_entry to be filled by Guest linker */
>>> + /* entry to be filled by Guest linker */
>>> bios_linker_loader_add_pointer(linker,
>>> ACPI_BUILD_TABLE_FILE,
>>> ACPI_BUILD_TABLE_FILE,
>>> - table_data, &rsdt->table_offset_entry[i],
>>> - sizeof(uint32_t));
>>> + table_data, entries + i * entry_size,
>>> + entry_size);
>>> }
>>> - build_header(linker, table_data,
>>> - (void *)rsdt, "RSDT", rsdt_len, 1);
>>> + build_header(linker, table_data, sdt, sig, sdt_len, 1);
>>
>> The table revision should update as well. Make it as a parameter of
>> build_sdt.
>
> How do you figure this?
> The spec I have lists XSDT revision as 1.
>
Oh, sorry, ignore this.
>>> +}
>>> +
>>> +void
>>> +build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
>>> +{
>>> + build_sdt(table_data, linker, table_offsets, "RSDT", sizeof(uint32_t));
>>> +}
>>> +
>>> +/* Build xsdt table */
>>> +void
>>> +build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
>>> +{
>>> + build_sdt(table_data, linker, table_offsets, "XSDT", sizeof(uint64_t));
>>> }
>>> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
>>> index aaa149b..3551a08 100644
>>> --- a/hw/i386/acpi-build.c
>>> +++ b/hw/i386/acpi-build.c
>>> @@ -1593,7 +1593,7 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
>>> }
>>>
>>> static GArray *
>>> -build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
>>> +build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
>>
>> uint64_t xsdt?
>
> No, because it's an offset within the blob, not the physical address.
> We can't really ask bios to allocate > 4G blob for us.
>
>>> {
>>> AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
>>>
>>> @@ -1602,16 +1602,33 @@ build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
>>>
>>> memcpy(&rsdp->signature, "RSD PTR ", 8);
>>> memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
>>> +
>>> + rsdp->revision = 0x02;
>>> + rsdp->length = cpu_to_le32(sizeof *rsdp);
>>> +
>>> rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
>>> /* Address to be filled by Guest linker */
>>> bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
>>> ACPI_BUILD_TABLE_FILE,
>>> rsdp_table, &rsdp->rsdt_physical_address,
>>> sizeof rsdp->rsdt_physical_address);
>>> +
>>> + rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
>>
>> cpu_to_le64(xsdt) ?
>
> Good catch. Will fix, thanks!
>
>>> + bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
>>> + ACPI_BUILD_TABLE_FILE,
>>> + rsdp_table, &rsdp->xsdt_physical_address,
>>> + sizeof rsdp->xsdt_physical_address);
>>> rsdp->checksum = 0;
>>> /* Checksum to be filled by Guest linker */
>>> bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
>>> - rsdp, rsdp, sizeof *rsdp, &rsdp->checksum);
>>> + rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
>>> + &rsdp->checksum);
>>> +
>>> + rsdp->extended_checksum = 0;
>>> + /* Checksum to be filled by Guest linker */
>>> + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
>>> + rsdp, rsdp, sizeof *rsdp,
>>> + &rsdp->extended_checksum);
>>>
>>> return rsdp_table;
>>> }
>>> @@ -1665,7 +1682,7 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
>>> {
>>> GArray *rsdt_table_offsets;
>>> GArray *xsdt_table_offsets;
>>> - unsigned facs, ssdt, dsdt, rsdt;
>>> + unsigned facs, ssdt, dsdt, rsdt, xsdt;
>>> AcpiCpuInfo cpu;
>>> AcpiPmInfo pm;
>>> AcpiMiscInfo misc;
>>> @@ -1762,12 +1779,14 @@ void acpi_build(PcGuestInfo *guest_info, AcpiBuildTables *tables)
>>> g_array_append_vals(tables_blob, u, len);
>>> }
>>>
>>> - /* RSDT is pointed to by RSDP */
>>> + /* RSDT and XSDT pointed to by RSDP */
>>> rsdt = tables_blob->len;
>>> build_rsdt(tables_blob, tables->linker, rsdt_table_offsets);
>>> + xsdt = tables_blob->len;
>>> + build_xsdt(tables_blob, tables->linker, xsdt_table_offsets);
>>>
>>> /* RSDP is in FSEG memory, so allocate it separately */
>>> - build_rsdp(tables->rsdp, tables->linker, rsdt);
>>> + build_rsdp(tables->rsdp, tables->linker, rsdt, xsdt);
>>>
>>> /* We'll expose it all to Guest so we want to reduce
>>> * chance of size changes.
>>>
>>
>> --
>> Shannon
>
> .
>
--
Shannon
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation
2015-06-07 9:45 ` Michael S. Tsirkin
@ 2015-06-08 1:52 ` Shannon Zhao
2015-06-08 7:24 ` Michael S. Tsirkin
0 siblings, 1 reply; 16+ messages in thread
From: Shannon Zhao @ 2015-06-08 1:52 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Peter Maydell, Eduardo Habkost, ghammer, qemu-devel, shannon.zhao,
pbonzini, imammedo, lersek, Richard Henderson
On 2015/6/7 17:45, Michael S. Tsirkin wrote:
> On Fri, Jun 05, 2015 at 10:47:16AM +0800, Shannon Zhao wrote:
>>
>>
>> On 2015/6/5 0:21, Michael S. Tsirkin wrote:
>>> Now that both i386 and arm use v2 tables,
>>> use common code for both.
>>>
>>> Warning: untested.
>>>
>>> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>>> ---
>>> include/hw/acpi/aml-build.h | 2 ++
>>> hw/acpi/aml-build.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
>>> hw/arm/virt-acpi-build.c | 31 +------------------------------
>>> hw/i386/acpi-build.c | 41 -----------------------------------------
>>> 4 files changed, 48 insertions(+), 71 deletions(-)
>>>
>>> diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h
>>> index 0a00402..ae169fa 100644
>>> --- a/include/hw/acpi/aml-build.h
>>> +++ b/include/hw/acpi/aml-build.h
>>> @@ -289,5 +289,7 @@ void
>>> build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
>>> void
>>> build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets);
>>> +GArray *
>>> +build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt);
>>>
>>> #endif
>>> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
>>> index d0e52c4..d0bd953 100644
>>> --- a/hw/acpi/aml-build.c
>>> +++ b/hw/acpi/aml-build.c
>>> @@ -1237,3 +1237,48 @@ build_xsdt(GArray *table_data, GArray *linker, GArray *table_offsets)
>>> {
>>> build_sdt(table_data, linker, table_offsets, "XSDT", sizeof(uint64_t));
>>> }
>>> +
>>> +GArray *
>>> +build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
>>> +{
>>> + AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
>>> +
>>> + bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
>>> + true /* fseg memory */);
>>> +
>>> + memcpy(&rsdp->signature, "RSD PTR ", 8);
>>> + memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
>>> +
>>> + rsdp->revision = 0x02;
>>> + rsdp->length = cpu_to_le32(sizeof *rsdp);
>>> +
>>> + if (rsdt) {
>>> + rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
>>> + /* Address to be filled by Guest linker */
>>> + bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
>>> + ACPI_BUILD_TABLE_FILE,
>>> + rsdp_table, &rsdp->rsdt_physical_address,
>>> + sizeof rsdp->rsdt_physical_address);
>>> + }
>>> +
>>> + if (xsdt) {
>>> + rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
>>> + bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
>>> + ACPI_BUILD_TABLE_FILE,
>>> + rsdp_table, &rsdp->xsdt_physical_address,
>>> + sizeof rsdp->xsdt_physical_address);
>>> + }
>>> + rsdp->checksum = 0;
>>> + /* Checksum to be filled by Guest linker */
>>> + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
>>> + rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
>>> + &rsdp->checksum);
>>> +
>>> + rsdp->extended_checksum = 0;
>>> + /* Checksum to be filled by Guest linker */
>>> + bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
>>> + rsdp, rsdp, sizeof *rsdp,
>>> + &rsdp->extended_checksum);
>>> +
>>> + return rsdp_table;
>>> +}
>>> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
>>> index 42c8dd9..c164f65 100644
>>> --- a/hw/arm/virt-acpi-build.c
>>> +++ b/hw/arm/virt-acpi-build.c
>>> @@ -304,35 +304,6 @@ static void acpi_dsdt_add_pci(Aml *scope, const MemMapEntry *memmap, int irq)
>>> aml_append(scope, dev);
>>> }
>>>
>>> -/* RSDP */
>>> -static GArray *
>>> -build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
>>> -{
>>> - AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
>>> -
>>> - bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
>>> - true /* fseg memory */);
>>> -
>>> - memcpy(&rsdp->signature, "RSD PTR ", sizeof(rsdp->signature));
>>> - memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, sizeof(rsdp->oem_id));
>>> - rsdp->length = cpu_to_le32(sizeof(*rsdp));
>>> - rsdp->revision = 0x02;
>>> -
>>> - /* Point to RSDT */
>>> - rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
>>> - /* Address to be filled by Guest linker */
>>> - bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
>>> - ACPI_BUILD_TABLE_FILE,
>>> - rsdp_table, &rsdp->rsdt_physical_address,
>>> - sizeof rsdp->rsdt_physical_address);
>>> - rsdp->checksum = 0;
>>> - /* Checksum to be filled by Guest linker */
>>> - bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
>>> - rsdp, rsdp, sizeof *rsdp, &rsdp->checksum);
>>> -
>>> - return rsdp_table;
>>> -}
>>> -
>>> static void
>>> build_mcfg(GArray *table_data, GArray *linker, VirtGuestInfo *guest_info)
>>> {
>>> @@ -532,7 +503,7 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables)
>>> build_rsdt(tables_blob, tables->linker, table_offsets);
>>>
>>> /* RSDP is in FSEG memory, so allocate it separately */
>>> - build_rsdp(tables->rsdp, tables->linker, rsdt);
>>> + build_rsdp(tables->rsdp, tables->linker, rsdt, 0);
>>>
>>
>> So ARM virt can use xsdt as well. Maybe could do by another patch on top
>> of this.
>
> In fact, there's probably no reason to have an rsdt at all.
>
> But how does one test ARM ACPI code?
> Could you upload an image with instructions to the wiki?
> http://wiki.qemu.org/System_Images
>
Ok, no problem. But I don't have an account of the wiki.
>
>>> /* Cleanup memory that's no longer used. */
>>> g_array_free(table_offsets, true);
>>> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
>>> index 3551a08..8c6d7f5 100644
>>> --- a/hw/i386/acpi-build.c
>>> +++ b/hw/i386/acpi-build.c
>>> @@ -1592,47 +1592,6 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc)
>>> misc->dsdt_size, 1);
>>> }
>>>
>>> -static GArray *
>>> -build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt, unsigned xsdt)
>>> -{
>>> - AcpiRsdpDescriptor *rsdp = acpi_data_push(rsdp_table, sizeof *rsdp);
>>> -
>>> - bios_linker_loader_alloc(linker, ACPI_BUILD_RSDP_FILE, 16,
>>> - true /* fseg memory */);
>>> -
>>> - memcpy(&rsdp->signature, "RSD PTR ", 8);
>>> - memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
>>> -
>>> - rsdp->revision = 0x02;
>>> - rsdp->length = cpu_to_le32(sizeof *rsdp);
>>> -
>>> - rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
>>> - /* Address to be filled by Guest linker */
>>> - bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
>>> - ACPI_BUILD_TABLE_FILE,
>>> - rsdp_table, &rsdp->rsdt_physical_address,
>>> - sizeof rsdp->rsdt_physical_address);
>>> -
>>> - rsdp->xsdt_physical_address = cpu_to_le32(xsdt);
>>> - bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
>>> - ACPI_BUILD_TABLE_FILE,
>>> - rsdp_table, &rsdp->xsdt_physical_address,
>>> - sizeof rsdp->xsdt_physical_address);
>>> - rsdp->checksum = 0;
>>> - /* Checksum to be filled by Guest linker */
>>> - bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
>>> - rsdp, rsdp, offsetof(AcpiRsdpDescriptor, length),
>>> - &rsdp->checksum);
>>> -
>>> - rsdp->extended_checksum = 0;
>>> - /* Checksum to be filled by Guest linker */
>>> - bios_linker_loader_add_checksum(linker, ACPI_BUILD_RSDP_FILE,
>>> - rsdp, rsdp, sizeof *rsdp,
>>> - &rsdp->extended_checksum);
>>> -
>>> - return rsdp_table;
>>> -}
>>> -
>>> typedef
>>> struct AcpiBuildState {
>>> /* Copy of table in RAM (for patching). */
>>>
>>
>> --
>> Shannon
>
> .
>
--
Shannon
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation
2015-06-08 1:52 ` Shannon Zhao
@ 2015-06-08 7:24 ` Michael S. Tsirkin
2015-06-08 12:59 ` Stefan Hajnoczi
2015-06-08 13:02 ` Stefan Hajnoczi
0 siblings, 2 replies; 16+ messages in thread
From: Michael S. Tsirkin @ 2015-06-08 7:24 UTC (permalink / raw)
To: Shannon Zhao
Cc: Peter Maydell, Eduardo Habkost, ghammer, qemu-devel, shannon.zhao,
stefanha, pbonzini, imammedo, lersek, Richard Henderson
On Mon, Jun 08, 2015 at 09:52:22AM +0800, Shannon Zhao wrote:
> > But how does one test ARM ACPI code?
> > Could you upload an image with instructions to the wiki?
> > http://wiki.qemu.org/System_Images
> >
>
> Ok, no problem. But I don't have an account of the wiki.
Stefan, you have admin rights there, right?
--
MST
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation
2015-06-08 7:24 ` Michael S. Tsirkin
@ 2015-06-08 12:59 ` Stefan Hajnoczi
2015-06-08 13:02 ` Stefan Hajnoczi
1 sibling, 0 replies; 16+ messages in thread
From: Stefan Hajnoczi @ 2015-06-08 12:59 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Peter Maydell, Eduardo Habkost, ghammer, qemu-devel, pbonzini,
shannon.zhao, Shannon Zhao, imammedo, lersek, Richard Henderson
[-- Attachment #1: Type: text/plain, Size: 430 bytes --]
On Mon, Jun 08, 2015 at 09:24:30AM +0200, Michael S. Tsirkin wrote:
> On Mon, Jun 08, 2015 at 09:52:22AM +0800, Shannon Zhao wrote:
> > > But how does one test ARM ACPI code?
> > > Could you upload an image with instructions to the wiki?
> > > http://wiki.qemu.org/System_Images
> > >
> >
> > Ok, no problem. But I don't have an account of the wiki.
>
> Stefan, you have admin rights there, right?
Done.
Stefan
[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation
2015-06-08 7:24 ` Michael S. Tsirkin
2015-06-08 12:59 ` Stefan Hajnoczi
@ 2015-06-08 13:02 ` Stefan Hajnoczi
1 sibling, 0 replies; 16+ messages in thread
From: Stefan Hajnoczi @ 2015-06-08 13:02 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Peter Maydell, Eduardo Habkost, ghammer, qemu-devel, pbonzini,
shannon.zhao, Shannon Zhao, imammedo, lersek, Richard Henderson
[-- Attachment #1: Type: text/plain, Size: 684 bytes --]
On Mon, Jun 08, 2015 at 09:24:30AM +0200, Michael S. Tsirkin wrote:
> On Mon, Jun 08, 2015 at 09:52:22AM +0800, Shannon Zhao wrote:
> > > But how does one test ARM ACPI code?
> > > Could you upload an image with instructions to the wiki?
> > > http://wiki.qemu.org/System_Images
> > >
> >
> > Ok, no problem. But I don't have an account of the wiki.
>
> Stefan, you have admin rights there, right?
For the record, all existing users can can create new accounts:
1. Log in: http://qemu-project.org/Special:UserLogin
2. Go to the login page again: http://qemu-project.org/Special:UserLogin
3. Click "Create account"
No special privileges are required.
Stefan
[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2015-06-08 13:02 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-04 16:21 [Qemu-devel] [PATCH 0/4] acpi: xsdt support Michael S. Tsirkin
2015-06-04 16:21 ` [Qemu-devel] [PATCH 1/4] acpi: add API for 64 bit offsets Michael S. Tsirkin
2015-06-05 2:38 ` Shannon Zhao
2015-06-04 16:21 ` [Qemu-devel] [PATCH 2/4] i386/acpi: collect 64 bit offsets for xsdt Michael S. Tsirkin
2015-06-04 16:21 ` [Qemu-devel] [PATCH 3/4] i386/acpi: add XSDT Michael S. Tsirkin
2015-06-05 2:38 ` Shannon Zhao
2015-06-07 9:42 ` Michael S. Tsirkin
2015-06-08 1:49 ` Shannon Zhao
2015-06-04 16:21 ` [Qemu-devel] [PATCH 4/4] acpi: unify rsdp generation Michael S. Tsirkin
2015-06-05 2:47 ` Shannon Zhao
2015-06-07 9:45 ` Michael S. Tsirkin
2015-06-08 1:52 ` Shannon Zhao
2015-06-08 7:24 ` Michael S. Tsirkin
2015-06-08 12:59 ` Stefan Hajnoczi
2015-06-08 13:02 ` Stefan Hajnoczi
2015-06-05 2:48 ` [Qemu-devel] [PATCH 0/4] acpi: xsdt support Shannon Zhao
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.