i386/sev: Move sev_launch_finish to separate class method

When sev-snp-guest objects are introduced there will be a number of
differences in how the launch finish is handled compared to the existing
sev-guest object. Move sev_launch_finish() to a class method to make it
easier to implement SNP-specific launch update functionality later.

Signed-off-by: Pankaj Gupta <pankaj.gupta@amd.com>
Message-ID: <20240530111643.1091816-7-pankaj.gupta@amd.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Pankaj Gupta 2024-05-30 06:16:18 -05:00 committed by Paolo Bonzini
parent 6600f1ac0c
commit bce615a14a

View File

@ -71,6 +71,7 @@ struct SevCommonStateClass {
/* public */ /* public */
int (*launch_start)(SevCommonState *sev_common); int (*launch_start)(SevCommonState *sev_common);
void (*launch_finish)(SevCommonState *sev_common);
}; };
/** /**
@ -801,12 +802,12 @@ static Notifier sev_machine_done_notify = {
}; };
static void static void
sev_launch_finish(SevGuestState *sev_guest) sev_launch_finish(SevCommonState *sev_common)
{ {
int ret, error; int ret, error;
trace_kvm_sev_launch_finish(); trace_kvm_sev_launch_finish();
ret = sev_ioctl(SEV_COMMON(sev_guest)->sev_fd, KVM_SEV_LAUNCH_FINISH, 0, ret = sev_ioctl(sev_common->sev_fd, KVM_SEV_LAUNCH_FINISH, 0,
&error); &error);
if (ret) { if (ret) {
error_report("%s: LAUNCH_FINISH ret=%d fw_error=%d '%s'", error_report("%s: LAUNCH_FINISH ret=%d fw_error=%d '%s'",
@ -814,7 +815,7 @@ sev_launch_finish(SevGuestState *sev_guest)
exit(1); exit(1);
} }
sev_set_guest_state(SEV_COMMON(sev_guest), SEV_STATE_RUNNING); sev_set_guest_state(sev_common, SEV_STATE_RUNNING);
/* add migration blocker */ /* add migration blocker */
error_setg(&sev_mig_blocker, error_setg(&sev_mig_blocker,
@ -826,10 +827,11 @@ static void
sev_vm_state_change(void *opaque, bool running, RunState state) sev_vm_state_change(void *opaque, bool running, RunState state)
{ {
SevCommonState *sev_common = opaque; SevCommonState *sev_common = opaque;
SevCommonStateClass *klass = SEV_COMMON_GET_CLASS(opaque);
if (running) { if (running) {
if (!sev_check_state(sev_common, SEV_STATE_RUNNING)) { if (!sev_check_state(sev_common, SEV_STATE_RUNNING)) {
sev_launch_finish(SEV_GUEST(sev_common)); klass->launch_finish(sev_common);
} }
} }
} }
@ -1457,6 +1459,7 @@ sev_guest_class_init(ObjectClass *oc, void *data)
SevCommonStateClass *klass = SEV_COMMON_CLASS(oc); SevCommonStateClass *klass = SEV_COMMON_CLASS(oc);
klass->launch_start = sev_launch_start; klass->launch_start = sev_launch_start;
klass->launch_finish = sev_launch_finish;
object_class_property_add_str(oc, "dh-cert-file", object_class_property_add_str(oc, "dh-cert-file",
sev_guest_get_dh_cert_file, sev_guest_get_dh_cert_file,