Re: [Qemu-devel] [PATCH V22 1/7] Support for TPM command line options
On 02/14/2013 04:43 PM, Stefan Berger wrote: 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 help 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 Signed-off-by: Stefan Berger stef...@linux.vnet.ibm.com --- Makefile.objs | 1 + hmp-commands.hx | 2 + hmp.c | 44 + hmp.h | 1 + include/tpm/tpm.h | 21 + monitor.c | 8 ++ qapi-schema.json | 83 + qemu-options.hx | 33 +++ qmp-commands.hx | 18 tpm/Makefile.objs | 1 + tpm/tpm.c | 272 ++ tpm/tpm_int.h | 79 tpm/tpm_tis.h | 78 vl.c | 37 14 files changed, 678 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_int.h create mode 100644 tpm/tpm_tis.h diff --git a/Makefile.objs b/Makefile.objs index 21e9c91..d52ea49 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -74,6 +74,7 @@ common-obj-y += bt-host.o bt-vhci.o common-obj-y += dma-helpers.o common-obj-y += qtest.o common-obj-y += vl.o +common-obj-y += tpm/ common-obj-$(CONFIG_SLIRP) += slirp/ diff --git a/hmp-commands.hx b/hmp-commands.hx index 64008a9..a952fd1 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1642,6 +1642,8 @@ show device tree show qdev device model list @item info roms show roms +@item info tpm +show the TPM device @end table ETEXI diff --git a/hmp.c b/hmp.c index 2f47a8a..b0a861c 100644 --- a/hmp.c +++ b/hmp.c @@ -607,6 +607,50 @@ void hmp_info_block_jobs(Monitor *mon, const QDict *qdict) } } +void hmp_info_tpm(Monitor *mon, const QDict *qdict) +{ +TPMInfoList *info_list, *info; +Error *err = NULL; +unsigned int c = 0; +TPMPassthroughOptions *tpo; + +info_list = qmp_query_tpm(err); +if (err) { +monitor_printf(mon, TPM device not supported\n); +error_free(err); +return; +} + +if (info_list) { +monitor_printf(mon, TPM device:\n); +} + +for (info = info_list; info; info = info-next) { +TPMInfo *ti = info-value; +monitor_printf(mon, tpm%d: model=%s\n, + c, TpmModel_lookup[ti-model]); + +monitor_printf(mon, \\ %s: type=%s, + ti-id, TpmType_lookup[ti-type]); + +switch (ti-tpm_options-kind) { +case TPM_TYPE_OPTIONS_KIND_TPM_PASSTHROUGH_OPTIONS: +tpo = ti-tpm_options-tpm_passthrough_options; +monitor_printf(mon, %s%s%s%s, + tpo-has_path ? ,path= : , + tpo-has_path ? tpo-path : , + tpo-has_cancel_path ? ,cancel-path= : , + tpo-has_cancel_path ? tpo-cancel_path : ); +break; +case TPM_TYPE_OPTIONS_KIND_MAX: +break; +} +monitor_printf(mon, \n); +c++; +} +qapi_free_TPMInfoList(info_list); +} + void hmp_quit(Monitor *mon, const QDict *qdict) { monitor_suspend(mon); diff --git a/hmp.h b/hmp.h index 30b3c20..95fe76e 100644 --- a/hmp.h +++ b/hmp.h @@ -36,6 +36,7 @@ void hmp_info_spice(Monitor *mon, const QDict *qdict); void hmp_info_balloon(Monitor *mon, const QDict *qdict); void hmp_info_pci(Monitor *mon, const QDict *qdict); void hmp_info_block_jobs(Monitor *mon, const QDict *qdict); +void hmp_info_tpm(Monitor *mon, const QDict *qdict); void hmp_quit(Monitor *mon, const QDict *qdict); void hmp_stop(Monitor *mon, const QDict *qdict); void hmp_system_reset(Monitor *mon, const QDict *qdict); diff --git a/include/tpm/tpm.h b/include/tpm/tpm.h new file mode 100644 index 000..cc8f20e --- /dev/null +++ b/include/tpm/tpm.h @@ -0,0 +1,21 @@ +/* + * Public TPM functions + * + * Copyright (C) 2011-2013 IBM Corporation + * + * Authors: + * Stefan Bergerstef...@us.ibm.com + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ +#ifndef QEMU_TPM_H +#define
Re: [Qemu-devel] [PATCH V22 1/7] Support for TPM command line options
On 02/14/2013 04:43 PM, Stefan Berger wrote: +/* + * Parse the TPM configuration options. + * To display all available TPM backends the user may use '-tpmdev ?' This comment is out of date. + */ +int tpm_config_parse(QemuOptsList *opts_list, const char *optarg) -- Regards, Corey Bryant
[Qemu-devel] [PATCH V22 1/7] Support for TPM command line options
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 help 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 Signed-off-by: Stefan Berger stef...@linux.vnet.ibm.com --- Makefile.objs | 1 + hmp-commands.hx | 2 + hmp.c | 44 + hmp.h | 1 + include/tpm/tpm.h | 21 + monitor.c | 8 ++ qapi-schema.json | 83 + qemu-options.hx | 33 +++ qmp-commands.hx | 18 tpm/Makefile.objs | 1 + tpm/tpm.c | 272 ++ tpm/tpm_int.h | 79 tpm/tpm_tis.h | 78 vl.c | 37 14 files changed, 678 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_int.h create mode 100644 tpm/tpm_tis.h diff --git a/Makefile.objs b/Makefile.objs index 21e9c91..d52ea49 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -74,6 +74,7 @@ common-obj-y += bt-host.o bt-vhci.o common-obj-y += dma-helpers.o common-obj-y += qtest.o common-obj-y += vl.o +common-obj-y += tpm/ common-obj-$(CONFIG_SLIRP) += slirp/ diff --git a/hmp-commands.hx b/hmp-commands.hx index 64008a9..a952fd1 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1642,6 +1642,8 @@ show device tree show qdev device model list @item info roms show roms +@item info tpm +show the TPM device @end table ETEXI diff --git a/hmp.c b/hmp.c index 2f47a8a..b0a861c 100644 --- a/hmp.c +++ b/hmp.c @@ -607,6 +607,50 @@ void hmp_info_block_jobs(Monitor *mon, const QDict *qdict) } } +void hmp_info_tpm(Monitor *mon, const QDict *qdict) +{ +TPMInfoList *info_list, *info; +Error *err = NULL; +unsigned int c = 0; +TPMPassthroughOptions *tpo; + +info_list = qmp_query_tpm(err); +if (err) { +monitor_printf(mon, TPM device not supported\n); +error_free(err); +return; +} + +if (info_list) { +monitor_printf(mon, TPM device:\n); +} + +for (info = info_list; info; info = info-next) { +TPMInfo *ti = info-value; +monitor_printf(mon, tpm%d: model=%s\n, + c, TpmModel_lookup[ti-model]); + +monitor_printf(mon, \\ %s: type=%s, + ti-id, TpmType_lookup[ti-type]); + +switch (ti-tpm_options-kind) { +case TPM_TYPE_OPTIONS_KIND_TPM_PASSTHROUGH_OPTIONS: +tpo = ti-tpm_options-tpm_passthrough_options; +monitor_printf(mon, %s%s%s%s, + tpo-has_path ? ,path= : , + tpo-has_path ? tpo-path : , + tpo-has_cancel_path ? ,cancel-path= : , + tpo-has_cancel_path ? tpo-cancel_path : ); +break; +case TPM_TYPE_OPTIONS_KIND_MAX: +break; +} +monitor_printf(mon, \n); +c++; +} +qapi_free_TPMInfoList(info_list); +} + void hmp_quit(Monitor *mon, const QDict *qdict) { monitor_suspend(mon); diff --git a/hmp.h b/hmp.h index 30b3c20..95fe76e 100644 --- a/hmp.h +++ b/hmp.h @@ -36,6 +36,7 @@ void hmp_info_spice(Monitor *mon, const QDict *qdict); void hmp_info_balloon(Monitor *mon, const QDict *qdict); void hmp_info_pci(Monitor *mon, const QDict *qdict); void hmp_info_block_jobs(Monitor *mon, const QDict *qdict); +void hmp_info_tpm(Monitor *mon, const QDict *qdict); void hmp_quit(Monitor *mon, const QDict *qdict); void hmp_stop(Monitor *mon, const QDict *qdict); void hmp_system_reset(Monitor *mon, const QDict *qdict); diff --git a/include/tpm/tpm.h b/include/tpm/tpm.h new file mode 100644 index 000..cc8f20e --- /dev/null +++ b/include/tpm/tpm.h @@ -0,0 +1,21 @@ +/* + * Public TPM functions + * + * Copyright (C) 2011-2013 IBM Corporation + * + * Authors: + * Stefan Bergerstef...@us.ibm.com + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ +#ifndef QEMU_TPM_H +#define QEMU_TPM_H + +#include qemu/option.h + +int tpm_config_parse(QemuOptsList *opts_list, const char