kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: pair@us.ibm.com, pbonzini@redhat.com, frankja@linux.ibm.com,
	brijesh.singh@amd.com, dgilbert@redhat.com,
	qemu-devel@nongnu.org
Cc: Eduardo Habkost <ehabkost@redhat.com>,
	qemu-ppc@nongnu.org, rth@twiddle.net, thuth@redhat.com,
	berrange@redhat.com, mdroth@linux.vnet.ibm.com,
	Marcelo Tosatti <mtosatti@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
	david@redhat.com,
	Richard Henderson <richard.henderson@linaro.org>,
	borntraeger@de.ibm.com,
	David Gibson <david@gibson.dropbear.id.au>,
	cohuck@redhat.com, kvm@vger.kernel.org, qemu-s390x@nongnu.org,
	pasic@linux.ibm.com, Ram Pai <linuxram@us.ibm.com>
Subject: [for-6.0 v5 10/13] spapr: Add PEF based securable guest memory
Date: Fri,  4 Dec 2020 16:44:12 +1100	[thread overview]
Message-ID: <20201204054415.579042-11-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20201204054415.579042-1-david@gibson.dropbear.id.au>

Some upcoming POWER machines have a system called PEF (Protected
Execution Facility) which uses a small ultravisor to allow guests to
run in a way that they can't be eavesdropped by the hypervisor.  The
effect is roughly similar to AMD SEV, although the mechanisms are
quite different.

Most of the work of this is done between the guest, KVM and the
ultravisor, with little need for involvement by qemu.  However qemu
does need to tell KVM to allow secure VMs.

Because the availability of secure mode is a guest visible difference
which depends on having the right hardware and firmware, we don't
enable this by default.  In order to run a secure guest you need to
create a "pef-guest" object and set the securable-guest-memory machine
property to point to it.

Note that this just *allows* secure guests, the architecture of PEF is
such that the guest still needs to talk to the ultravisor to enter
secure mode.  Qemu has no directl way of knowing if the guest is in
secure mode, and certainly can't know until well after machine
creation time.

To start a PEF-capable guest, use the command line options:
    -object pef-guest,id=pef0 -machine securable-guest-memory=pef0

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Ram Pai <linuxram@us.ibm.com>
---
 hw/ppc/meson.build   |   1 +
 hw/ppc/pef.c         | 115 +++++++++++++++++++++++++++++++++++++++++++
 hw/ppc/spapr.c       |  10 ++++
 include/hw/ppc/pef.h |  26 ++++++++++
 target/ppc/kvm.c     |  18 -------
 target/ppc/kvm_ppc.h |   6 ---
 6 files changed, 152 insertions(+), 24 deletions(-)
 create mode 100644 hw/ppc/pef.c
 create mode 100644 include/hw/ppc/pef.h

diff --git a/hw/ppc/meson.build b/hw/ppc/meson.build
index ffa2ec37fa..218631c883 100644
--- a/hw/ppc/meson.build
+++ b/hw/ppc/meson.build
@@ -27,6 +27,7 @@ ppc_ss.add(when: 'CONFIG_PSERIES', if_true: files(
   'spapr_nvdimm.c',
   'spapr_rtas_ddw.c',
   'spapr_numa.c',
+  'pef.c',
 ))
 ppc_ss.add(when: 'CONFIG_SPAPR_RNG', if_true: files('spapr_rng.c'))
 ppc_ss.add(when: ['CONFIG_PSERIES', 'CONFIG_LINUX'], if_true: files(
diff --git a/hw/ppc/pef.c b/hw/ppc/pef.c
new file mode 100644
index 0000000000..3ae3059cfe
--- /dev/null
+++ b/hw/ppc/pef.c
@@ -0,0 +1,115 @@
+/*
+ * PEF (Protected Execution Facility) for POWER support
+ *
+ * Copyright David Gibson, Redhat Inc. 2020
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu/osdep.h"
+
+#include "qapi/error.h"
+#include "qom/object_interfaces.h"
+#include "sysemu/kvm.h"
+#include "migration/blocker.h"
+#include "exec/securable-guest-memory.h"
+#include "hw/ppc/pef.h"
+
+#define TYPE_PEF_GUEST "pef-guest"
+#define PEF_GUEST(obj)                                  \
+    OBJECT_CHECK(PefGuestState, (obj), TYPE_PEF_GUEST)
+
+typedef struct PefGuestState PefGuestState;
+
+/**
+ * PefGuestState:
+ *
+ * The PefGuestState object is used for creating and managing a PEF
+ * guest.
+ *
+ * # $QEMU \
+ *         -object pef-guest,id=pef0 \
+ *         -machine ...,securable-guest-memory=pef0
+ */
+struct PefGuestState {
+    Object parent_obj;
+};
+
+#ifdef CONFIG_KVM
+static int kvmppc_svm_init(Error **errp)
+{
+    if (!kvm_check_extension(kvm_state, KVM_CAP_PPC_SECURABLE_GUEST)) {
+        error_setg(errp,
+                   "KVM implementation does not support Secure VMs (is an ultravisor running?)");
+        return -1;
+    } else {
+        int ret = kvm_vm_enable_cap(kvm_state, KVM_CAP_PPC_SECURE_GUEST, 0, 1);
+
+        if (ret < 0) {
+            error_setg(errp,
+                       "Error enabling PEF with KVM");
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+/*
+ * Don't set error if KVM_PPC_SVM_OFF ioctl is invoked on kernels
+ * that don't support this ioctl.
+ */
+void kvmppc_svm_off(Error **errp)
+{
+    int rc;
+
+    if (!kvm_enabled()) {
+        return;
+    }
+
+    rc = kvm_vm_ioctl(KVM_STATE(current_accel()), KVM_PPC_SVM_OFF);
+    if (rc && rc != -ENOTTY) {
+        error_setg_errno(errp, -rc, "KVM_PPC_SVM_OFF ioctl failed");
+    }
+}
+#else
+static int kvmppc_svm_init(Error **errp)
+{
+    g_assert_not_reached();
+}
+#endif
+
+int pef_kvm_init(SecurableGuestMemory *sgm, Error **errp)
+{
+    if (!object_dynamic_cast(OBJECT(sgm), TYPE_PEF_GUEST)) {
+        return 0;
+    }
+
+    if (!kvm_enabled()) {
+        error_setg(errp, "PEF requires KVM");
+        return -1;
+    }
+
+    return kvmppc_svm_init(errp);
+}
+
+static const TypeInfo pef_guest_info = {
+    .parent = TYPE_OBJECT,
+    .name = TYPE_PEF_GUEST,
+    .instance_size = sizeof(PefGuestState),
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_SECURABLE_GUEST_MEMORY },
+        { TYPE_USER_CREATABLE },
+        { }
+    }
+};
+
+static void
+pef_register_types(void)
+{
+    type_register_static(&pef_guest_info);
+}
+
+type_init(pef_register_types);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 12a012d9dd..d95b60f712 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -82,6 +82,7 @@
 #include "hw/ppc/spapr_tpm_proxy.h"
 #include "hw/ppc/spapr_nvdimm.h"
 #include "hw/ppc/spapr_numa.h"
+#include "hw/ppc/pef.h"
 
 #include "monitor/monitor.h"
 
@@ -2665,6 +2666,15 @@ static void spapr_machine_init(MachineState *machine)
     long load_limit, fw_size;
     char *filename;
     Error *resize_hpt_err = NULL;
+    Error *local_err = NULL;
+
+    /*
+     * if Secure VM (PEF) support is configured, then initialize it
+     */
+    if (pef_kvm_init(machine->sgm, &local_err) < 0) {
+        error_report_err(local_err);
+        exit(1);
+    }
 
     msi_nonbroken = true;
 
diff --git a/include/hw/ppc/pef.h b/include/hw/ppc/pef.h
new file mode 100644
index 0000000000..63c3475859
--- /dev/null
+++ b/include/hw/ppc/pef.h
@@ -0,0 +1,26 @@
+/*
+ * PEF (Protected Execution Facility) for POWER support
+ *
+ * Copyright David Gibson, Redhat Inc. 2020
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef HW_PPC_PEF_H
+#define HW_PPC_PEF_H
+
+int pef_kvm_init(SecurableGuestMemory *sgm, Error **errp);
+
+#ifdef CONFIG_KVM
+void kvmppc_svm_off(Error **errp);
+#else
+static inline void kvmppc_svm_off(Error **errp)
+{
+}
+#endif
+
+
+#endif /* HW_PPC_PEF_H */
+
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index daf690a678..0c5056dd5b 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2929,21 +2929,3 @@ void kvmppc_set_reg_tb_offset(PowerPCCPU *cpu, int64_t tb_offset)
         kvm_set_one_reg(cs, KVM_REG_PPC_TB_OFFSET, &tb_offset);
     }
 }
-
-/*
- * Don't set error if KVM_PPC_SVM_OFF ioctl is invoked on kernels
- * that don't support this ioctl.
- */
-void kvmppc_svm_off(Error **errp)
-{
-    int rc;
-
-    if (!kvm_enabled()) {
-        return;
-    }
-
-    rc = kvm_vm_ioctl(KVM_STATE(current_accel()), KVM_PPC_SVM_OFF);
-    if (rc && rc != -ENOTTY) {
-        error_setg_errno(errp, -rc, "KVM_PPC_SVM_OFF ioctl failed");
-    }
-}
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
index 73ce2bc951..989f61ace0 100644
--- a/target/ppc/kvm_ppc.h
+++ b/target/ppc/kvm_ppc.h
@@ -39,7 +39,6 @@ int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu);
 target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
                                      bool radix, bool gtse,
                                      uint64_t proc_tbl);
-void kvmppc_svm_off(Error **errp);
 #ifndef CONFIG_USER_ONLY
 bool kvmppc_spapr_use_multitce(void);
 int kvmppc_spapr_enable_inkernel_multitce(void);
@@ -216,11 +215,6 @@ static inline target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
     return 0;
 }
 
-static inline void kvmppc_svm_off(Error **errp)
-{
-    return;
-}
-
 static inline void kvmppc_set_reg_ppc_online(PowerPCCPU *cpu,
                                              unsigned int online)
 {
-- 
2.28.0


  parent reply	other threads:[~2020-12-04  5:46 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-04  5:44 [for-6.0 v5 00/13] Generalize memory encryption models David Gibson
2020-12-04  5:44 ` [for-6.0 v5 01/13] qom: Allow optional sugar props David Gibson
2020-12-04 12:57   ` Cornelia Huck
2020-12-14 21:25   ` Eduardo Habkost
2021-01-11 18:04   ` Philippe Mathieu-Daudé
2020-12-04  5:44 ` [for-6.0 v5 02/13] securable guest memory: Introduce new securable guest memory base class David Gibson
2020-12-04  5:44 ` [for-6.0 v5 03/13] securable guest memory: Handle memory encryption via interface David Gibson
2020-12-04 13:10   ` Cornelia Huck
2021-01-08  4:03     ` David Gibson
2021-01-12  3:49     ` David Gibson
2020-12-04  5:44 ` [for-6.0 v5 04/13] securable guest memory: Move side effect out of machine_set_memory_encryption() David Gibson
2020-12-04  5:44 ` [for-6.0 v5 05/13] securable guest memory: Rework the "memory-encryption" property David Gibson
2021-01-11 18:09   ` Philippe Mathieu-Daudé
2020-12-04  5:44 ` [for-6.0 v5 06/13] securable guest memory: Decouple kvm_memcrypt_*() helpers from KVM David Gibson
2021-01-11 18:13   ` Philippe Mathieu-Daudé
2021-01-12  3:03     ` David Gibson
2020-12-04  5:44 ` [for-6.0 v5 07/13] sev: Add Error ** to sev_kvm_init() David Gibson
2020-12-14 16:50   ` Cornelia Huck
2020-12-04  5:44 ` [for-6.0 v5 08/13] securable guest memory: Introduce sgm "ready" flag David Gibson
2020-12-14 17:00   ` Cornelia Huck
2020-12-17  5:38     ` David Gibson
2020-12-17 11:24       ` Cornelia Huck
2020-12-04  5:44 ` [for-6.0 v5 09/13] securable guest memory: Move SEV initialization into arch specific code David Gibson
2020-12-04  5:44 ` David Gibson [this message]
2021-01-05 23:34   ` [for-6.0 v5 10/13] spapr: Add PEF based securable guest memory Ram Pai
2021-01-08  0:34     ` David Gibson
2020-12-04  5:44 ` [for-6.0 v5 11/13] spapr: PEF: prevent migration David Gibson
2020-12-14 17:22   ` Cornelia Huck
2020-12-17  5:47     ` David Gibson
2020-12-17 11:38       ` Cornelia Huck
2020-12-17 14:15         ` Greg Kurz
2020-12-18 11:41           ` Cornelia Huck
2020-12-18 12:08             ` Dr. David Alan Gilbert
2021-01-04  7:15             ` Ram Pai
2021-01-04 12:46               ` [EXTERNAL] " Halil Pasic
2021-01-04 18:40                 ` Ram Pai
2021-01-05 10:56                   ` [EXTERNAL] " Halil Pasic
2021-01-05 20:41                     ` Ram Pai
2021-01-11 16:59                       ` Cornelia Huck
2021-01-11 19:58                         ` Ram Pai
2021-01-12  8:19                           ` Cornelia Huck
2021-01-12 18:55                             ` Ram Pai
2021-01-13  8:06                               ` Cornelia Huck
2021-01-15 18:55                                 ` Ram Pai
2021-01-19  8:19                                   ` Cornelia Huck
2021-01-19  9:59                                   ` Daniel P. Berrangé
2021-01-14 11:23                           ` Daniel P. Berrangé
2021-01-13 12:42                         ` Dr. David Alan Gilbert
2021-01-14 10:28                           ` Christian Borntraeger
2021-01-14 10:36                             ` Dr. David Alan Gilbert
2021-01-14 10:52                               ` Christian Borntraeger
2021-01-14 11:05                                 ` Cornelia Huck
2021-01-14 11:45                                   ` Dr. David Alan Gilbert
2021-01-14 11:50                                     ` Christian Borntraeger
2021-01-14 12:20                                       ` Daniel P. Berrangé
2021-01-14 14:04                                         ` Cornelia Huck
2021-01-14 14:09                                           ` Christian Borntraeger
2021-01-14 14:15                                             ` Daniel P. Berrangé
2021-01-14 15:25                                               ` Christian Borntraeger
2021-01-14 15:33                                                 ` Daniel P. Berrangé
2021-01-15 18:24                               ` Ram Pai
2021-01-14 11:25                           ` Daniel P. Berrangé
2021-01-14 23:51                             ` David Gibson
2021-01-18 17:39                               ` Dr. David Alan Gilbert
2021-01-19  8:28                                 ` Christian Borntraeger
2021-01-19  8:34                                   ` Cornelia Huck
2020-12-04  5:44 ` [for-6.0 v5 12/13] securable guest memory: Alter virtio default properties for protected guests David Gibson
2020-12-04  8:10   ` Christian Borntraeger
2020-12-04  8:17     ` Cornelia Huck
2020-12-04  8:29       ` Christian Borntraeger
2020-12-04 14:43         ` Halil Pasic
2020-12-08  1:54           ` David Gibson
2020-12-08  8:16             ` Christian Borntraeger
2020-12-08 10:28             ` Halil Pasic
2020-12-08 12:50               ` Cornelia Huck
2020-12-17  5:53                 ` David Gibson
2020-12-04 17:04   ` Cornelia Huck
2020-12-04  5:44 ` [for-6.0 v5 13/13] s390: Recognize securable-guest-memory option David Gibson
2020-12-15 11:45   ` Cornelia Huck
2020-12-17  5:54     ` David Gibson
2020-12-04  8:06 ` [for-6.0 v5 00/13] Generalize memory encryption models Christian Borntraeger
2020-12-04 13:02   ` Cornelia Huck
2020-12-04 13:07     ` Dr. David Alan Gilbert
2020-12-04 13:12       ` Cornelia Huck
2020-12-08  2:57         ` David Gibson
2020-12-08 12:43           ` Cornelia Huck
2020-12-17  6:21             ` David Gibson
2020-12-17 11:43               ` Cornelia Huck
2020-12-04 13:25       ` Daniel P. Berrangé
2020-12-04 13:51         ` Halil Pasic
2020-12-08  2:54     ` David Gibson
2020-12-04  9:50 ` Daniel P. Berrangé
2021-01-12  3:02   ` David Gibson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201204054415.579042-11-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=berrange@redhat.com \
    --cc=borntraeger@de.ibm.com \
    --cc=brijesh.singh@amd.com \
    --cc=cohuck@redhat.com \
    --cc=david@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=frankja@linux.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linuxram@us.ibm.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=mst@redhat.com \
    --cc=mtosatti@redhat.com \
    --cc=pair@us.ibm.com \
    --cc=pasic@linux.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=rth@twiddle.net \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).