1=============== 2QEMU TPM Device 3=============== 4 5Guest-side hardware interface 6============================= 7 8TIS interface 9------------- 10 11The QEMU TPM emulation implements a TPM TIS hardware interface 12following the Trusted Computing Group's specification "TCG PC Client 13Specific TPM Interface Specification (TIS)", Specification Version 141.3, 21 March 2013. (see the `TIS specification`_, or a later version 15of it). 16 17The TIS interface makes a memory mapped IO region in the area 180xfed40000-0xfed44fff available to the guest operating system. 19 20QEMU files related to TPM TIS interface: 21 - ``hw/tpm/tpm_tis_common.c`` 22 - ``hw/tpm/tpm_tis_isa.c`` 23 - ``hw/tpm/tpm_tis_sysbus.c`` 24 - ``hw/tpm/tpm_tis.h`` 25 26Both an ISA device and a sysbus device are available. The former is 27used with pc/q35 machine while the latter can be instantiated in the 28Arm virt machine. 29 30CRB interface 31------------- 32 33QEMU also implements a TPM CRB interface following the Trusted 34Computing Group's specification "TCG PC Client Platform TPM Profile 35(PTP) Specification", Family "2.0", Level 00 Revision 01.03 v22, May 3622, 2017. (see the `CRB specification`_, or a later version of it) 37 38The CRB interface makes a memory mapped IO region in the area 390xfed40000-0xfed40fff (1 locality) available to the guest 40operating system. 41 42QEMU files related to TPM CRB interface: 43 - ``hw/tpm/tpm_crb.c`` 44 45SPAPR interface 46--------------- 47 48pSeries (ppc64) machines offer a tpm-spapr device model. 49 50QEMU files related to the SPAPR interface: 51 - ``hw/tpm/tpm_spapr.c`` 52 53fw_cfg interface 54================ 55 56The bios/firmware may read the ``"etc/tpm/config"`` fw_cfg entry for 57configuring the guest appropriately. 58 59The entry of 6 bytes has the following content, in little-endian: 60 61.. code-block:: c 62 63 #define TPM_VERSION_UNSPEC 0 64 #define TPM_VERSION_1_2 1 65 #define TPM_VERSION_2_0 2 66 67 #define TPM_PPI_VERSION_NONE 0 68 #define TPM_PPI_VERSION_1_30 1 69 70 struct FwCfgTPMConfig { 71 uint32_t tpmppi_address; /* PPI memory location */ 72 uint8_t tpm_version; /* TPM version */ 73 uint8_t tpmppi_version; /* PPI version */ 74 }; 75 76ACPI interface 77============== 78 79The TPM device is defined with ACPI ID "PNP0C31". QEMU builds a SSDT 80and passes it into the guest through the fw_cfg device. The device 81description contains the base address of the TIS interface 0xfed40000 82and the size of the MMIO area (0x5000). In case a TPM2 is used by 83QEMU, a TPM2 ACPI table is also provided. The device is described to 84be used in polling mode rather than interrupt mode primarily because 85no unused IRQ could be found. 86 87To support measurement logs to be written by the firmware, 88e.g. SeaBIOS, a TCPA table is implemented. This table provides a 64kb 89buffer where the firmware can write its log into. For TPM 2 only a 90more recent version of the TPM2 table provides support for 91measurements logs and a TCPA table does not need to be created. 92 93The TCPA and TPM2 ACPI tables follow the Trusted Computing Group 94specification "TCG ACPI Specification" Family "1.2" and "2.0", Level 9500 Revision 00.37. (see the `ACPI specification`_, or a later version 96of it) 97 98ACPI PPI Interface 99------------------ 100 101QEMU supports the Physical Presence Interface (PPI) for TPM 1.2 and 102TPM 2. This interface requires ACPI and firmware support. (see the 103`PPI specification`_) 104 105PPI enables a system administrator (root) to request a modification to 106the TPM upon reboot. The PPI specification defines the operation 107requests and the actions the firmware has to take. The system 108administrator passes the operation request number to the firmware 109through an ACPI interface which writes this number to a memory 110location that the firmware knows. Upon reboot, the firmware finds the 111number and sends commands to the TPM. The firmware writes the TPM 112result code and the operation request number to a memory location that 113ACPI can read from and pass the result on to the administrator. 114 115The PPI specification defines a set of mandatory and optional 116operations for the firmware to implement. The ACPI interface also 117allows an administrator to list the supported operations. In QEMU the 118ACPI code is generated by QEMU, yet the firmware needs to implement 119support on a per-operations basis, and different firmwares may support 120a different subset. Therefore, QEMU introduces the virtual memory 121device for PPI where the firmware can indicate which operations it 122supports and ACPI can enable the ones that are supported and disable 123all others. This interface lies in main memory and has the following 124layout: 125 126 +-------------+--------+--------+-------------------------------------------+ 127 | Field | Length | Offset | Description | 128 +=============+========+========+===========================================+ 129 | ``func`` | 0x100 | 0x000 | Firmware sets values for each supported | 130 | | | | operation. See defined values below. | 131 +-------------+--------+--------+-------------------------------------------+ 132 | ``ppin`` | 0x1 | 0x100 | SMI interrupt to use. Set by firmware. | 133 | | | | Not supported. | 134 +-------------+--------+--------+-------------------------------------------+ 135 | ``ppip`` | 0x4 | 0x101 | ACPI function index to pass to SMM code. | 136 | | | | Set by ACPI. Not supported. | 137 +-------------+--------+--------+-------------------------------------------+ 138 | ``pprp`` | 0x4 | 0x105 | Result of last executed operation. Set by | 139 | | | | firmware. See function index 5 for values.| 140 +-------------+--------+--------+-------------------------------------------+ 141 | ``pprq`` | 0x4 | 0x109 | Operation request number to execute. See | 142 | | | | 'Physical Presence Interface Operation | 143 | | | | Summary' tables in specs. Set by ACPI. | 144 +-------------+--------+--------+-------------------------------------------+ 145 | ``pprm`` | 0x4 | 0x10d | Operation request optional parameter. | 146 | | | | Values depend on operation. Set by ACPI. | 147 +-------------+--------+--------+-------------------------------------------+ 148 | ``lppr`` | 0x4 | 0x111 | Last executed operation request number. | 149 | | | | Copied from pprq field by firmware. | 150 +-------------+--------+--------+-------------------------------------------+ 151 | ``fret`` | 0x4 | 0x115 | Result code from SMM function. | 152 | | | | Not supported. | 153 +-------------+--------+--------+-------------------------------------------+ 154 | ``res1`` | 0x40 | 0x119 | Reserved for future use | 155 +-------------+--------+--------+-------------------------------------------+ 156 |``next_step``| 0x1 | 0x159 | Operation to execute after reboot by | 157 | | | | firmware. Used by firmware. | 158 +-------------+--------+--------+-------------------------------------------+ 159 | ``movv`` | 0x1 | 0x15a | Memory overwrite variable | 160 +-------------+--------+--------+-------------------------------------------+ 161 162The following values are supported for the ``func`` field. They 163correspond to the values used by ACPI function index 8. 164 165 +----------+-------------------------------------------------------------+ 166 | Value | Description | 167 +==========+=============================================================+ 168 | 0 | Operation is not implemented. | 169 +----------+-------------------------------------------------------------+ 170 | 1 | Operation is only accessible through firmware. | 171 +----------+-------------------------------------------------------------+ 172 | 2 | Operation is blocked for OS by firmware configuration. | 173 +----------+-------------------------------------------------------------+ 174 | 3 | Operation is allowed and physically present user required. | 175 +----------+-------------------------------------------------------------+ 176 | 4 | Operation is allowed and physically present user is not | 177 | | required. | 178 +----------+-------------------------------------------------------------+ 179 180The location of the table is given by the fw_cfg ``tpmppi_address`` 181field. The PPI memory region size is 0x400 (``TPM_PPI_ADDR_SIZE``) to 182leave enough room for future updates. 183 184QEMU files related to TPM ACPI tables: 185 - ``hw/i386/acpi-build.c`` 186 - ``include/hw/acpi/tpm.h`` 187 188TPM backend devices 189=================== 190 191The TPM implementation is split into two parts, frontend and 192backend. The frontend part is the hardware interface, such as the TPM 193TIS interface described earlier, and the other part is the TPM backend 194interface. The backend interfaces implement the interaction with a TPM 195device, which may be a physical or an emulated device. The split 196between the front- and backend devices allows a frontend to be 197connected with any available backend. This enables the TIS interface 198to be used with the passthrough backend or the swtpm backend. 199 200QEMU files related to TPM backends: 201 - ``backends/tpm.c`` 202 - ``include/sysemu/tpm_backend.h`` 203 - ``include/sysemu/tpm_backend_int.h`` 204 205The QEMU TPM passthrough device 206------------------------------- 207 208In case QEMU is run on Linux as the host operating system it is 209possible to make the hardware TPM device available to a single QEMU 210guest. In this case the user must make sure that no other program is 211using the device, e.g., /dev/tpm0, before trying to start QEMU with 212it. 213 214The passthrough driver uses the host's TPM device for sending TPM 215commands and receiving responses from. Besides that it accesses the 216TPM device's sysfs entry for support of command cancellation. Since 217none of the state of a hardware TPM can be migrated between hosts, 218virtual machine migration is disabled when the TPM passthrough driver 219is used. 220 221Since the host's TPM device will already be initialized by the host's 222firmware, certain commands, e.g. ``TPM_Startup()``, sent by the 223virtual firmware for device initialization, will fail. In this case 224the firmware should not use the TPM. 225 226Sharing the device with the host is generally not a recommended usage 227scenario for a TPM device. The primary reason for this is that two 228operating systems can then access the device's single set of 229resources, such as platform configuration registers 230(PCRs). Applications or kernel security subsystems, such as the Linux 231Integrity Measurement Architecture (IMA), are not expecting to share 232PCRs. 233 234QEMU files related to the TPM passthrough device: 235 - ``hw/tpm/tpm_passthrough.c`` 236 - ``hw/tpm/tpm_util.c`` 237 - ``hw/tpm/tpm_util.h`` 238 239 240Command line to start QEMU with the TPM passthrough device using the host's 241hardware TPM ``/dev/tpm0``: 242 243.. code-block:: console 244 245 qemu-system-x86_64 -display sdl -accel kvm \ 246 -m 1024 -boot d -bios bios-256k.bin -boot menu=on \ 247 -tpmdev passthrough,id=tpm0,path=/dev/tpm0 \ 248 -device tpm-tis,tpmdev=tpm0 test.img 249 250 251The following commands should result in similar output inside the VM 252with a Linux kernel that either has the TPM TIS driver built-in or 253available as a module: 254 255.. code-block:: console 256 257 # dmesg | grep -i tpm 258 [ 0.711310] tpm_tis 00:06: 1.2 TPM (device=id 0x1, rev-id 1) 259 260 # dmesg | grep TCPA 261 [ 0.000000] ACPI: TCPA 0x0000000003FFD191C 000032 (v02 BOCHS \ 262 BXPCTCPA 0000001 BXPC 00000001) 263 264 # ls -l /dev/tpm* 265 crw-------. 1 root root 10, 224 Jul 11 10:11 /dev/tpm0 266 267 # find /sys/devices/ | grep pcrs$ | xargs cat 268 PCR-00: 35 4E 3B CE 23 9F 38 59 ... 269 ... 270 PCR-23: 00 00 00 00 00 00 00 00 ... 271 272The QEMU TPM emulator device 273---------------------------- 274 275The TPM emulator device uses an external TPM emulator called 'swtpm' 276for sending TPM commands to and receiving responses from. The swtpm 277program must have been started before trying to access it through the 278TPM emulator with QEMU. 279 280The TPM emulator implements a command channel for transferring TPM 281commands and responses as well as a control channel over which control 282commands can be sent. (see the `SWTPM protocol`_ specification) 283 284The control channel serves the purpose of resetting, initializing, and 285migrating the TPM state, among other things. 286 287The swtpm program behaves like a hardware TPM and therefore needs to 288be initialized by the firmware running inside the QEMU virtual 289machine. One necessary step for initializing the device is to send 290the TPM_Startup command to it. SeaBIOS, for example, has been 291instrumented to initialize a TPM 1.2 or TPM 2 device using this 292command. 293 294QEMU files related to the TPM emulator device: 295 - ``hw/tpm/tpm_emulator.c`` 296 - ``hw/tpm/tpm_util.c`` 297 - ``hw/tpm/tpm_util.h`` 298 299The following commands start the swtpm with a UnixIO control channel over 300a socket interface. They do not need to be run as root. 301 302.. code-block:: console 303 304 mkdir /tmp/mytpm1 305 swtpm socket --tpmstate dir=/tmp/mytpm1 \ 306 --ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock \ 307 --log level=20 308 309Command line to start QEMU with the TPM emulator device communicating 310with the swtpm (x86): 311 312.. code-block:: console 313 314 qemu-system-x86_64 -display sdl -accel kvm \ 315 -m 1024 -boot d -bios bios-256k.bin -boot menu=on \ 316 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \ 317 -tpmdev emulator,id=tpm0,chardev=chrtpm \ 318 -device tpm-tis,tpmdev=tpm0 test.img 319 320In case a pSeries machine is emulated, use the following command line: 321 322.. code-block:: console 323 324 qemu-system-ppc64 -display sdl -machine pseries,accel=kvm \ 325 -m 1024 -bios slof.bin -boot menu=on \ 326 -nodefaults -device VGA -device pci-ohci -device usb-kbd \ 327 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \ 328 -tpmdev emulator,id=tpm0,chardev=chrtpm \ 329 -device tpm-spapr,tpmdev=tpm0 \ 330 -device spapr-vscsi,id=scsi0,reg=0x00002000 \ 331 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,id=virtio-disk0 \ 332 -drive file=test.img,format=raw,if=none,id=drive-virtio-disk0 333 334In case an Arm virt machine is emulated, use the following command line: 335 336.. code-block:: console 337 338 qemu-system-aarch64 -machine virt,gic-version=3,accel=kvm \ 339 -cpu host -m 4G \ 340 -nographic -no-acpi \ 341 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \ 342 -tpmdev emulator,id=tpm0,chardev=chrtpm \ 343 -device tpm-tis-device,tpmdev=tpm0 \ 344 -device virtio-blk-pci,drive=drv0 \ 345 -drive format=qcow2,file=hda.qcow2,if=none,id=drv0 \ 346 -drive if=pflash,format=raw,file=flash0.img,readonly \ 347 -drive if=pflash,format=raw,file=flash1.img 348 349 On Arm, ACPI boot with TPM is not yet supported. 350 351In case SeaBIOS is used as firmware, it should show the TPM menu item 352after entering the menu with 'ESC'. 353 354.. code-block:: console 355 356 Select boot device: 357 1. DVD/CD [ata1-0: QEMU DVD-ROM ATAPI-4 DVD/CD] 358 [...] 359 5. Legacy option rom 360 361 t. TPM Configuration 362 363The following commands should result in similar output inside the VM 364with a Linux kernel that either has the TPM TIS driver built-in or 365available as a module: 366 367.. code-block:: console 368 369 # dmesg | grep -i tpm 370 [ 0.711310] tpm_tis 00:06: 1.2 TPM (device=id 0x1, rev-id 1) 371 372 # dmesg | grep TCPA 373 [ 0.000000] ACPI: TCPA 0x0000000003FFD191C 000032 (v02 BOCHS \ 374 BXPCTCPA 0000001 BXPC 00000001) 375 376 # ls -l /dev/tpm* 377 crw-------. 1 root root 10, 224 Jul 11 10:11 /dev/tpm0 378 379 # find /sys/devices/ | grep pcrs$ | xargs cat 380 PCR-00: 35 4E 3B CE 23 9F 38 59 ... 381 ... 382 PCR-23: 00 00 00 00 00 00 00 00 ... 383 384Migration with the TPM emulator 385=============================== 386 387The TPM emulator supports the following types of virtual machine 388migration: 389 390- VM save / restore (migration into a file) 391- Network migration 392- Snapshotting (migration into storage like QoW2 or QED) 393 394The following command sequences can be used to test VM save / restore. 395 396In a 1st terminal start an instance of a swtpm using the following command: 397 398.. code-block:: console 399 400 mkdir /tmp/mytpm1 401 swtpm socket --tpmstate dir=/tmp/mytpm1 \ 402 --ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock \ 403 --log level=20 --tpm2 404 405In a 2nd terminal start the VM: 406 407.. code-block:: console 408 409 qemu-system-x86_64 -display sdl -accel kvm \ 410 -m 1024 -boot d -bios bios-256k.bin -boot menu=on \ 411 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \ 412 -tpmdev emulator,id=tpm0,chardev=chrtpm \ 413 -device tpm-tis,tpmdev=tpm0 \ 414 -monitor stdio \ 415 test.img 416 417Verify that the attached TPM is working as expected using applications 418inside the VM. 419 420To store the state of the VM use the following command in the QEMU 421monitor in the 2nd terminal: 422 423.. code-block:: console 424 425 (qemu) migrate "exec:cat > testvm.bin" 426 (qemu) quit 427 428At this point a file called ``testvm.bin`` should exists and the swtpm 429and QEMU processes should have ended. 430 431To test 'VM restore' you have to start the swtpm with the same 432parameters as before. If previously a TPM 2 [--tpm2] was saved, --tpm2 433must now be passed again on the command line. 434 435In the 1st terminal restart the swtpm with the same command line as 436before: 437 438.. code-block:: console 439 440 swtpm socket --tpmstate dir=/tmp/mytpm1 \ 441 --ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock \ 442 --log level=20 --tpm2 443 444In the 2nd terminal restore the state of the VM using the additional 445'-incoming' option. 446 447.. code-block:: console 448 449 qemu-system-x86_64 -display sdl -accel kvm \ 450 -m 1024 -boot d -bios bios-256k.bin -boot menu=on \ 451 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \ 452 -tpmdev emulator,id=tpm0,chardev=chrtpm \ 453 -device tpm-tis,tpmdev=tpm0 \ 454 -incoming "exec:cat < testvm.bin" \ 455 test.img 456 457Troubleshooting migration 458------------------------- 459 460There are several reasons why migration may fail. In case of problems, 461please ensure that the command lines adhere to the following rules 462and, if possible, that identical versions of QEMU and swtpm are used 463at all times. 464 465VM save and restore: 466 467 - QEMU command line parameters should be identical apart from the 468 '-incoming' option on VM restore 469 470 - swtpm command line parameters should be identical 471 472VM migration to 'localhost': 473 474 - QEMU command line parameters should be identical apart from the 475 '-incoming' option on the destination side 476 477 - swtpm command line parameters should point to two different 478 directories on the source and destination swtpm (--tpmstate dir=...) 479 (especially if different versions of libtpms were to be used on the 480 same machine). 481 482VM migration across the network: 483 484 - QEMU command line parameters should be identical apart from the 485 '-incoming' option on the destination side 486 487 - swtpm command line parameters should be identical 488 489VM Snapshotting: 490 - QEMU command line parameters should be identical 491 492 - swtpm command line parameters should be identical 493 494 495Besides that, migration failure reasons on the swtpm level may include 496the following: 497 498 - the versions of the swtpm on the source and destination sides are 499 incompatible 500 501 - downgrading of TPM state may not be supported 502 503 - the source and destination libtpms were compiled with different 504 compile-time options and the destination side refuses to accept the 505 state 506 507 - different migration keys are used on the source and destination side 508 and the destination side cannot decrypt the migrated state 509 (swtpm ... --migration-key ... ) 510 511 512.. _TIS specification: 513 https://trustedcomputinggroup.org/pc-client-work-group-pc-client-specific-tpm-interface-specification-tis/ 514 515.. _CRB specification: 516 https://trustedcomputinggroup.org/resource/pc-client-platform-tpm-profile-ptp-specification/ 517 518 519.. _ACPI specification: 520 https://trustedcomputinggroup.org/tcg-acpi-specification/ 521 522.. _PPI specification: 523 https://trustedcomputinggroup.org/resource/tcg-physical-presence-interface-specification/ 524 525.. _SWTPM protocol: 526 https://github.com/stefanberger/swtpm/blob/master/man/man3/swtpm_ioctls.pod 527