This patch adds support for TPM command line options.
The command line options supported here are
./qemu-... -tpmdev passthrough,path=path to TPM device,id=id
-device tpm-tis,tpmdev=id
and
./qemu-... -tpmdev ?
where the latter works similar to -soundhw ? and shows a list of
available TPM backends (for example 'passthrough').
Using the type parameter, the backend is chosen, i.e., 'passthrough' for the
passthrough driver. The interpretation of the other parameters along
with determining whether enough parameters were provided is pushed into
the backend driver, which needs to implement the interface function
'create' and return a TPMDriver structure if the VM can be started or 'NULL'
if not enough or bad parameters were provided.
Monitor support for 'info tpm' has been added. It for example prints the
following:
(qemu) info tpm
TPM devices:
tpm0: model=tpm-tis
\ tpm0: type=passthrough,path=/dev/tpm0
v12:
- use all 4 bytes of the message length indicator
v10:
- tpm_display_backend_drivers always prints to stderr
v9:
- prefixing all functions with tpm_tis_ and all constants with TPM_TIS_
- splitting off of -tpm command line support into its own patch
- only support TPM passthrough for now
v8:
- adjusting formatting of backend drivers output to accomodate better
formatting of 'passthrough' backend output
v6:
- use #idef CONFIG_TPM to surround TPM calls
- use QLIST_FOREACH_SAFE rather than QLIST_FOREACH in tpm_cleanup
- commented backend ops in tpm.h
- moving to IRQ 5 (11 collided with network cards)
v5:
- fixing typo reported by Serge Hallyn
- Adapting code to split command line parameters supporting
-tpmdev ... -device tpm-tis,tpmdev=...
- moved code out of arch_init.c|h into tpm.c|h
- increasing reserved memory for ACPI tables to 128kb (from 64kb)
- the backend interface has a create() function for interpreting the command
line parameters and returning a TPMDevice structure; previoulsy
this function was called handle_options()
- the backend interface has a destroy() function for cleaning up after
the create() function was called
- added support for 'info tpm' in monitor
v4:
- coding style fixes
v3:
- added hw/tpm_tis.h to this patch so Qemu compiles at this stage
Signed-off-by: Stefan Berger stef...@linux.vnet.ibm.com
---
hmp-commands.hx |2
hw/tpm_tis.h| 91 ++
monitor.c | 10 +++
qemu-config.c | 20 ++
qemu-options.hx | 34 +++
tpm.c | 167
tpm.h | 90 ++
vl.c| 15 +
8 files changed, 429 insertions(+)
Index: qemu-git.pt/qemu-options.hx
===
--- qemu-git.pt.orig/qemu-options.hx
+++ qemu-git.pt/qemu-options.hx
@@ -1760,6 +1760,40 @@ ETEXI
DEFHEADING()
+DEFHEADING(TPM device options:)
+
+#ifndef _WIN32
+# ifdef CONFIG_TPM
+DEF(tpmdev, HAS_ARG, QEMU_OPTION_tpmdev, \
+-tpmdev [type],id=str[,option][,option][,...]\n,
+QEMU_ARCH_ALL)
+# endif
+#endif
+STEXI
+
+The general form of a TPM device option is:
+@table @option
+
+@item -tpmdev @var{backend} ,id=@var{id} [,@var{options}]
+@findex -tpmdev
+Backend type must be:
+
+The specific backend type will determine the applicable options.
+The @code{-tpmdev} options requires a @code{-device} option.
+
+Options to each backend are described below.
+
+Use ? to print all available TPM backend types.
+@example
+qemu -tpmdev ?
+@end example
+
+@end table
+
+ETEXI
+
+DEFHEADING()
+
DEFHEADING(Linux/Multiboot boot specific:)
STEXI
Index: qemu-git.pt/vl.c
===
--- qemu-git.pt.orig/vl.c
+++ qemu-git.pt/vl.c
@@ -139,6 +139,7 @@ int main(int argc, char **argv)
#include block.h
#include blockdev.h
#include block-migration.h
+#include tpm.h
#include dma.h
#include audio/audio.h
#include migration.h
@@ -2666,6 +2667,11 @@ int main(int argc, char **argv, char **e
ram_size = value;
break;
}
+#ifdef CONFIG_TPM
+case QEMU_OPTION_tpmdev:
+tpm_config_parse(qemu_find_opts(tpmdev), optarg);
+break;
+#endif
case QEMU_OPTION_mempath:
mem_path = optarg;
break;
@@ -3318,6 +3324,12 @@ int main(int argc, char **argv, char **e
exit(1);
}
+#ifdef CONFIG_TPM
+if (tpm_init() 0) {
+exit(1);
+}
+#endif
+
/* init the bluetooth world */
if (foreach_device_config(DEV_BT, bt_parse))
exit(1);
@@ -3564,6 +3576,9 @@ int main(int argc, char **argv, char **e
quit_timers();
net_cleanup();
res_free();
+#ifdef CONFIG_TPM
+tpm_cleanup();
+#endif
return 0;
}
Index: qemu-git.pt/qemu-config.c
===
--- qemu-git.pt.orig/qemu-config.c
+++