@@ -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 */
@@ -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"
@@ -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 */
@@ -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;
};
@@ -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);