On Wed, 6 May 2020 11:50:09 +0200 Auger Eric <eric.au...@redhat.com> wrote:
> 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. you can use g_array_append_vals() for adding byte array (even is it's all zeros) > While we are at it the tcpalog arg is not used. Shall I remove it? > > Thanks > > Eric > > > > > Thanks, > > drew > > > >