i386/sev: Add snp_kvm_init() override for SNP class
SNP does not support SMM and requires guest_memfd for private guest memory, so add SNP specific kvm_init() functionality in snp_kvm_init() class method. Signed-off-by: Michael Roth <michael.roth@amd.com> Co-developed-by: Pankaj Gupta <pankaj.gupta@amd.com> Signed-off-by: Pankaj Gupta <pankaj.gupta@amd.com> Message-ID: <20240530111643.1091816-11-pankaj.gupta@amd.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
990da8d243
commit
125b95a6d4
@ -885,12 +885,12 @@ out:
|
|||||||
|
|
||||||
static int sev_common_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
static int sev_common_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||||
{
|
{
|
||||||
SevCommonState *sev_common = SEV_COMMON(cgs);
|
|
||||||
char *devname;
|
char *devname;
|
||||||
int ret, fw_error, cmd;
|
int ret, fw_error, cmd;
|
||||||
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 = {};
|
||||||
|
SevCommonState *sev_common = SEV_COMMON(cgs);
|
||||||
SevCommonStateClass *klass = SEV_COMMON_GET_CLASS(cgs);
|
SevCommonStateClass *klass = SEV_COMMON_GET_CLASS(cgs);
|
||||||
|
|
||||||
sev_common->state = SEV_STATE_UNINIT;
|
sev_common->state = SEV_STATE_UNINIT;
|
||||||
@ -1030,6 +1030,21 @@ static int sev_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sev_snp_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
|
||||||
|
{
|
||||||
|
MachineState *ms = MACHINE(qdev_get_machine());
|
||||||
|
X86MachineState *x86ms = X86_MACHINE(ms);
|
||||||
|
|
||||||
|
if (x86ms->smm == ON_OFF_AUTO_AUTO) {
|
||||||
|
x86ms->smm = ON_OFF_AUTO_OFF;
|
||||||
|
} else if (x86ms->smm == ON_OFF_AUTO_ON) {
|
||||||
|
error_setg(errp, "SEV-SNP does not support SMM.");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
sev_encrypt_flash(uint8_t *ptr, uint64_t len, Error **errp)
|
sev_encrypt_flash(uint8_t *ptr, uint64_t len, Error **errp)
|
||||||
{
|
{
|
||||||
@ -1752,6 +1767,10 @@ sev_snp_guest_set_host_data(Object *obj, const char *value, Error **errp)
|
|||||||
static void
|
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);
|
||||||
|
|
||||||
|
klass->kvm_init = sev_snp_kvm_init;
|
||||||
|
|
||||||
object_class_property_add(oc, "policy", "uint64",
|
object_class_property_add(oc, "policy", "uint64",
|
||||||
sev_snp_guest_get_policy,
|
sev_snp_guest_get_policy,
|
||||||
sev_snp_guest_set_policy, NULL, NULL);
|
sev_snp_guest_set_policy, NULL, NULL);
|
||||||
@ -1778,8 +1797,11 @@ sev_snp_guest_class_init(ObjectClass *oc, void *data)
|
|||||||
static void
|
static void
|
||||||
sev_snp_guest_instance_init(Object *obj)
|
sev_snp_guest_instance_init(Object *obj)
|
||||||
{
|
{
|
||||||
|
ConfidentialGuestSupport *cgs = CONFIDENTIAL_GUEST_SUPPORT(obj);
|
||||||
SevSnpGuestState *sev_snp_guest = SEV_SNP_GUEST(obj);
|
SevSnpGuestState *sev_snp_guest = SEV_SNP_GUEST(obj);
|
||||||
|
|
||||||
|
cgs->require_guest_memfd = true;
|
||||||
|
|
||||||
/* default init/start/finish params for kvm */
|
/* default init/start/finish params for kvm */
|
||||||
sev_snp_guest->kvm_start_conf.policy = DEFAULT_SEV_SNP_POLICY;
|
sev_snp_guest->kvm_start_conf.policy = DEFAULT_SEV_SNP_POLICY;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user