static int tpm_passthrough_handle_device_opts(QemuOpts *opts, TPMBackend *tb) { TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb); const char *value; value = qemu_opt_get(opts, "cancel-path"); tb->cancel_path = g_strdup(value); value = qemu_opt_get(opts, "path"); if (!value) { value = TPM_PASSTHROUGH_DEFAULT_DEVICE; } tpm_pt->tpm_dev = g_strdup(value); tb->path = g_strdup(tpm_pt->tpm_dev); tpm_pt->tpm_fd = qemu_open(tpm_pt->tpm_dev, O_RDWR); if (tpm_pt->tpm_fd < 0) { error_report("Cannot access TPM device using '%s': %s", tpm_pt->tpm_dev, strerror(errno)); goto err_free_parameters; } if (tpm_util_test_tpmdev(tpm_pt->tpm_fd, &tpm_pt->tpm_version)) { error_report("'%s' is not a TPM device.", tpm_pt->tpm_dev); goto err_close_tpmdev; } return 0; err_close_tpmdev: qemu_close(tpm_pt->tpm_fd); tpm_pt->tpm_fd = -1; err_free_parameters: g_free(tb->path); tb->path = NULL; g_free(tpm_pt->tpm_dev); tpm_pt->tpm_dev = NULL; return 1; }
static int tpm_emulator_handle_device_opts(TPMEmulator *tpm_emu, QemuOpts *opts) { const char *value; 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 (tpm_emulator_prepare_data_fd(tpm_emu) < 0) { goto err; } /* FIXME: tpm_util_test_tpmdev() accepts only on socket fd, as it also used * by passthrough driver, which not yet using GIOChannel. */ if (tpm_util_test_tpmdev(QIO_CHANNEL_SOCKET(tpm_emu->data_ioc)->fd, &tpm_emu->tpm_version)) { error_report("'%s' is not emulating TPM device. Error: %s", tpm_emu->options->chardev, strerror(errno)); goto err; } switch (tpm_emu->tpm_version) { case TPM_VERSION_1_2: trace_tpm_emulator_handle_device_opts_tpm12(); break; case TPM_VERSION_2_0: trace_tpm_emulator_handle_device_opts_tpm2(); break; default: trace_tpm_emulator_handle_device_opts_unspec(); } if (tpm_emulator_probe_caps(tpm_emu) || tpm_emulator_check_caps(tpm_emu)) { goto err; } return tpm_emulator_block_migration(tpm_emu); err: trace_tpm_emulator_handle_device_opts_startup_error(); return -1; }