Hi, On 5/6/20 8:33 AM, Andrew Jones wrote: > On Tue, May 05, 2020 at 04:44:17PM +0200, Eric Auger wrote: >> We plan to build the tpm2 table on ARM too. In order to reuse the >> generation code, let's move build_tpm2() to aml-build.c. >> >> No change in the implementation. >> >> Signed-off-by: Eric Auger <eric.au...@redhat.com> >> --- >> include/hw/acpi/aml-build.h | 2 ++ >> hw/acpi/aml-build.c | 30 ++++++++++++++++++++++++++++++ >> hw/i386/acpi-build.c | 30 ------------------------------ >> 3 files changed, 32 insertions(+), 30 deletions(-) >> >> diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h >> index 0f4ed53d7f..a67ab4618a 100644 >> --- a/include/hw/acpi/aml-build.h >> +++ b/include/hw/acpi/aml-build.h >> @@ -437,4 +437,6 @@ void build_slit(GArray *table_data, BIOSLinker *linker, >> MachineState *ms); >> >> void build_fadt(GArray *tbl, BIOSLinker *linker, const AcpiFadtData *f, >> const char *oem_id, const char *oem_table_id); >> + >> +void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog); >> #endif >> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c >> index 2c3702b882..1f7fd09112 100644 >> --- a/hw/acpi/aml-build.c >> +++ b/hw/acpi/aml-build.c >> @@ -26,6 +26,7 @@ >> #include "qemu/bitops.h" >> #include "sysemu/numa.h" >> #include "hw/boards.h" >> +#include "hw/acpi/tpm.h" >> >> static GArray *build_alloc_array(void) >> { >> @@ -1875,6 +1876,35 @@ build_hdr: >> "FACP", tbl->len - fadt_start, f->rev, oem_id, >> oem_table_id); >> } >> >> +void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) >> +{ >> + Acpi20TPM2 *tpm2_ptr = acpi_data_push(table_data, sizeof *tpm2_ptr); >> + unsigned log_addr_size = sizeof(tpm2_ptr->log_area_start_address); >> + unsigned log_addr_offset = >> + (char *)&tpm2_ptr->log_area_start_address - table_data->data; >> + >> + tpm2_ptr->platform_class = cpu_to_le16(TPM2_ACPI_CLASS_CLIENT); >> + if (TPM_IS_TIS_ISA(tpm_find())) { >> + tpm2_ptr->control_area_address = cpu_to_le64(0); >> + tpm2_ptr->start_method = cpu_to_le32(TPM2_START_METHOD_MMIO); >> + } else if (TPM_IS_CRB(tpm_find())) { >> + tpm2_ptr->control_area_address = cpu_to_le64(TPM_CRB_ADDR_CTRL); >> + tpm2_ptr->start_method = cpu_to_le32(TPM2_START_METHOD_CRB); >> + } else { >> + g_warn_if_reached(); >> + } >> + >> + tpm2_ptr->log_area_minimum_length = >> + cpu_to_le32(TPM_LOG_AREA_MINIMUM_SIZE); >> + >> + /* log area start address to be filled by Guest linker */ >> + bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE, >> + log_addr_offset, log_addr_size, >> + ACPI_BUILD_TPMLOG_FILE, 0); >> + build_header(linker, table_data, >> + (void *)tpm2_ptr, "TPM2", sizeof(*tpm2_ptr), 4, NULL, >> NULL); >> +} >> + > > I'll let Igor and mst confirm/deny this, but my understanding was that the > build_append* API was the preferred way to create the table. Indeed, I > don't see too many table.field = cpu_to_le(...) lines in aml-build.c > > I realize this function is just getting moved, but maybe it should get > converted to the build_append* API while being moved?
The reason I did not convert is that the struct is as follows struct Acpi20TPM2 { ACPI_TABLE_HEADER_DEF uint16_t platform_class; uint16_t reserved; uint64_t control_area_address; uint32_t start_method; uint8_t start_method_params[12]; uint32_t log_area_minimum_length; uint64_t log_area_start_address; } QEMU_PACKED; If I understand correctly the build_append* adds the fields contiguously. It was not straightforward to me how to skip the start_method_params array. While we are at it the tcpalog arg is not used. Shall I remove it? Thanks Eric > > Thanks, > drew > >