SEV launch flow requires us to issue LAUNCH_FINISH command before guest is ready to run. Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> Cc: kvm@xxxxxxxxxxxxxxx Signed-off-by: Brijesh Singh <brijesh.singh@xxxxxxx> --- accel/kvm/sev.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/accel/kvm/sev.c b/accel/kvm/sev.c index c0eea371fa06..fbbd99becc0a 100644 --- a/accel/kvm/sev.c +++ b/accel/kvm/sev.c @@ -454,6 +454,35 @@ static Notifier sev_machine_done_notify = { .notify = sev_launch_get_measure, }; +static void +sev_launch_finish(SEVState *s) +{ + int ret, error; + + ret = sev_ioctl(KVM_SEV_LAUNCH_FINISH, 0, &error); + if (ret) { + error_report("%s: LAUNCH_FINISH ret=%d fw_error=%d '%s'", + __func__, ret, error, fw_error_to_str(error)); + exit(1); + } + + s->cur_state = SEV_STATE_RUNNING; + DPRINTF("SEV: LAUNCH_FINISH\n"); +} + +static void +sev_vm_state_change(void *opaque, int running, RunState state) +{ + SEVState *s = opaque; + + if (running) { + /* we are about to resume the guest, finalize the launch flow */ + if (s->cur_state == SEV_STATE_SECRET) { + sev_launch_finish(s); + } + } +} + void * sev_guest_init(const char *id) { @@ -497,6 +526,7 @@ sev_guest_init(const char *id) ram_block_notifier_add(&sev_ram_notifier); qemu_add_machine_init_done_notifier(&sev_machine_done_notify); + qemu_add_vm_change_state_handler(sev_vm_state_change, s); sev_state = s; -- 2.9.5