Merge tpm 2020/07/24 v1
-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEuBi5yt+QicLVzsZrda1lgCoLQhEFAl8beSIACgkQda1lgCoL QhEYJwf/X+mekAhZ1os77TvEbA+YVoPrXnPEu1UTWVHBWkmzQisk2eRMj1LlA2+T a+kEpbw+a1oc3GSWBHXJIVWuFOcA+GEDFerpQypSowAVJHPKam3xPBraP/R+bjXq e3D7WDMfjOE2sZ2Aj1I9sBZnKOI5yg9GcQ2PjB6btAB2eKJjns2myvhWiA5XEa/H l+eKtej3u8CvQ51vIrTxV/pvEqhPl1b4kvjj+40/COSMIcQ5OWdVk3de1ty9I8dP UjeaPRVXsJqYo/ZsUZS/uAdPIn8Ih77OtJRAEGSNe/KgttPQ/EG94mhiEws8xl+b JiV5HehRW0LB+f6eVGrQ0SbH7TCkCA== =/17e -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stefanberger/tags/pull-tpm-2020-07-24-1' into staging Merge tpm 2020/07/24 v1 # gpg: Signature made Sat 25 Jul 2020 01:13:22 BST # gpg: using RSA key B818B9CADF9089C2D5CEC66B75AD65802A0B4211 # gpg: Good signature from "Stefan Berger <stefanb@linux.vnet.ibm.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: B818 B9CA DF90 89C2 D5CE C66B 75AD 6580 2A0B 4211 * remotes/stefanberger/tags/pull-tpm-2020-07-24-1: tpm_emulator: Report an error if chardev is missing tpm: Improve help on TPM types when none are available Revert "tpm: Clean up error reporting in tpm_init_tpmdev()" Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
57cdde4a74
|
@ -549,27 +549,30 @@ err_exit:
|
|||
static int tpm_emulator_handle_device_opts(TPMEmulator *tpm_emu, QemuOpts *opts)
|
||||
{
|
||||
const char *value;
|
||||
Error *err = NULL;
|
||||
Chardev *dev;
|
||||
|
||||
value = qemu_opt_get(opts, "chardev");
|
||||
if (value) {
|
||||
Error *err = NULL;
|
||||
Chardev *dev = qemu_chr_find(value);
|
||||
|
||||
if (!dev) {
|
||||
error_report("tpm-emulator: tpm chardev '%s' not found.", value);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!qemu_chr_fe_init(&tpm_emu->ctrl_chr, dev, &err)) {
|
||||
error_prepend(&err, "tpm-emulator: No valid chardev found at '%s':",
|
||||
value);
|
||||
error_report_err(err);
|
||||
goto err;
|
||||
}
|
||||
|
||||
tpm_emu->options->chardev = g_strdup(value);
|
||||
if (!value) {
|
||||
error_report("tpm-emulator: parameter 'chardev' is missing");
|
||||
goto err;
|
||||
}
|
||||
|
||||
dev = qemu_chr_find(value);
|
||||
if (!dev) {
|
||||
error_report("tpm-emulator: tpm chardev '%s' not found", value);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!qemu_chr_fe_init(&tpm_emu->ctrl_chr, dev, &err)) {
|
||||
error_prepend(&err, "tpm-emulator: No valid chardev found at '%s':",
|
||||
value);
|
||||
error_report_err(err);
|
||||
goto err;
|
||||
}
|
||||
|
||||
tpm_emu->options->chardev = g_strdup(value);
|
||||
|
||||
if (tpm_emulator_prepare_data_fd(tpm_emu) < 0) {
|
||||
goto err;
|
||||
}
|
||||
|
@ -925,6 +928,11 @@ static void tpm_emulator_shutdown(TPMEmulator *tpm_emu)
|
|||
{
|
||||
ptm_res res;
|
||||
|
||||
if (!tpm_emu->options->chardev) {
|
||||
/* was never properly initialized */
|
||||
return;
|
||||
}
|
||||
|
||||
if (tpm_emulator_ctrlcmd(tpm_emu, CMD_SHUTDOWN, &res, 0, sizeof(res)) < 0) {
|
||||
error_report("tpm-emulator: Could not cleanly shutdown the TPM: %s",
|
||||
strerror(errno));
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
#include "qom/object.h"
|
||||
|
||||
int tpm_config_parse(QemuOptsList *opts_list, const char *optarg);
|
||||
void tpm_init(void);
|
||||
int tpm_init(void);
|
||||
void tpm_cleanup(void);
|
||||
|
||||
typedef enum TPMVersion {
|
||||
|
|
|
@ -4258,7 +4258,9 @@ void qemu_init(int argc, char **argv, char **envp)
|
|||
user_creatable_add_opts_foreach,
|
||||
object_create_delayed, &error_fatal);
|
||||
|
||||
tpm_init();
|
||||
if (tpm_init() < 0) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
blk_mig_init();
|
||||
ram_mig_init();
|
||||
|
|
|
@ -10,8 +10,9 @@
|
|||
#include "sysemu/tpm.h"
|
||||
#include "hw/acpi/tpm.h"
|
||||
|
||||
void tpm_init(void)
|
||||
int tpm_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void tpm_cleanup(void)
|
||||
|
|
43
tpm.c
43
tpm.c
|
@ -47,18 +47,23 @@ tpm_be_find_by_type(enum TpmType type)
|
|||
*/
|
||||
static void tpm_display_backend_drivers(void)
|
||||
{
|
||||
bool got_one = false;
|
||||
int i;
|
||||
|
||||
fprintf(stderr, "Supported TPM types (choose only one):\n");
|
||||
|
||||
for (i = 0; i < TPM_TYPE__MAX; i++) {
|
||||
const TPMBackendClass *bc = tpm_be_find_by_type(i);
|
||||
if (!bc) {
|
||||
continue;
|
||||
}
|
||||
fprintf(stderr, "%12s %s\n", TpmType_str(i), bc->desc);
|
||||
if (!got_one) {
|
||||
error_printf("Supported TPM types (choose only one):\n");
|
||||
got_one = true;
|
||||
}
|
||||
error_printf("%12s %s\n", TpmType_str(i), bc->desc);
|
||||
}
|
||||
if (!got_one) {
|
||||
error_printf("No TPM backend types are available\n");
|
||||
}
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -81,26 +86,33 @@ TPMBackend *qemu_find_tpm_be(const char *id)
|
|||
|
||||
static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
|
||||
{
|
||||
/*
|
||||
* Use of error_report() in a function with an Error ** parameter
|
||||
* is suspicious. It is okay here. The parameter only exists to
|
||||
* make the function usable with qemu_opts_foreach(). It is not
|
||||
* actually used.
|
||||
*/
|
||||
const char *value;
|
||||
const char *id;
|
||||
const TPMBackendClass *be;
|
||||
TPMBackend *drv;
|
||||
Error *local_err = NULL;
|
||||
int i;
|
||||
|
||||
if (!QLIST_EMPTY(&tpm_backends)) {
|
||||
error_setg(errp, "Only one TPM is allowed.");
|
||||
error_report("Only one TPM is allowed.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
id = qemu_opts_id(opts);
|
||||
if (id == NULL) {
|
||||
error_setg(errp, QERR_MISSING_PARAMETER, "id");
|
||||
error_report(QERR_MISSING_PARAMETER, "id");
|
||||
return 1;
|
||||
}
|
||||
|
||||
value = qemu_opt_get(opts, "type");
|
||||
if (!value) {
|
||||
error_setg(errp, QERR_MISSING_PARAMETER, "type");
|
||||
error_report(QERR_MISSING_PARAMETER, "type");
|
||||
tpm_display_backend_drivers();
|
||||
return 1;
|
||||
}
|
||||
|
@ -108,14 +120,15 @@ static int tpm_init_tpmdev(void *dummy, QemuOpts *opts, Error **errp)
|
|||
i = qapi_enum_parse(&TpmType_lookup, value, -1, NULL);
|
||||
be = i >= 0 ? tpm_be_find_by_type(i) : NULL;
|
||||
if (be == NULL) {
|
||||
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "type",
|
||||
"a TPM backend type");
|
||||
error_report(QERR_INVALID_PARAMETER_VALUE,
|
||||
"type", "a TPM backend type");
|
||||
tpm_display_backend_drivers();
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* validate backend specific opts */
|
||||
if (!qemu_opts_validate(opts, be->opts, errp)) {
|
||||
if (!qemu_opts_validate(opts, be->opts, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -148,10 +161,14 @@ void tpm_cleanup(void)
|
|||
* Initialize the TPM. Process the tpmdev command line options describing the
|
||||
* TPM backend.
|
||||
*/
|
||||
void tpm_init(void)
|
||||
int tpm_init(void)
|
||||
{
|
||||
qemu_opts_foreach(qemu_find_opts("tpmdev"),
|
||||
tpm_init_tpmdev, NULL, &error_fatal);
|
||||
if (qemu_opts_foreach(qemu_find_opts("tpmdev"),
|
||||
tpm_init_tpmdev, NULL, NULL)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue