Message ID | 20200611135917.18300-3-eric.auger@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vTPM/aarch64 ACPI support | expand |
On 6/11/20 9:59 AM, 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.auger@redhat.com> Reviewed-by: Stefan Berger <stefanb@linux.ibm.com> > --- > include/hw/acpi/aml-build.h | 2 ++ > hw/acpi/aml-build.c | 51 +++++++++++++++++++++++++++++++++++++ > hw/i386/acpi-build.c | 51 ------------------------------------- > 3 files changed, 53 insertions(+), 51 deletions(-) > > diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h > index ed7c89309e..d27da03d64 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 3681ec6e3d..2a1d9fc839 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) > { > @@ -1877,6 +1878,56 @@ build_hdr: > "FACP", tbl->len - fadt_start, f->rev, oem_id, oem_table_id); > } > > +void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) > +{ > + uint8_t start_method_params[12] = {}; > + unsigned log_addr_offset, tpm2_start; > + uint64_t control_area_start_address; > + uint32_t start_method; > + void *tpm2_ptr; > + > + tpm2_start = table_data->len; > + tpm2_ptr = acpi_data_push(table_data, sizeof(AcpiTableHeader)); > + > + /* Platform Class */ > + build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2); > + /* Reserved */ > + build_append_int_noprefix(table_data, 0, 2); > + if (TPM_IS_TIS_ISA(tpm_find())) { > + control_area_start_address = 0; > + start_method = TPM2_START_METHOD_MMIO; > + } else if (TPM_IS_CRB(tpm_find())) { > + control_area_start_address = TPM_CRB_ADDR_CTRL; > + start_method = TPM2_START_METHOD_CRB; > + } else { > + g_assert_not_reached(); > + } > + /* Address of Control Area */ > + build_append_int_noprefix(table_data, control_area_start_address, 8); > + /* Start Method */ > + build_append_int_noprefix(table_data, start_method, 4); > + > + /* Platform Specific Parameters */ > + g_array_append_vals(table_data, &start_method_params, > + ARRAY_SIZE(start_method_params)); > + > + /* Log Area Minimum Length */ > + build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4); > + > + acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE); > + bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1, > + false); > + > + log_addr_offset = table_data->len; > + build_append_int_noprefix(table_data, 0, 8); > + /* Log Area Start Address to be filled by Guest linker */ > + bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE, > + log_addr_offset, 8, > + ACPI_BUILD_TPMLOG_FILE, 0); > + build_header(linker, table_data, > + tpm2_ptr, "TPM2", table_data->len - tpm2_start, 4, NULL, NULL); > +} > + > /* ACPI 5.0: 6.4.3.8.2 Serial Bus Connection Descriptors */ > static Aml *aml_serial_bus_device(uint8_t serial_bus_type, uint8_t flags, > uint16_t type_flags, > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index f150d95ecc..b7c7583b5f 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -2295,57 +2295,6 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) > (void *)tcpa, "TCPA", sizeof(*tcpa), 2, NULL, NULL); > } > > -static void > -build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) > -{ > - uint8_t start_method_params[12] = {}; > - unsigned log_addr_offset, tpm2_start; > - uint64_t control_area_start_address; > - uint32_t start_method; > - void *tpm2_ptr; > - > - tpm2_start = table_data->len; > - tpm2_ptr = acpi_data_push(table_data, sizeof(AcpiTableHeader)); > - > - /* Platform Class */ > - build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2); > - /* Reserved */ > - build_append_int_noprefix(table_data, 0, 2); > - if (TPM_IS_TIS_ISA(tpm_find())) { > - control_area_start_address = 0; > - start_method = TPM2_START_METHOD_MMIO; > - } else if (TPM_IS_CRB(tpm_find())) { > - control_area_start_address = TPM_CRB_ADDR_CTRL; > - start_method = TPM2_START_METHOD_CRB; > - } else { > - g_assert_not_reached(); > - } > - /* Address of Control Area */ > - build_append_int_noprefix(table_data, control_area_start_address, 8); > - /* Start Method */ > - build_append_int_noprefix(table_data, start_method, 4); > - > - /* Platform Specific Parameters */ > - g_array_append_vals(table_data, &start_method_params, > - ARRAY_SIZE(start_method_params)); > - > - /* Log Area Minimum Length */ > - build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4); > - > - acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE); > - bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1, > - false); > - > - log_addr_offset = table_data->len; > - build_append_int_noprefix(table_data, 0, 8); > - /* Log Area Start Address to be filled by Guest linker */ > - bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE, > - log_addr_offset, 8, > - ACPI_BUILD_TPMLOG_FILE, 0); > - build_header(linker, table_data, > - tpm2_ptr, "TPM2", table_data->len - tpm2_start, 4, NULL, NULL); > -} > - > #define HOLE_640K_START (640 * KiB) > #define HOLE_640K_END (1 * MiB) >
diff --git a/include/hw/acpi/aml-build.h b/include/hw/acpi/aml-build.h index ed7c89309e..d27da03d64 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 3681ec6e3d..2a1d9fc839 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) { @@ -1877,6 +1878,56 @@ build_hdr: "FACP", tbl->len - fadt_start, f->rev, oem_id, oem_table_id); } +void build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) +{ + uint8_t start_method_params[12] = {}; + unsigned log_addr_offset, tpm2_start; + uint64_t control_area_start_address; + uint32_t start_method; + void *tpm2_ptr; + + tpm2_start = table_data->len; + tpm2_ptr = acpi_data_push(table_data, sizeof(AcpiTableHeader)); + + /* Platform Class */ + build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2); + /* Reserved */ + build_append_int_noprefix(table_data, 0, 2); + if (TPM_IS_TIS_ISA(tpm_find())) { + control_area_start_address = 0; + start_method = TPM2_START_METHOD_MMIO; + } else if (TPM_IS_CRB(tpm_find())) { + control_area_start_address = TPM_CRB_ADDR_CTRL; + start_method = TPM2_START_METHOD_CRB; + } else { + g_assert_not_reached(); + } + /* Address of Control Area */ + build_append_int_noprefix(table_data, control_area_start_address, 8); + /* Start Method */ + build_append_int_noprefix(table_data, start_method, 4); + + /* Platform Specific Parameters */ + g_array_append_vals(table_data, &start_method_params, + ARRAY_SIZE(start_method_params)); + + /* Log Area Minimum Length */ + build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4); + + acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE); + bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1, + false); + + log_addr_offset = table_data->len; + build_append_int_noprefix(table_data, 0, 8); + /* Log Area Start Address to be filled by Guest linker */ + bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE, + log_addr_offset, 8, + ACPI_BUILD_TPMLOG_FILE, 0); + build_header(linker, table_data, + tpm2_ptr, "TPM2", table_data->len - tpm2_start, 4, NULL, NULL); +} + /* ACPI 5.0: 6.4.3.8.2 Serial Bus Connection Descriptors */ static Aml *aml_serial_bus_device(uint8_t serial_bus_type, uint8_t flags, uint16_t type_flags, diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index f150d95ecc..b7c7583b5f 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -2295,57 +2295,6 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) (void *)tcpa, "TCPA", sizeof(*tcpa), 2, NULL, NULL); } -static void -build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) -{ - uint8_t start_method_params[12] = {}; - unsigned log_addr_offset, tpm2_start; - uint64_t control_area_start_address; - uint32_t start_method; - void *tpm2_ptr; - - tpm2_start = table_data->len; - tpm2_ptr = acpi_data_push(table_data, sizeof(AcpiTableHeader)); - - /* Platform Class */ - build_append_int_noprefix(table_data, TPM2_ACPI_CLASS_CLIENT, 2); - /* Reserved */ - build_append_int_noprefix(table_data, 0, 2); - if (TPM_IS_TIS_ISA(tpm_find())) { - control_area_start_address = 0; - start_method = TPM2_START_METHOD_MMIO; - } else if (TPM_IS_CRB(tpm_find())) { - control_area_start_address = TPM_CRB_ADDR_CTRL; - start_method = TPM2_START_METHOD_CRB; - } else { - g_assert_not_reached(); - } - /* Address of Control Area */ - build_append_int_noprefix(table_data, control_area_start_address, 8); - /* Start Method */ - build_append_int_noprefix(table_data, start_method, 4); - - /* Platform Specific Parameters */ - g_array_append_vals(table_data, &start_method_params, - ARRAY_SIZE(start_method_params)); - - /* Log Area Minimum Length */ - build_append_int_noprefix(table_data, TPM_LOG_AREA_MINIMUM_SIZE, 4); - - acpi_data_push(tcpalog, TPM_LOG_AREA_MINIMUM_SIZE); - bios_linker_loader_alloc(linker, ACPI_BUILD_TPMLOG_FILE, tcpalog, 1, - false); - - log_addr_offset = table_data->len; - build_append_int_noprefix(table_data, 0, 8); - /* Log Area Start Address to be filled by Guest linker */ - bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE, - log_addr_offset, 8, - ACPI_BUILD_TPMLOG_FILE, 0); - build_header(linker, table_data, - tpm2_ptr, "TPM2", table_data->len - tpm2_start, 4, NULL, NULL); -} - #define HOLE_640K_START (640 * KiB) #define HOLE_640K_END (1 * MiB)
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.auger@redhat.com> --- include/hw/acpi/aml-build.h | 2 ++ hw/acpi/aml-build.c | 51 +++++++++++++++++++++++++++++++++++++ hw/i386/acpi-build.c | 51 ------------------------------------- 3 files changed, 53 insertions(+), 51 deletions(-)