From: root <r...@k-d941f-5.watson.ibm.com> The following series of patches adds TPM (Trusted Platform Module) support to QEMU. An emulator for the TIS (TPM Interface Spec) interface is added that provides the basis for accessing a 'backend' implementing the actual TPM functionality. The TIS emulator serves as a 'frontend' enabling for example Linux's TPM TIS (tpm_tis) driver.
In this series I am posting a backend implementation that makes use of the host's TPM through a passthrough driver, which on Linux is accessed using /dev/tpm0. v25: - applies to checkout of 7d2a929fe (Feb. 21) - addressed comment from Corey Bryant on v25 - some build nits v24: - applies to checkout of 7d2a929fe (Feb. 19) - addressed comments from Andreas Faerber on v23 - added filtering for QMP query-tpm-models/types to only show those models and types that are active; each active model/type registers v23: - applies to checkout of 571f65ec2 (Feb. 14) - addressed comments from Corey Bryant on v22 v22: - applies to checkout of 571f65ec2 (Feb. 14) - addressed comments from Corey Bryant and Eric Blake on v21 v21: - applies to checkout of 70ef6a5b7 (Feb. 7) - addressed comments from Corey Bryant and Luiz Capitulino on v20 - adapted code to new directory structure: - split tpm.h into public part in include/tpm/tpm.h and private part in tpm/tpm_int.h - all TPM code is now in tpm/ directory v20: - applies to checkout of v1.3.0 (6d6c9f59, Dec. 3) - addressed comments from Corey Bryant on v19 - introduced support for canceling commands v19: - applies to checkout of 8cc9b43 (Jun 4) v18: - applies to checkout of 563987d (May 1) - removed some dead variable in 7/7 v17: - applies to checkout of 6507470 (Apr 30) - split up path and fd into two optional parameters v16: - applied to checkout of 42fe1c2 (Apr 27) - followed Anthony's suggestions for v15 - changed qemu-options.hx and vl.c to not show anything TPM-related if --enable-tpm-passthrough was not used on configure line v15: - applies to checkout of 8a22565 (Mar 27) - replacing g_malloc's with g_new; no more checks for NULL after allocs - introducing usage of bottom half in TIS frontend to deliver responses - get rid of locks since global lock is held by all threads entering TIS code - cleanups v14: - applies to checkout of da5361c (Dec 12) - implemented Anthony Liguori's suggestions - dropping the version log on individual patches v13: - applies to checkout of 61a5872 (Dec 12) - only allowing character devices as fd parameter - fixing error path in tpm_tis_init v12: - applies to checkout of ebffe2a (Oct 11) - added documentation for fd parameter - nits v11: - applies to checkout of 46f3069 (Sep 28) - some filing on the documentation - small nits fixed v10: - applies to checkout of 1ce9ce6 (Sep 27) - addressed Michael Tsirkin's comments on v9 v9: - addressed Michael Tsirkin's and other reviewers' comments - only posting Andreas Niederl's passthrough driver as the backend driver v8: - applies to checkout of f0fb8b7 (Aug 30) - fixing compilation error pointed out by Andreas Niederl - adding patch that allows to feed an initial state into the libtpms TPM - following memory API changes (glib) where necessary v7: - applies to checkout of b9c6cbf (Aug 9) - measuring the modules if multiboot is used - coding style fixes v6: - applies to checkout of 75ef849 (July 2nd) - some fixes and improvements to existing patches; see individual patches - added a patch with a null driver responding to all TPM requests with a response indicating failure; this backend has no dependencies and can alwayy be built; - added a patch to support the hashing of kernel, ramfs and command line if those were passed to Qemu using -kernel, -initrd and -append respectively. Measurements are taken, logged, and passed to SeaBIOS using the firmware interface. - libtpms revision 7 now requires 83kb of block storage due to having more NVRAM space v5: - applies to checkout of 1fddfba1 - adding support for split command line using the -tpmdev ... -device ... options while keeping the -tpm option - support for querying the device models using -tpm model=? - support for monitor 'info tpm' - adding documentation of command line options for man page and web page - increasing room for ACPI tables that qemu reserves to 128kb (from 64kb) - adding (experimental) support for block migration - adding (experimental) support for taking measurements when kernel, initrd and kernel command line are directly passed to Qemu v4: - applies to checkout of d2d979c6 - more coding style fixes - adding patch for supporting blob encryption (in addition to the existing QCoW2-level encryption) - this allows for graceful termination of a migration if the target is detected to have a wrong key - tested with big and little endian hosts - main thread releases mutex while checking for work to do on behalf of backend - introducing file locking (fcntl) on the block layer for serializing access to shared (QCoW2) files (used during migration) v3: - Building a null driver at patch 5/8 that responds to all requests with an error response; subsequently this driver is transformed to the libtpms-based driver for real TPM functionality - Reworked the threading; dropped the patch for qemu_thread_join; the main thread synchronizing with the TPM thread termination may need to write data to the block storage while waiting for the thread to terminate; did not previously show a problem but is safer - A lot of testing based on recent git checkout 4b4a72e5 (4/10): - migration of i686 VM from x86_64 host to i686 host to ppc64 host while running tests inside the VM - tests with S3 suspend/resume - tests with snapshots - multiple-hour tests with VM suspend/resume (using virsh save/restore) while running a TPM test suite inside the VM All tests passed; [not all of them were done on the ppc64 host] v2: - splitting some of the patches into smaller ones for easier review - fixes in individual patches Regards, Stefan Stefan Berger (7): Support for TPM command line options Add TPM (frontend) hardware interface (TPM TIS) to QEMU Add a debug register Build the TPM frontend code Add a TPM Passthrough backend driver implementation Add support for cancelling of a TPM command Build TPM passthrough for i386 and x86_64 targets Makefile.objs | 1 + configure | 11 + default-configs/i386-softmmu.mak | 2 + default-configs/x86_64-softmmu.mak | 2 + hmp-commands.hx | 2 + hmp.c | 44 ++ hmp.h | 1 + include/qemu/sockets.h | 1 + include/tpm/tpm.h | 21 + monitor.c | 8 + qapi-schema.json | 104 +++++ qemu-char.c | 24 + qemu-options.hx | 74 +++ qmp-commands.hx | 18 + tpm/Makefile.objs | 6 + tpm/tpm.c | 352 ++++++++++++++ tpm/tpm_backend.c | 58 +++ tpm/tpm_backend.h | 45 ++ tpm/tpm_int.h | 116 +++++ tpm/tpm_passthrough.c | 525 +++++++++++++++++++++ tpm/tpm_tis.c | 929 +++++++++++++++++++++++++++++++++++++ tpm/tpm_tis.h | 80 ++++ vl.c | 42 ++ 23 files changed, 2466 insertions(+) create mode 100644 include/tpm/tpm.h create mode 100644 tpm/Makefile.objs create mode 100644 tpm/tpm.c create mode 100644 tpm/tpm_backend.c create mode 100644 tpm/tpm_backend.h create mode 100644 tpm/tpm_int.h create mode 100644 tpm/tpm_passthrough.c create mode 100644 tpm/tpm_tis.c create mode 100644 tpm/tpm_tis.h -- 1.7.11.7