mirror of https://github.com/xemu-project/xemu.git
i386/sev: Add a class method to determine KVM VM type for SNP guests
SEV guests can use either KVM_X86_DEFAULT_VM, KVM_X86_SEV_VM, or KVM_X86_SEV_ES_VM depending on the configuration and what the host kernel supports. SNP guests on the other hand can only ever use KVM_X86_SNP_VM, so split determination of VM type out into a separate class method that can be set accordingly for sev-guest vs. sev-snp-guest objects and add handling for SNP. Signed-off-by: Pankaj Gupta <pankaj.gupta@amd.com> Message-ID: <20240530111643.1091816-14-pankaj.gupta@amd.com> [Remove unnecessary function pointer declaration. - Paolo] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
73ae63b162
commit
a808132f6d
|
@ -167,6 +167,7 @@ static const char *vm_type_name[] = {
|
||||||
[KVM_X86_DEFAULT_VM] = "default",
|
[KVM_X86_DEFAULT_VM] = "default",
|
||||||
[KVM_X86_SEV_VM] = "SEV",
|
[KVM_X86_SEV_VM] = "SEV",
|
||||||
[KVM_X86_SEV_ES_VM] = "SEV-ES",
|
[KVM_X86_SEV_ES_VM] = "SEV-ES",
|
||||||
|
[KVM_X86_SNP_VM] = "SEV-SNP",
|
||||||
};
|
};
|
||||||
|
|
||||||
bool kvm_is_vm_type_supported(int type)
|
bool kvm_is_vm_type_supported(int type)
|
||||||
|
|
|
@ -885,6 +885,11 @@ out:
|
||||||
return sev_common->kvm_type;
|
return sev_common->kvm_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sev_snp_kvm_type(X86ConfidentialGuest *cg)
|
||||||
|
{
|
||||||
|
return KVM_X86_SNP_VM;
|
||||||
|
}
|
||||||
|
|
||||||
static int sev_common_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
static int sev_common_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||||
{
|
{
|
||||||
char *devname;
|
char *devname;
|
||||||
|
@ -894,6 +899,8 @@ static int sev_common_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||||
struct sev_user_data_status status = {};
|
struct sev_user_data_status status = {};
|
||||||
SevCommonState *sev_common = SEV_COMMON(cgs);
|
SevCommonState *sev_common = SEV_COMMON(cgs);
|
||||||
SevCommonStateClass *klass = SEV_COMMON_GET_CLASS(cgs);
|
SevCommonStateClass *klass = SEV_COMMON_GET_CLASS(cgs);
|
||||||
|
X86ConfidentialGuestClass *x86_klass =
|
||||||
|
X86_CONFIDENTIAL_GUEST_GET_CLASS(cgs);
|
||||||
|
|
||||||
sev_common->state = SEV_STATE_UNINIT;
|
sev_common->state = SEV_STATE_UNINIT;
|
||||||
|
|
||||||
|
@ -964,7 +971,7 @@ static int sev_common_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_kvm_sev_init();
|
trace_kvm_sev_init();
|
||||||
if (sev_kvm_type(X86_CONFIDENTIAL_GUEST(sev_common)) == KVM_X86_DEFAULT_VM) {
|
if (x86_klass->kvm_type(X86_CONFIDENTIAL_GUEST(sev_common)) == KVM_X86_DEFAULT_VM) {
|
||||||
cmd = sev_es_enabled() ? KVM_SEV_ES_INIT : KVM_SEV_INIT;
|
cmd = sev_es_enabled() ? KVM_SEV_ES_INIT : KVM_SEV_INIT;
|
||||||
|
|
||||||
ret = sev_ioctl(sev_common->sev_fd, cmd, NULL, &fw_error);
|
ret = sev_ioctl(sev_common->sev_fd, cmd, NULL, &fw_error);
|
||||||
|
@ -1441,10 +1448,8 @@ static void
|
||||||
sev_common_class_init(ObjectClass *oc, void *data)
|
sev_common_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
ConfidentialGuestSupportClass *klass = CONFIDENTIAL_GUEST_SUPPORT_CLASS(oc);
|
ConfidentialGuestSupportClass *klass = CONFIDENTIAL_GUEST_SUPPORT_CLASS(oc);
|
||||||
X86ConfidentialGuestClass *x86_klass = X86_CONFIDENTIAL_GUEST_CLASS(oc);
|
|
||||||
|
|
||||||
klass->kvm_init = sev_common_kvm_init;
|
klass->kvm_init = sev_common_kvm_init;
|
||||||
x86_klass->kvm_type = sev_kvm_type;
|
|
||||||
|
|
||||||
object_class_property_add_str(oc, "sev-device",
|
object_class_property_add_str(oc, "sev-device",
|
||||||
sev_common_get_sev_device,
|
sev_common_get_sev_device,
|
||||||
|
@ -1529,10 +1534,12 @@ static void
|
||||||
sev_guest_class_init(ObjectClass *oc, void *data)
|
sev_guest_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
SevCommonStateClass *klass = SEV_COMMON_CLASS(oc);
|
SevCommonStateClass *klass = SEV_COMMON_CLASS(oc);
|
||||||
|
X86ConfidentialGuestClass *x86_klass = X86_CONFIDENTIAL_GUEST_CLASS(oc);
|
||||||
|
|
||||||
klass->launch_start = sev_launch_start;
|
klass->launch_start = sev_launch_start;
|
||||||
klass->launch_finish = sev_launch_finish;
|
klass->launch_finish = sev_launch_finish;
|
||||||
klass->kvm_init = sev_kvm_init;
|
klass->kvm_init = sev_kvm_init;
|
||||||
|
x86_klass->kvm_type = sev_kvm_type;
|
||||||
|
|
||||||
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,
|
||||||
|
@ -1770,8 +1777,10 @@ static void
|
||||||
sev_snp_guest_class_init(ObjectClass *oc, void *data)
|
sev_snp_guest_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
SevCommonStateClass *klass = SEV_COMMON_CLASS(oc);
|
SevCommonStateClass *klass = SEV_COMMON_CLASS(oc);
|
||||||
|
X86ConfidentialGuestClass *x86_klass = X86_CONFIDENTIAL_GUEST_CLASS(oc);
|
||||||
|
|
||||||
klass->kvm_init = sev_snp_kvm_init;
|
klass->kvm_init = sev_snp_kvm_init;
|
||||||
|
x86_klass->kvm_type = sev_snp_kvm_type;
|
||||||
|
|
||||||
object_class_property_add(oc, "policy", "uint64",
|
object_class_property_add(oc, "policy", "uint64",
|
||||||
sev_snp_guest_get_policy,
|
sev_snp_guest_get_policy,
|
||||||
|
|
Loading…
Reference in New Issue