From nobody Tue Feb 10 16:02:12 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1607060792; cv=none; d=zohomail.com; s=zohoarc; b=hmFgch7prUe1FeKrVJoyzPbJ6/30WoexDBAB+qokNslh7dPLSHc+1z2IyG0+xpoAe69QQdjx4qJOMFUtlcQp6tOBbAHRikTsFmuGODwPxmsjnUOMEMpUyoCKIXhkarBwPQaHVaAQEsE7PVQVLJHF9wnrMccPjZ6umLCPJK+dpTU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1607060792; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=amMS4WU2CDMCIhcZ5tW5YKYliNYl7yAfikX0PPVbKos=; b=LRFxaM0cH0wO9nz5RBBtMv/ghDmFvHbEsKhjMZGrCkwfMn7BJ2QkYESCHpWz/7cQdB/JsP03L/MuINEK4BwCi2YF4C0ydtfm3yCe2xMdkVihlagqGSk9P6E9kyCGadYEMZluwMj5mo5+pPPVsTH5gLGMZuPHYz8aJroQs8cQmGo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1607060791985354.4296709229119; Thu, 3 Dec 2020 21:46:31 -0800 (PST) Received: from localhost ([::1]:35144 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kl3vK-0006eh-PR for importer@patchew.org; Fri, 04 Dec 2020 00:46:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56756) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kl3tN-0003rk-OB; Fri, 04 Dec 2020 00:44:30 -0500 Received: from bilbo.ozlabs.org ([203.11.71.1]:53241 helo=ozlabs.org) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kl3tJ-0008Tp-8F; Fri, 04 Dec 2020 00:44:29 -0500 Received: by ozlabs.org (Postfix, from userid 1007) id 4CnM8g1c39z9sVM; Fri, 4 Dec 2020 16:44:19 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1607060659; bh=EqOeasdeFKvYiMfFo9qpcp5aqrwe2rucqzfY62bqd/Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OKzPjWmGd2EU3oSM+VSBLLWO+Ut+mIbLWGSdkd9OI9OMvqpcfYTsE72rZK4irMiYS pmBnnTYUGdnuinOkPe5JE9ScRaKUFUXrtVNNSI2zNwhsesBwaahn32oL3ByP1mj6sn SBMR5/zcFfk7DCJCtvaADFgvoyEnlDmYuR8Gjtqw= From: David Gibson To: pair@us.ibm.com, pbonzini@redhat.com, frankja@linux.ibm.com, brijesh.singh@amd.com, dgilbert@redhat.com, qemu-devel@nongnu.org Subject: [for-6.0 v5 03/13] securable guest memory: Handle memory encryption via interface Date: Fri, 4 Dec 2020 16:44:05 +1100 Message-Id: <20201204054415.579042-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201204054415.579042-1-david@gibson.dropbear.id.au> References: <20201204054415.579042-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=203.11.71.1; envelope-from=dgibson@ozlabs.org; helo=ozlabs.org X-Spam_score_int: -17 X-Spam_score: -1.8 X-Spam_bar: - X-Spam_report: (-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.25, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, cohuck@redhat.com, berrange@redhat.com, Eduardo Habkost , kvm@vger.kernel.org, "Michael S. Tsirkin" , Richard Henderson , Marcelo Tosatti , david@redhat.com, mdroth@linux.vnet.ibm.com, pasic@linux.ibm.com, borntraeger@de.ibm.com, qemu-s390x@nongnu.org, qemu-ppc@nongnu.org, David Gibson , rth@twiddle.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" At the moment AMD SEV sets a special function pointer, plus an opaque handle in KVMState to let things know how to encrypt guest memory. Now that we have a QOM interface for handling things related to securable guest memory, use a QOM method on that interface, rather than a bare function pointer for this. Signed-off-by: David Gibson Reviewed-by: Richard Henderson --- accel/kvm/kvm-all.c | 36 +++++--- accel/kvm/sev-stub.c | 9 +- include/exec/securable-guest-memory.h | 2 + include/sysemu/sev.h | 5 +- target/i386/monitor.c | 1 - target/i386/sev.c | 116 ++++++++++---------------- 6 files changed, 77 insertions(+), 92 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index baaa54249d..9e7cea64d6 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -47,6 +47,7 @@ #include "qemu/guest-random.h" #include "sysemu/hw_accel.h" #include "kvm-cpus.h" +#include "exec/securable-guest-memory.h" =20 #include "hw/boards.h" =20 @@ -120,9 +121,8 @@ struct KVMState KVMMemoryListener memory_listener; QLIST_HEAD(, KVMParkedVcpu) kvm_parked_vcpus; =20 - /* memory encryption */ - void *memcrypt_handle; - int (*memcrypt_encrypt_data)(void *handle, uint8_t *ptr, uint64_t len); + /* securable guest memory (e.g. by guest memory encryption) */ + SecurableGuestMemory *sgm; =20 /* For "info mtree -f" to tell if an MR is registered in KVM */ int nr_as; @@ -224,7 +224,7 @@ int kvm_get_max_memslots(void) =20 bool kvm_memcrypt_enabled(void) { - if (kvm_state && kvm_state->memcrypt_handle) { + if (kvm_state && kvm_state->sgm) { return true; } =20 @@ -233,10 +233,12 @@ bool kvm_memcrypt_enabled(void) =20 int kvm_memcrypt_encrypt_data(uint8_t *ptr, uint64_t len) { - if (kvm_state->memcrypt_handle && - kvm_state->memcrypt_encrypt_data) { - return kvm_state->memcrypt_encrypt_data(kvm_state->memcrypt_handle, - ptr, len); + SecurableGuestMemory *sgm =3D kvm_state->sgm; + + if (sgm) { + SecurableGuestMemoryClass *sgmc =3D SECURABLE_GUEST_MEMORY_GET_CLA= SS(sgm); + + return sgmc->encrypt_data(sgm, ptr, len); } =20 return 1; @@ -2206,13 +2208,23 @@ static int kvm_init(MachineState *ms) * encryption context. */ if (ms->memory_encryption) { - kvm_state->memcrypt_handle =3D sev_guest_init(ms->memory_encryptio= n); - if (!kvm_state->memcrypt_handle) { + Object *obj =3D object_resolve_path_component(object_get_objects_r= oot(), + ms->memory_encryption); + + if (object_dynamic_cast(obj, TYPE_SECURABLE_GUEST_MEMORY)) { + SecurableGuestMemory *sgm =3D SECURABLE_GUEST_MEMORY(obj); + + /* FIXME handle mechanisms other than SEV */ + ret =3D sev_kvm_init(sgm); + if (ret < 0) { + goto err; + } + + kvm_state->sgm =3D sgm; + } else { ret =3D -1; goto err; } - - kvm_state->memcrypt_encrypt_data =3D sev_encrypt_data; } =20 ret =3D kvm_arch_init(ms, s); diff --git a/accel/kvm/sev-stub.c b/accel/kvm/sev-stub.c index 4f97452585..3df3c88eeb 100644 --- a/accel/kvm/sev-stub.c +++ b/accel/kvm/sev-stub.c @@ -15,12 +15,7 @@ #include "qemu-common.h" #include "sysemu/sev.h" =20 -int sev_encrypt_data(void *handle, uint8_t *ptr, uint64_t len) +int sev_kvm_init(SecurableGuestMemory *sgm) { - abort(); -} - -void *sev_guest_init(const char *id) -{ - return NULL; + return -1; } diff --git a/include/exec/securable-guest-memory.h b/include/exec/securable= -guest-memory.h index 0d5ecfb681..4e2ae27040 100644 --- a/include/exec/securable-guest-memory.h +++ b/include/exec/securable-guest-memory.h @@ -39,6 +39,8 @@ struct SecurableGuestMemory { =20 typedef struct SecurableGuestMemoryClass { ObjectClass parent; + + int (*encrypt_data)(SecurableGuestMemory *, uint8_t *, uint64_t); } SecurableGuestMemoryClass; =20 #endif /* !CONFIG_USER_ONLY */ diff --git a/include/sysemu/sev.h b/include/sysemu/sev.h index 98c1ec8d38..36d038a36f 100644 --- a/include/sysemu/sev.h +++ b/include/sysemu/sev.h @@ -15,7 +15,8 @@ #define QEMU_SEV_H =20 #include "sysemu/kvm.h" +#include "exec/securable-guest-memory.h" + +int sev_kvm_init(SecurableGuestMemory *sgm); =20 -void *sev_guest_init(const char *id); -int sev_encrypt_data(void *handle, uint8_t *ptr, uint64_t len); #endif diff --git a/target/i386/monitor.c b/target/i386/monitor.c index 9f9e1c42f4..db6aeaf43a 100644 --- a/target/i386/monitor.c +++ b/target/i386/monitor.c @@ -29,7 +29,6 @@ #include "monitor/hmp.h" #include "qapi/qmp/qdict.h" #include "sysemu/kvm.h" -#include "sysemu/sev.h" #include "qapi/error.h" #include "sev_i386.h" #include "qapi/qapi-commands-misc-target.h" diff --git a/target/i386/sev.c b/target/i386/sev.c index 53f00a24cf..7b8ce590f7 100644 --- a/target/i386/sev.c +++ b/target/i386/sev.c @@ -281,26 +281,6 @@ sev_guest_set_sev_device(Object *obj, const char *valu= e, Error **errp) sev->sev_device =3D g_strdup(value); } =20 -static void -sev_guest_class_init(ObjectClass *oc, void *data) -{ - object_class_property_add_str(oc, "sev-device", - sev_guest_get_sev_device, - sev_guest_set_sev_device); - object_class_property_set_description(oc, "sev-device", - "SEV device to use"); - object_class_property_add_str(oc, "dh-cert-file", - sev_guest_get_dh_cert_file, - sev_guest_set_dh_cert_file); - object_class_property_set_description(oc, "dh-cert-file", - "guest owners DH certificate (encoded with base64)"); - object_class_property_add_str(oc, "session-file", - sev_guest_get_session_file, - sev_guest_set_session_file); - object_class_property_set_description(oc, "session-file", - "guest owners session parameters (encoded with base64)"); -} - static void sev_guest_instance_init(Object *obj) { @@ -319,40 +299,6 @@ sev_guest_instance_init(Object *obj) OBJ_PROP_FLAG_READWRITE); } =20 -/* sev guest info */ -static const TypeInfo sev_guest_info =3D { - .parent =3D TYPE_SECURABLE_GUEST_MEMORY, - .name =3D TYPE_SEV_GUEST, - .instance_size =3D sizeof(SevGuestState), - .instance_finalize =3D sev_guest_finalize, - .class_init =3D sev_guest_class_init, - .instance_init =3D sev_guest_instance_init, - .interfaces =3D (InterfaceInfo[]) { - { TYPE_USER_CREATABLE }, - { } - } -}; - -static SevGuestState * -lookup_sev_guest_info(const char *id) -{ - Object *obj; - SevGuestState *info; - - obj =3D object_resolve_path_component(object_get_objects_root(), id); - if (!obj) { - return NULL; - } - - info =3D (SevGuestState *) - object_dynamic_cast(obj, TYPE_SEV_GUEST); - if (!info) { - return NULL; - } - - return info; -} - bool sev_enabled(void) { @@ -680,10 +626,9 @@ sev_vm_state_change(void *opaque, int running, RunStat= e state) } } =20 -void * -sev_guest_init(const char *id) +int sev_kvm_init(SecurableGuestMemory *sgm) { - SevGuestState *sev; + SevGuestState *sev =3D SEV_GUEST(sgm); char *devname; int ret, fw_error; uint32_t ebx; @@ -693,14 +638,7 @@ sev_guest_init(const char *id) ret =3D ram_block_discard_disable(true); if (ret) { error_report("%s: cannot disable RAM discard", __func__); - return NULL; - } - - sev =3D lookup_sev_guest_info(id); - if (!sev) { - error_report("%s: '%s' is not a valid '%s' object", - __func__, id, TYPE_SEV_GUEST); - goto err; + return -1; } =20 sev_guest =3D sev; @@ -764,17 +702,17 @@ sev_guest_init(const char *id) qemu_add_machine_init_done_notifier(&sev_machine_done_notify); qemu_add_vm_change_state_handler(sev_vm_state_change, sev); =20 - return sev; + return 0; err: sev_guest =3D NULL; ram_block_discard_disable(false); - return NULL; + return -1; } =20 -int -sev_encrypt_data(void *handle, uint8_t *ptr, uint64_t len) +static int +sev_encrypt_data(SecurableGuestMemory *opaque, uint8_t *ptr, uint64_t len) { - SevGuestState *sev =3D handle; + SevGuestState *sev =3D SEV_GUEST(opaque); =20 assert(sev); =20 @@ -786,6 +724,44 @@ sev_encrypt_data(void *handle, uint8_t *ptr, uint64_t = len) return 0; } =20 +static void +sev_guest_class_init(ObjectClass *oc, void *data) +{ + SecurableGuestMemoryClass *sgmc =3D SECURABLE_GUEST_MEMORY_CLASS(oc); + + object_class_property_add_str(oc, "sev-device", + sev_guest_get_sev_device, + sev_guest_set_sev_device); + object_class_property_set_description(oc, "sev-device", + "SEV device to use"); + object_class_property_add_str(oc, "dh-cert-file", + sev_guest_get_dh_cert_file, + sev_guest_set_dh_cert_file); + object_class_property_set_description(oc, "dh-cert-file", + "guest owners DH certificate (encoded with base64)"); + object_class_property_add_str(oc, "session-file", + sev_guest_get_session_file, + sev_guest_set_session_file); + object_class_property_set_description(oc, "session-file", + "guest owners session parameters (encoded with base64)"); + + sgmc->encrypt_data =3D sev_encrypt_data; +} + +/* sev guest info */ +static const TypeInfo sev_guest_info =3D { + .parent =3D TYPE_SECURABLE_GUEST_MEMORY, + .name =3D TYPE_SEV_GUEST, + .instance_size =3D sizeof(SevGuestState), + .instance_finalize =3D sev_guest_finalize, + .class_init =3D sev_guest_class_init, + .instance_init =3D sev_guest_instance_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_USER_CREATABLE }, + { } + } +}; + static void sev_register_types(void) { --=20 2.28.0