i386/sev: Move sev_launch_update to separate class method

When sev-snp-guest objects are introduced there will be a number of
differences in how the launch data is handled compared to the existing
sev-guest object. Move sev_launch_start() 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-6-pankaj.gupta@amd.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Pankaj Gupta 2024-05-30 06:16:17 -05:00 committed by Paolo Bonzini
parent 16dcf200dc
commit 6600f1ac0c

View File

@ -69,6 +69,8 @@ struct SevCommonState {
struct SevCommonStateClass { struct SevCommonStateClass {
X86ConfidentialGuestClass parent_class; X86ConfidentialGuestClass parent_class;
/* public */
int (*launch_start)(SevCommonState *sev_common);
}; };
/** /**
@ -632,16 +634,16 @@ sev_read_file_base64(const char *filename, guchar **data, gsize *len)
} }
static int static int
sev_launch_start(SevGuestState *sev_guest) sev_launch_start(SevCommonState *sev_common)
{ {
gsize sz; gsize sz;
int ret = 1; int ret = 1;
int fw_error, rc; int fw_error, rc;
SevGuestState *sev_guest = SEV_GUEST(sev_common);
struct kvm_sev_launch_start start = { struct kvm_sev_launch_start start = {
.handle = sev_guest->handle, .policy = sev_guest->policy .handle = sev_guest->handle, .policy = sev_guest->policy
}; };
guchar *session = NULL, *dh_cert = NULL; guchar *session = NULL, *dh_cert = NULL;
SevCommonState *sev_common = SEV_COMMON(sev_guest);
if (sev_guest->session_file) { if (sev_guest->session_file) {
if (sev_read_file_base64(sev_guest->session_file, &session, &sz) < 0) { if (sev_read_file_base64(sev_guest->session_file, &session, &sz) < 0) {
@ -862,6 +864,7 @@ static int sev_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
uint32_t ebx; uint32_t ebx;
uint32_t host_cbitpos; uint32_t host_cbitpos;
struct sev_user_data_status status = {}; struct sev_user_data_status status = {};
SevCommonStateClass *klass = SEV_COMMON_GET_CLASS(cgs);
ret = ram_block_discard_disable(true); ret = ram_block_discard_disable(true);
if (ret) { if (ret) {
@ -952,7 +955,7 @@ static int sev_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
goto err; goto err;
} }
sev_launch_start(SEV_GUEST(sev_common)); ret = klass->launch_start(sev_common);
if (ret) { if (ret) {
error_setg(errp, "%s: failed to create encryption context", __func__); error_setg(errp, "%s: failed to create encryption context", __func__);
goto err; goto err;
@ -1451,6 +1454,10 @@ static void sev_guest_set_legacy_vm_type(Object *obj, bool value, Error **errp)
static void static void
sev_guest_class_init(ObjectClass *oc, void *data) sev_guest_class_init(ObjectClass *oc, void *data)
{ {
SevCommonStateClass *klass = SEV_COMMON_CLASS(oc);
klass->launch_start = sev_launch_start;
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,
sev_guest_set_dh_cert_file); sev_guest_set_dh_cert_file);