From: Amit Daniel Kachhap <[email protected]>

This patch adds a runtime capabality for KVM tool to enable Arm64 8.3
Pointer Authentication in guest kernel. Two vcpu features
KVM_ARM_VCPU_PTRAUTH_[ADDRESS/GENERIC] are supplied together to enable
Pointer Authentication in KVM guest after checking the capability.

Command line options --enable-ptrauth and --disable-ptrauth are added
to use this feature. However, if those options are not provided then
also this feature is enabled if host supports this capability.

The macros defined in the headers are not in sync and should be replaced
from the upstream.

Signed-off-by: Amit Daniel Kachhap <[email protected]>
Signed-off-by: Dave Martin <[email protected]> [merge new kernel heaers]
---
 arm/aarch32/include/kvm/kvm-cpu-arch.h    |  2 ++
 arm/aarch64/include/kvm/kvm-config-arch.h |  6 +++++-
 arm/aarch64/include/kvm/kvm-cpu-arch.h    |  3 +++
 arm/include/arm-common/kvm-config-arch.h  |  2 ++
 arm/kvm-cpu.c                             | 20 ++++++++++++++++++--
 5 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/arm/aarch32/include/kvm/kvm-cpu-arch.h 
b/arm/aarch32/include/kvm/kvm-cpu-arch.h
index d28ea67..3ec6f03 100644
--- a/arm/aarch32/include/kvm/kvm-cpu-arch.h
+++ b/arm/aarch32/include/kvm/kvm-cpu-arch.h
@@ -13,4 +13,6 @@
 #define ARM_CPU_ID             0, 0, 0
 #define ARM_CPU_ID_MPIDR       5
 
+#define ARM_VCPU_PTRAUTH_FEATURE       0
+
 #endif /* KVM__KVM_CPU_ARCH_H */
diff --git a/arm/aarch64/include/kvm/kvm-config-arch.h 
b/arm/aarch64/include/kvm/kvm-config-arch.h
index 04be43d..0279b13 100644
--- a/arm/aarch64/include/kvm/kvm-config-arch.h
+++ b/arm/aarch64/include/kvm/kvm-config-arch.h
@@ -8,7 +8,11 @@
                        "Create PMUv3 device"),                         \
        OPT_U64('\0', "kaslr-seed", &(cfg)->kaslr_seed,                 \
                        "Specify random seed for Kernel Address Space " \
-                       "Layout Randomization (KASLR)"),
+                       "Layout Randomization (KASLR)"),                \
+       OPT_BOOLEAN('\0', "enable-ptrauth", &(cfg)->enable_ptrauth,     \
+                       "Enables pointer authentication"),              \
+       OPT_BOOLEAN('\0', "disable-ptrauth", &(cfg)->disable_ptrauth,   \
+                       "Disables pointer authentication"),
 
 #include "arm-common/kvm-config-arch.h"
 
diff --git a/arm/aarch64/include/kvm/kvm-cpu-arch.h 
b/arm/aarch64/include/kvm/kvm-cpu-arch.h
index a9d8563..9fa99fb 100644
--- a/arm/aarch64/include/kvm/kvm-cpu-arch.h
+++ b/arm/aarch64/include/kvm/kvm-cpu-arch.h
@@ -17,4 +17,7 @@
 #define ARM_CPU_CTRL           3, 0, 1, 0
 #define ARM_CPU_CTRL_SCTLR_EL1 0
 
+#define ARM_VCPU_PTRAUTH_FEATURE       ((1UL << KVM_ARM_VCPU_PTRAUTH_ADDRESS) \
+                                       | (1UL << KVM_ARM_VCPU_PTRAUTH_GENERIC))
+
 #endif /* KVM__KVM_CPU_ARCH_H */
diff --git a/arm/include/arm-common/kvm-config-arch.h 
b/arm/include/arm-common/kvm-config-arch.h
index 5734c46..1b4287d 100644
--- a/arm/include/arm-common/kvm-config-arch.h
+++ b/arm/include/arm-common/kvm-config-arch.h
@@ -10,6 +10,8 @@ struct kvm_config_arch {
        bool            aarch32_guest;
        bool            has_pmuv3;
        u64             kaslr_seed;
+       bool            enable_ptrauth;
+       bool            disable_ptrauth;
        enum irqchip_type irqchip;
        u64             fw_addr;
 };
diff --git a/arm/kvm-cpu.c b/arm/kvm-cpu.c
index 7780251..acd1d5f 100644
--- a/arm/kvm-cpu.c
+++ b/arm/kvm-cpu.c
@@ -68,6 +68,18 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, unsigned 
long cpu_id)
                vcpu_init.features[0] |= (1UL << KVM_ARM_VCPU_PSCI_0_2);
        }
 
+       /* Check Pointer Authentication command line arguments. */
+       if (kvm->cfg.arch.enable_ptrauth && kvm->cfg.arch.disable_ptrauth)
+               die("Both enable-ptrauth and disable-ptrauth option cannot be 
present");
+       /*
+        * Always enable Pointer Authentication if system supports
+        * this extension unless disable-ptrauth option is present.
+        */
+       if (kvm__supports_extension(kvm, KVM_CAP_ARM_PTRAUTH_ADDRESS) &&
+           kvm__supports_extension(kvm, KVM_CAP_ARM_PTRAUTH_GENERIC) &&
+           !kvm->cfg.arch.disable_ptrauth)
+                       vcpu_init.features[0] |= ARM_VCPU_PTRAUTH_FEATURE;
+
        /*
         * If the preferred target ioctl is successful then
         * use preferred target else try each and every target type
@@ -106,8 +118,12 @@ struct kvm_cpu *kvm_cpu__arch_init(struct kvm *kvm, 
unsigned long cpu_id)
                        die("Unable to find matching target");
        }
 
-       if (err || target->init(vcpu))
-               die("Unable to initialise vcpu");
+       if (err || target->init(vcpu)) {
+               if (kvm->cfg.arch.enable_ptrauth)
+                       die("Unable to initialise vcpu with pointer 
authentication feature");
+               else
+                       die("Unable to initialise vcpu");
+       }
 
        coalesced_offset = ioctl(kvm->sys_fd, KVM_CHECK_EXTENSION,
                                 KVM_CAP_COALESCED_MMIO);
-- 
2.1.4

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to