On 10/30/23 18:42, Stefan Berger wrote:
On 10/29/23 02:03, Joelle van Dyne wrote:
Signed-off-by: Joelle van Dyne <j...@getutm.app>
I see this error here with the test cases:
| 364/377 ERROR:../tests/qtest/bios-tables-test.c:535:test_acpi_asl:
assertion failed: (all_tables_match) ERROR
364/377 qemu:qtest+qtest-x86_64 /
qtest-x86_64/bios-tables-test ERROR 34.83s killed
by signal 6 SIGABRT
>>> QTEST_QEMU_BINARY=./qemu-system-x86_64 MALLOC_PERTURB_=200
QTEST_QEMU_IMG=./qemu-img
G_TEST_DBUS_DAEMON=/home/stefanb/qemu-tpm/tests/dbus-vmstate-daemon.sh
QTEST_QEMU_STORAGE_DAEMON_BINARY=./storage-daemon/qemu-storage-daemon
PYTHON=/home/stefanb/qemu-tpm/build/pyvenv/bin/python3
/home/stefanb/qemu-tpm/build/tests/qtest/bios-tables-test --tap -k
--------------------------------------------------------------- 8<
---------------------------------------------------------------
$ diff tests/data/acpi/virt/TPM2.crb-device.dsl /tmp/aml-98C6D2.dsl
6c6
< * Disassembly of tests/data/acpi/virt/TPM2.crb-device.tpm2, Mon Oct
30 18:30:00 2023
---
> * Disassembly of /tmp/aml-98C6D2, Mon Oct 30 18:29:29 2023
16c16
< [009h 0009 1] Checksum : BA
---
> [009h 0009 1] Checksum : C2
30c30
< [044h 0068 8] Log Address : 0000000043D10000
---
> [044h 0068 8] Log Address : 0000000043C90000
The diff is in the address of the TPM log ... Not good. I don't know
how we could have it ignore the address or not build the TPM2 table
with an address for a log. It would be good to have test cases.
Stefan
The log that the TPM2 ACPI table points to is needed for a BIOS, UEFI
does not need it (but we don't typically know whether BIOS or UEFI will
run). So we could introduce a property no-acpi-log and have the test
cases set this to 'on' and get a NULL pointer for the 'Log Address'. You
could use the following in a patch:
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index acc654382e..2b2de34201 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -2224,6 +2224,7 @@ void build_tpm2(GArray *table_data, BIOSLinker
*linker, GArray *tcpalog,
uint32_t start_method;
AcpiTable table = { .sig = "TPM2", .rev = 4,
.oem_id = oem_id, .oem_table_id = oem_table_id };
+ bool acpi_log = true;
acpi_table_begin(&table, table_data);
@@ -2238,6 +2239,7 @@ void build_tpm2(GArray *table_data, BIOSLinker
*linker, GArray *tcpalog,
control_area_start_address = TPM_CRB_ADDR_CTRL;
start_method = TPM2_START_METHOD_CRB;
} else if (TPM_IS_CRB_SYSBUS(tpmif)) {
+ acpi_log = !object_property_get_bool(OBJECT(tpmif),
"no-acpi-log", NULL);
baseaddr = object_property_get_uint(OBJECT(tpmif),
"x-baseaddr", NULL);
control_area_start_address = baseaddr + A_CRB_CTRL_REQ;
start_method = TPM2_START_METHOD_CRB;
@@ -2253,20 +2255,25 @@ void build_tpm2(GArray *table_data, BIOSLinker
*linker, GArray *tcpalog,
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);
+ if (acpi_log) {
+ /* 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);
+ 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;
+ log_addr_offset = table_data->len;
- /* Log Area Start Address to be filled by Guest linker */
- build_append_int_noprefix(table_data, 0, 8);
- bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
- log_addr_offset, 8,
- ACPI_BUILD_TPMLOG_FILE, 0);
+ /* Log Area Start Address to be filled by Guest linker */
+ build_append_int_noprefix(table_data, 0, 8);
+ bios_linker_loader_add_pointer(linker, ACPI_BUILD_TABLE_FILE,
+ log_addr_offset, 8,
+ ACPI_BUILD_TPMLOG_FILE, 0);
+ } else {
+ build_append_int_noprefix(table_data, 0, 4);
+ build_append_int_noprefix(table_data, 0, 8);
+ }
acpi_table_end(linker, &table);
}
#endif
diff --git a/hw/tpm/tpm_crb_sysbus.c b/hw/tpm/tpm_crb_sysbus.c
index c10a8b5639..aeeaba512b 100644
--- a/hw/tpm/tpm_crb_sysbus.c
+++ b/hw/tpm/tpm_crb_sysbus.c
@@ -35,6 +35,7 @@ struct TPMCRBStateSysBus {
TPMCRBState state;
uint64_t baseaddr;
uint64_t size;
+ bool no_acpi_log;
};
OBJECT_DECLARE_SIMPLE_TYPE(TPMCRBStateSysBus, TPM_CRB_SYSBUS)
@@ -74,6 +75,8 @@ static Property tpm_crb_sysbus_properties[] = {
baseaddr, TPM_CRB_ADDR_BASE),
DEFINE_PROP_UINT64("x-size", TPMCRBStateSysBus,
size, TPM_CRB_ADDR_SIZE),
+ DEFINE_PROP_BOOL("no-acpi-log", TPMCRBStateSysBus,
+ no_acpi_log, FALSE),
DEFINE_PROP_END_OF_LIST(),
};
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
index dea2a18158..9e8a02f924 100644
--- a/tests/qtest/bios-tables-test.c
+++ b/tests/qtest/bios-tables-test.c
@@ -1400,7 +1400,7 @@ static void test_acpi_tcg_tpm(const char *machine,
const char *tpm_if,
" %s"
" -chardev socket,id=chr,path=%s"
" -tpmdev emulator,id=dev,chardev=chr"
- " -device tpm-%s,tpmdev=dev",
+ " -device tpm-%s,tpmdev=dev,no-acpi-log=on",
g_strcmp0(machine, "virt") == 0 ? "-cpu cortex-a57" : "",
test.addr->u.q_unix.path, tpm_if);