Quoting Stefan Berger (stef...@linux.vnet.ibm.com): > This patch adds the main code of the TPM frontend driver, the TPM TIS > interface, to Qemu. The code is largely based on my previous implementation > for Xen but has been significantly extended to meet the standard's > requirements, such as the support for changing of localities and all the > functionality of the available flags. > > Communication with the backend (i.e., for Xen or the libtpms-based one) > is cleanly separated through an interface which the backend driver needs > to implement. > > The TPM TIS driver's backend was previously chosen in the code added > to arch_init. The frontend holds a pointer to the chosen backend (interface). > > Communication with the backend is largely based on signals and conditions. > Whenever the frontend has collected a complete packet, it will signal > the backend, which then starts processing the command. Once the result > has been returned, the backend invokes a callback function > (tis_tpm_receive_cb()). > > The one tricky part is support for VM suspend while the TPM is processing > a command. In this case the frontend driver is waiting for the backend > to return the result of the last command before shutting down. It waits > on a condition for a signal from the backend, which is delivered in > tis_tpm_receive_cb(). > > Testing the proper functioning of the different flags and localities > cannot be done from user space when running in Linux for example, since > access to the address space of the TPM TIS interface is not possible. Also > the Linux driver itself does not exercise all functionality. So, for > testing there is a fairly extensive test suite as part of the SeaBIOS patches > since from within the BIOS one can have full access to all the TPM's > registers. > > v3: > - prefixing functions with tis_ > - added a function to the backend interface 'early_startup_tpm' that > allows to detect the presence of the block storage and gracefully fails > Qemu if it's not available. This works with migration using shared > storage but doesn't support migration with block storage migration. > For encyrypted QCoW2 and in case of a snapshot resue the late_startup_tpm > interface function is called > > Signed-off-by: Stefan Berger <stef...@linux.vnet.ibm.com>
Most of this is pretty foreign to me so this doesn't mean much, but Acked-by: Serge Hallyn <serge.hal...@ubuntu.com> > +/* Worth pointing out here that this is called with mutex held. > + * read a byte of response data > + */ > +static uint32_t tis_data_read(TPMState *s, uint8_t locty) > +{ > + uint32_t ret = TPM_NO_DATA_BYTE; > + uint16_t len; > + > + if ((s->loc[locty].sts & STS_DATA_AVAILABLE)) { > + len = tis_get_size_from_buffer(&s->loc[locty].r_buffer); > + > + ret = s->loc[locty].r_buffer.buffer[s->loc[locty].r_offset++]; > + if (s->loc[locty].r_offset >= len) { > + /* got last byte */ > + s->loc[locty].sts = STS_VALID;