Message ID | 1431595182-7552-11-git-send-email-zhaoshenglong@huawei.com |
---|---|
State | Superseded |
Headers | show |
Shannon Zhao <zhaoshenglong@huawei.com> writes: > From: Shannon Zhao <shannon.zhao@linaro.org> > > RSDT points to other tables FADT, MADT, GTDT. This code is shared with x86. > > Here we still use RSDT as UEFI puts ACPI tables below 4G address space, > and UEFI ignore the RSDT or XSDT. > > Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com> > Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> > --- > hw/acpi/aml-build.c | 24 ++++++++++++++++++++++++ > hw/arm/virt-acpi-build.c | 3 +++ > hw/i386/acpi-build.c | 24 ------------------------ > include/hw/acpi/aml-build.h | 2 ++ > 4 files changed, 29 insertions(+), 24 deletions(-) > > diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c > index 7553bfc..b0e1dbc 100644 > --- a/hw/acpi/aml-build.c > +++ b/hw/acpi/aml-build.c > @@ -999,3 +999,27 @@ void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre) > g_array_free(tables->table_data, true); > g_array_free(tables->tcpalog, mfre); > } > + > +/* Build rsdt table */ > +void > +build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets) > +{ > + AcpiRsdtDescriptorRev1 *rsdt; > + size_t rsdt_len; > + int i; > + const int table_data_len = (sizeof(uint32_t) * table_offsets->len); > + > + 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); > + for (i = 0; i < table_offsets->len; ++i) { Why the prefix increment? > + /* rsdt->table_offset_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)); > + } > + build_header(linker, table_data, > + (void *)rsdt, "RSDT", rsdt_len, 1); > +} > diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c > index 24dde50..b50aee9 100644 > --- a/hw/arm/virt-acpi-build.c > +++ b/hw/arm/virt-acpi-build.c > @@ -319,6 +319,9 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables) > acpi_add_table(table_offsets, tables_blob); > build_gtdt(tables_blob, tables->linker); > > + /* RSDT is pointed to by RSDP */ > + build_rsdt(tables_blob, tables->linker, table_offsets); > + > /* 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 73259e7..5fb6bdb 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -1208,30 +1208,6 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc) > misc->dsdt_size, 1); > } > > -/* Build final rsdt table */ > -static void > -build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets) > -{ > - AcpiRsdtDescriptorRev1 *rsdt; > - size_t rsdt_len; > - int i; > - > - rsdt_len = sizeof(*rsdt) + sizeof(uint32_t) * table_offsets->len; > - rsdt = acpi_data_push(table_data, rsdt_len); > - memcpy(rsdt->table_offset_entry, table_offsets->data, > - sizeof(uint32_t) * table_offsets->len); > - for (i = 0; i < table_offsets->len; ++i) { > - /* rsdt->table_offset_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)); > - } > - build_header(linker, table_data, > - (void *)rsdt, "RSDT", rsdt_len, 1); > -} > - Ahh I see it came from the original code. > static GArray * > build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt) > { > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h > index 586a742..dd3b317 100644 > --- a/include/hw/acpi/aml-build.h > +++ b/include/hw/acpi/aml-build.h > @@ -274,5 +274,7 @@ unsigned acpi_data_len(GArray *table); > void acpi_add_table(GArray *table_offsets, GArray *table_data); > 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); > > #endif Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c index 7553bfc..b0e1dbc 100644 --- a/hw/acpi/aml-build.c +++ b/hw/acpi/aml-build.c @@ -999,3 +999,27 @@ void acpi_build_tables_cleanup(AcpiBuildTables *tables, bool mfre) g_array_free(tables->table_data, true); g_array_free(tables->tcpalog, mfre); } + +/* Build rsdt table */ +void +build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets) +{ + AcpiRsdtDescriptorRev1 *rsdt; + size_t rsdt_len; + int i; + const int table_data_len = (sizeof(uint32_t) * table_offsets->len); + + 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); + for (i = 0; i < table_offsets->len; ++i) { + /* rsdt->table_offset_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)); + } + build_header(linker, table_data, + (void *)rsdt, "RSDT", rsdt_len, 1); +} diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index 24dde50..b50aee9 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -319,6 +319,9 @@ void virt_acpi_build(VirtGuestInfo *guest_info, AcpiBuildTables *tables) acpi_add_table(table_offsets, tables_blob); build_gtdt(tables_blob, tables->linker); + /* RSDT is pointed to by RSDP */ + build_rsdt(tables_blob, tables->linker, table_offsets); + /* 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 73259e7..5fb6bdb 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -1208,30 +1208,6 @@ build_dsdt(GArray *table_data, GArray *linker, AcpiMiscInfo *misc) misc->dsdt_size, 1); } -/* Build final rsdt table */ -static void -build_rsdt(GArray *table_data, GArray *linker, GArray *table_offsets) -{ - AcpiRsdtDescriptorRev1 *rsdt; - size_t rsdt_len; - int i; - - rsdt_len = sizeof(*rsdt) + sizeof(uint32_t) * table_offsets->len; - rsdt = acpi_data_push(table_data, rsdt_len); - memcpy(rsdt->table_offset_entry, table_offsets->data, - sizeof(uint32_t) * table_offsets->len); - for (i = 0; i < table_offsets->len; ++i) { - /* rsdt->table_offset_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)); - } - build_header(linker, table_data, - (void *)rsdt, "RSDT", rsdt_len, 1); -} - static GArray * build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt) { diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h index 586a742..dd3b317 100644 --- a/include/hw/acpi/aml-build.h +++ b/include/hw/acpi/aml-build.h @@ -274,5 +274,7 @@ unsigned acpi_data_len(GArray *table); void acpi_add_table(GArray *table_offsets, GArray *table_data); 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); #endif