Lines Matching +full:non +full:- +full:gracefully

7  *  Copyright (c) 2010 - 2013, 2018 IBM Corporation
30 #include "qemu/error-report.h"
34 #include "io/channel-socket.h"
43 #include "qapi/clone-visitor.h"
44 #include "qapi/qapi-visit-tpm.h"
45 #include "chardev/char-fe.h"
49 #define TYPE_TPM_EMULATOR "tpm-emulator"
52 #define TPM_EMULATOR_IMPLEMENTS_ALL_CAPS(S, cap) (((S)->caps & (cap)) == (cap))
129 CharBackend *dev = &tpm->ctrl_chr; in tpm_emulator_ctrlcmd()
134 WITH_QEMU_LOCK_GUARD(&tpm->mutex) { in tpm_emulator_ctrlcmd()
142 return -1; in tpm_emulator_ctrlcmd()
150 return -1; in tpm_emulator_ctrlcmd()
163 msg_len_out_total - msg_len_out_err); in tpm_emulator_ctrlcmd()
165 return -1; in tpm_emulator_ctrlcmd()
187 ret = qio_channel_write_all(tpm_emu->data_ioc, (char *)in, in_len, errp); in tpm_emulator_unix_tx_bufs()
189 return -1; in tpm_emulator_unix_tx_bufs()
192 ret = qio_channel_read_all(tpm_emu->data_ioc, (char *)out, in tpm_emulator_unix_tx_bufs()
195 return -1; in tpm_emulator_unix_tx_bufs()
198 ret = qio_channel_read_all(tpm_emu->data_ioc, in tpm_emulator_unix_tx_bufs()
200 tpm_cmd_get_size(out) - sizeof(struct tpm_resp_hdr), errp); in tpm_emulator_unix_tx_bufs()
202 return -1; in tpm_emulator_unix_tx_bufs()
217 if (tpm_emu->cur_locty_number == locty_number) { in tpm_emulator_set_locality()
228 error_setg(errp, "tpm-emulator: could not set locality : %s", in tpm_emulator_set_locality()
230 return -1; in tpm_emulator_set_locality()
235 error_setg(errp, "tpm-emulator: TPM result for set locality : 0x%x", in tpm_emulator_set_locality()
237 return -1; in tpm_emulator_set_locality()
240 tpm_emu->cur_locty_number = locty_number; in tpm_emulator_set_locality()
252 if (tpm_emulator_set_locality(tpm_emu, cmd->locty, errp) < 0 || in tpm_emulator_handle_request()
253 tpm_emulator_unix_tx_bufs(tpm_emu, cmd->in, cmd->in_len, in tpm_emulator_handle_request()
254 cmd->out, cmd->out_len, in tpm_emulator_handle_request()
255 &cmd->selftest_done, errp) < 0) { in tpm_emulator_handle_request()
256 tpm_util_write_fatal_error_response(cmd->out, cmd->out_len); in tpm_emulator_handle_request()
267 error_report("tpm-emulator: probing failed : %s", strerror(errno)); in tpm_emulator_probe_caps()
268 return -1; in tpm_emulator_probe_caps()
271 tpm_emu->caps = be32_to_cpu(cap_n.u.resp.caps); in tpm_emulator_probe_caps()
273 trace_tpm_emulator_probe_caps(tpm_emu->caps); in tpm_emulator_probe_caps()
284 switch (tpm_emu->tpm_version) { in tpm_emulator_check_caps()
298 error_report("tpm-emulator: TPM version has not been set"); in tpm_emulator_check_caps()
299 return -1; in tpm_emulator_check_caps()
303 error_report("tpm-emulator: TPM does not implement minimum set of " in tpm_emulator_check_caps()
305 return -1; in tpm_emulator_check_caps()
318 error_report("tpm-emulator: Could not stop TPM: %s", in tpm_emulator_stop_tpm()
320 return -1; in tpm_emulator_stop_tpm()
325 error_report("tpm-emulator: TPM result for CMD_STOP: 0x%x %s", res, in tpm_emulator_stop_tpm()
327 return -1; in tpm_emulator_stop_tpm()
347 error_report("tpm-emulator: Could not lock storage within 3 seconds: " in tpm_emulator_lock_storage()
349 return -1; in tpm_emulator_lock_storage()
354 error_report("tpm-emulator: TPM result for CMD_LOCK_STORAGE: 0x%x %s", in tpm_emulator_lock_storage()
357 return -1; in tpm_emulator_lock_storage()
371 return -1; in tpm_emulator_set_buffer_size()
379 error_report("tpm-emulator: Could not set buffer size: %s", in tpm_emulator_set_buffer_size()
381 return -1; in tpm_emulator_set_buffer_size()
386 error_report("tpm-emulator: TPM result for set buffer size : 0x%x %s", in tpm_emulator_set_buffer_size()
389 return -1; in tpm_emulator_set_buffer_size()
427 error_report("tpm-emulator: could not send INIT: %s", in tpm_emulator_startup_tpm_resume()
434 error_report("tpm-emulator: TPM result for CMD_INIT: 0x%x %s", res, in tpm_emulator_startup_tpm_resume()
441 return -1; in tpm_emulator_startup_tpm_resume()
463 if (tpm_emu->established_flag_cached) { in tpm_emulator_get_tpm_established_flag()
464 return tpm_emu->established_flag; in tpm_emulator_get_tpm_established_flag()
470 error_report("tpm-emulator: Could not get the TPM established flag: %s", in tpm_emulator_get_tpm_established_flag()
476 tpm_emu->established_flag_cached = 1; in tpm_emulator_get_tpm_established_flag()
477 tpm_emu->established_flag = (est.u.resp.bit != 0); in tpm_emulator_get_tpm_established_flag()
479 return tpm_emu->established_flag; in tpm_emulator_get_tpm_established_flag()
490 if (tpm_emu->tpm_version != TPM_VERSION_2_0) { in tpm_emulator_reset_tpm_established_flag()
494 reset_est.u.req.loc = tpm_emu->cur_locty_number; in tpm_emulator_reset_tpm_established_flag()
499 error_report("tpm-emulator: Could not reset the establishment bit: %s", in tpm_emulator_reset_tpm_established_flag()
501 return -1; in tpm_emulator_reset_tpm_established_flag()
507 "tpm-emulator: TPM result for rest established flag: 0x%x %s", in tpm_emulator_reset_tpm_established_flag()
509 return -1; in tpm_emulator_reset_tpm_established_flag()
512 tpm_emu->established_flag_cached = 0; in tpm_emulator_reset_tpm_established_flag()
527 /* FIXME: make the function non-blocking, or it may block a VCPU */ in tpm_emulator_cancel_cmd()
530 error_report("tpm-emulator: Could not cancel command: %s", in tpm_emulator_cancel_cmd()
533 error_report("tpm-emulator: Failed to cancel TPM: 0x%x", in tpm_emulator_cancel_cmd()
542 return tpm_emu->tpm_version; in tpm_emulator_get_tpm_version()
563 error_setg(&tpm_emu->migration_blocker, in tpm_emulator_block_migration()
566 if (migrate_add_blocker(&tpm_emu->migration_blocker, &err) < 0) { in tpm_emulator_block_migration()
568 return -1; in tpm_emulator_block_migration()
579 int fds[2] = { -1, -1 }; in tpm_emulator_prepare_data_fd()
582 error_report("tpm-emulator: Failed to create socketpair"); in tpm_emulator_prepare_data_fd()
583 return -1; in tpm_emulator_prepare_data_fd()
586 qemu_chr_fe_set_msgfds(&tpm_emu->ctrl_chr, fds + 1, 1); in tpm_emulator_prepare_data_fd()
590 error_report("tpm-emulator: Failed to send CMD_SET_DATAFD: %s", in tpm_emulator_prepare_data_fd()
595 tpm_emu->data_ioc = QIO_CHANNEL(qio_channel_socket_new_fd(fds[0], &err)); in tpm_emulator_prepare_data_fd()
597 error_prepend(&err, "tpm-emulator: Failed to create io channel: "); in tpm_emulator_prepare_data_fd()
609 return -1; in tpm_emulator_prepare_data_fd()
620 error_report("tpm-emulator: parameter 'chardev' is missing"); in tpm_emulator_handle_device_opts()
626 error_report("tpm-emulator: tpm chardev '%s' not found", value); in tpm_emulator_handle_device_opts()
630 if (!qemu_chr_fe_init(&tpm_emu->ctrl_chr, dev, &err)) { in tpm_emulator_handle_device_opts()
631 error_prepend(&err, "tpm-emulator: No valid chardev found at '%s':", in tpm_emulator_handle_device_opts()
637 tpm_emu->options->chardev = g_strdup(value); in tpm_emulator_handle_device_opts()
646 if (tpm_util_test_tpmdev(QIO_CHANNEL_SOCKET(tpm_emu->data_ioc)->fd, in tpm_emulator_handle_device_opts()
647 &tpm_emu->tpm_version)) { in tpm_emulator_handle_device_opts()
649 tpm_emu->options->chardev, strerror(errno)); in tpm_emulator_handle_device_opts()
653 switch (tpm_emu->tpm_version) { in tpm_emulator_handle_device_opts()
674 return -1; in tpm_emulator_handle_device_opts()
694 options->type = TPM_TYPE_EMULATOR; in tpm_emulator_get_tpm_options()
695 options->u.emulator.data = QAPI_CLONE(TPMEmulatorOptions, tpm_emu->options); in tpm_emulator_get_tpm_options()
705 .help = "Character device to use for out-of-band control messages",
739 error_report("tpm-emulator: could not get state blob type %d : %s", in tpm_emulator_get_state_blob()
741 return -1; in tpm_emulator_get_state_blob()
746 error_report("tpm-emulator: Getting the stateblob (type %d) failed " in tpm_emulator_get_state_blob()
749 return -1; in tpm_emulator_get_state_blob()
755 error_report("tpm-emulator: Expecting to read %u bytes " in tpm_emulator_get_state_blob()
757 return -1; in tpm_emulator_get_state_blob()
763 tsb->buffer = g_try_malloc(totlength); in tpm_emulator_get_state_blob()
764 if (!tsb->buffer) { in tpm_emulator_get_state_blob()
765 error_report("tpm-emulator: Out of memory allocating %u bytes", in tpm_emulator_get_state_blob()
767 return -1; in tpm_emulator_get_state_blob()
770 n = qemu_chr_fe_read_all(&tpm_emu->ctrl_chr, tsb->buffer, totlength); in tpm_emulator_get_state_blob()
772 error_report("tpm-emulator: Could not read stateblob (type %d); " in tpm_emulator_get_state_blob()
775 return -1; in tpm_emulator_get_state_blob()
778 tsb->size = totlength; in tpm_emulator_get_state_blob()
780 trace_tpm_emulator_get_state_blob(type, tsb->size, *flags); in tpm_emulator_get_state_blob()
787 TPMBlobBuffers *state_blobs = &tpm_emu->state_blobs; in tpm_emulator_get_state_blobs()
790 &state_blobs->permanent, in tpm_emulator_get_state_blobs()
791 &state_blobs->permanent_flags) < 0 || in tpm_emulator_get_state_blobs()
793 &state_blobs->volatil, in tpm_emulator_get_state_blobs()
794 &state_blobs->volatil_flags) < 0 || in tpm_emulator_get_state_blobs()
796 &state_blobs->savestate, in tpm_emulator_get_state_blobs()
797 &state_blobs->savestate_flags) < 0) { in tpm_emulator_get_state_blobs()
804 tpm_sized_buffer_reset(&state_blobs->volatil); in tpm_emulator_get_state_blobs()
805 tpm_sized_buffer_reset(&state_blobs->permanent); in tpm_emulator_get_state_blobs()
806 tpm_sized_buffer_reset(&state_blobs->savestate); in tpm_emulator_get_state_blobs()
808 return -1; in tpm_emulator_get_state_blobs()
828 if (tsb->size == 0) { in tpm_emulator_set_state_blob()
835 .u.req.length = cpu_to_be32(tsb->size), in tpm_emulator_set_state_blob()
841 error_report("tpm-emulator: could not set state blob type %d : %s", in tpm_emulator_set_state_blob()
843 return -1; in tpm_emulator_set_state_blob()
847 n = qemu_chr_fe_write_all(&tpm_emu->ctrl_chr, tsb->buffer, tsb->size); in tpm_emulator_set_state_blob()
848 if (n != tsb->size) { in tpm_emulator_set_state_blob()
849 error_report("tpm-emulator: Writing the stateblob (type %d) " in tpm_emulator_set_state_blob()
851 type, tsb->size, n); in tpm_emulator_set_state_blob()
852 return -1; in tpm_emulator_set_state_blob()
856 n = qemu_chr_fe_read_all(&tpm_emu->ctrl_chr, in tpm_emulator_set_state_blob()
859 error_report("tpm-emulator: Reading response from writing stateblob " in tpm_emulator_set_state_blob()
862 return -1; in tpm_emulator_set_state_blob()
867 error_report("tpm-emulator: Setting the stateblob (type %d) failed " in tpm_emulator_set_state_blob()
870 return -1; in tpm_emulator_set_state_blob()
873 trace_tpm_emulator_set_state_blob(type, tsb->size, flags); in tpm_emulator_set_state_blob()
886 TPMBlobBuffers *state_blobs = &tpm_emu->state_blobs; in tpm_emulator_set_state_blobs()
892 return -EIO; in tpm_emulator_set_state_blobs()
896 &state_blobs->permanent, in tpm_emulator_set_state_blobs()
897 state_blobs->permanent_flags) < 0 || in tpm_emulator_set_state_blobs()
899 &state_blobs->volatil, in tpm_emulator_set_state_blobs()
900 state_blobs->volatil_flags) < 0 || in tpm_emulator_set_state_blobs()
902 &state_blobs->savestate, in tpm_emulator_set_state_blobs()
903 state_blobs->savestate_flags) < 0) { in tpm_emulator_set_state_blobs()
904 return -EIO; in tpm_emulator_set_state_blobs()
925 tpm_emu->relock_storage = ret == 0; in tpm_emulator_pre_save()
938 if (!running || !tpm_emu->relock_storage) { in tpm_emulator_vm_state_change()
942 /* lock storage after migration fall-back */ in tpm_emulator_vm_state_change()
962 return -EIO; in tpm_emulator_post_load()
969 .name = "tpm-emulator",
1002 tpm_emu->options = g_new0(TPMEmulatorOptions, 1); in tpm_emulator_inst_init()
1003 tpm_emu->cur_locty_number = ~0; in tpm_emulator_inst_init()
1004 qemu_mutex_init(&tpm_emu->mutex); in tpm_emulator_inst_init()
1005 tpm_emu->vmstate = in tpm_emulator_inst_init()
1013 * Gracefully shut down the external TPM
1019 if (!tpm_emu->options->chardev) { in tpm_emulator_shutdown()
1026 error_report("tpm-emulator: Could not cleanly shutdown the TPM: %s", in tpm_emulator_shutdown()
1029 error_report("tpm-emulator: TPM result for shutdown: 0x%x %s", in tpm_emulator_shutdown()
1037 TPMBlobBuffers *state_blobs = &tpm_emu->state_blobs; in tpm_emulator_inst_finalize()
1041 object_unref(OBJECT(tpm_emu->data_ioc)); in tpm_emulator_inst_finalize()
1043 qemu_chr_fe_deinit(&tpm_emu->ctrl_chr, false); in tpm_emulator_inst_finalize()
1045 qapi_free_TPMEmulatorOptions(tpm_emu->options); in tpm_emulator_inst_finalize()
1047 migrate_del_blocker(&tpm_emu->migration_blocker); in tpm_emulator_inst_finalize()
1049 tpm_sized_buffer_reset(&state_blobs->volatil); in tpm_emulator_inst_finalize()
1050 tpm_sized_buffer_reset(&state_blobs->permanent); in tpm_emulator_inst_finalize()
1051 tpm_sized_buffer_reset(&state_blobs->savestate); in tpm_emulator_inst_finalize()
1053 qemu_mutex_destroy(&tpm_emu->mutex); in tpm_emulator_inst_finalize()
1054 qemu_del_vm_change_state_handler(tpm_emu->vmstate); in tpm_emulator_inst_finalize()
1063 tbc->type = TPM_TYPE_EMULATOR; in tpm_emulator_class_init()
1064 tbc->opts = tpm_emulator_cmdline_opts; in tpm_emulator_class_init()
1065 tbc->desc = "TPM emulator backend driver"; in tpm_emulator_class_init()
1066 tbc->create = tpm_emulator_create; in tpm_emulator_class_init()
1067 tbc->startup_tpm = tpm_emulator_startup_tpm; in tpm_emulator_class_init()
1068 tbc->cancel_cmd = tpm_emulator_cancel_cmd; in tpm_emulator_class_init()
1069 tbc->get_tpm_established_flag = tpm_emulator_get_tpm_established_flag; in tpm_emulator_class_init()
1070 tbc->reset_tpm_established_flag = tpm_emulator_reset_tpm_established_flag; in tpm_emulator_class_init()
1071 tbc->get_tpm_version = tpm_emulator_get_tpm_version; in tpm_emulator_class_init()
1072 tbc->get_buffer_size = tpm_emulator_get_buffer_size; in tpm_emulator_class_init()
1073 tbc->get_tpm_options = tpm_emulator_get_tpm_options; in tpm_emulator_class_init()
1075 tbc->handle_request = tpm_emulator_handle_request; in tpm_emulator_class_init()