Message ID | 1513953351-22002-1-git-send-email-stefanb@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Dec 22, 2017 at 3:35 PM, Stefan Berger <stefanb@linux.vnet.ibm.com> wrote: > From: Stefan Berger <Stefan Berger stefanb@linux.vnet.ibm.com> > > More recent specs of the TPM2 ACPI table add fields for the log area > start address and the log area minimum size, which we already use > for the TCPA table. > > Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> I think ACPI tables change shouldn't fail migration, since tables are loaded by firmware, Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > hw/i386/acpi-build.c | 19 ++++++++++++++----- > include/hw/acpi/acpi-defs.h | 7 +++++-- > 2 files changed, 19 insertions(+), 7 deletions(-) > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index 5a6dee0..18b939e 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -2274,16 +2274,25 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) > } > > static void > -build_tpm2(GArray *table_data, BIOSLinker *linker) > +build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) > { > - Acpi20TPM2 *tpm2_ptr; > - > - tpm2_ptr = acpi_data_push(table_data, sizeof *tpm2_ptr); > + 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(tpm_find())) { > tpm2_ptr->control_area_address = cpu_to_le64(0); > tpm2_ptr->start_method = cpu_to_le32(TPM2_START_METHOD_MMIO); > + > + 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); > } else { > g_warn_if_reached(); > } > @@ -2695,7 +2704,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) > > if (misc.tpm_version == TPM_VERSION_2_0) { > acpi_add_table(table_offsets, tables_blob); > - build_tpm2(tables_blob, tables->linker); > + build_tpm2(tables_blob, tables->linker, tables->tcpalog); > } > } > if (pcms->numa_nodes) { > diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h > index 72be675..80c8099 100644 > --- a/include/hw/acpi/acpi-defs.h > +++ b/include/hw/acpi/acpi-defs.h > @@ -558,8 +558,8 @@ typedef struct Acpi20Tcpa Acpi20Tcpa; > /* > * TPM2 > * > - * Following Level 00, Rev 00.37 of specs: > - * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification > + * Following Version 1.2, Revision 8 of specs: > + * https://trustedcomputinggroup.org/tcg-acpi-specification/ > */ > struct Acpi20TPM2 { > ACPI_TABLE_HEADER_DEF > @@ -567,6 +567,9 @@ struct Acpi20TPM2 { > 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; > typedef struct Acpi20TPM2 Acpi20TPM2; > > -- > 2.5.5 > >
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 5a6dee0..18b939e 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -2274,16 +2274,25 @@ build_tpm_tcpa(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) } static void -build_tpm2(GArray *table_data, BIOSLinker *linker) +build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) { - Acpi20TPM2 *tpm2_ptr; - - tpm2_ptr = acpi_data_push(table_data, sizeof *tpm2_ptr); + 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(tpm_find())) { tpm2_ptr->control_area_address = cpu_to_le64(0); tpm2_ptr->start_method = cpu_to_le32(TPM2_START_METHOD_MMIO); + + 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); } else { g_warn_if_reached(); } @@ -2695,7 +2704,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) if (misc.tpm_version == TPM_VERSION_2_0) { acpi_add_table(table_offsets, tables_blob); - build_tpm2(tables_blob, tables->linker); + build_tpm2(tables_blob, tables->linker, tables->tcpalog); } } if (pcms->numa_nodes) { diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h index 72be675..80c8099 100644 --- a/include/hw/acpi/acpi-defs.h +++ b/include/hw/acpi/acpi-defs.h @@ -558,8 +558,8 @@ typedef struct Acpi20Tcpa Acpi20Tcpa; /* * TPM2 * - * Following Level 00, Rev 00.37 of specs: - * http://www.trustedcomputinggroup.org/resources/tcg_acpi_specification + * Following Version 1.2, Revision 8 of specs: + * https://trustedcomputinggroup.org/tcg-acpi-specification/ */ struct Acpi20TPM2 { ACPI_TABLE_HEADER_DEF @@ -567,6 +567,9 @@ struct Acpi20TPM2 { 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; typedef struct Acpi20TPM2 Acpi20TPM2;