[PATCH] KVM: arm64: nv: Work around lack of pauth support in old toolchains
Marc Zyngier
maz at kernel.org
Mon Apr 22 15:48:49 PDT 2024
We still support GCC 8.x, and it appears that this toolchain
does not understand "pauth" as a valid architectural extension.
After all, it's only been 8 years since ARMv8.3 was released...
This results in the NV ERETAx code breaking the build, as it relies
on this extention to make use of the PACGA instruction.
Work around it by hand-assembling the instruction using a mind-bending
trick lifted from an old patch by Will. Magic.
Fixes: e09faab353a6 ("KVM: arm64: nv: Add emulation for ERETAx instructions")
Reported-by: Linaro Kernel Functional Testing <lkft at linaro.org>
Signed-off-by: Marc Zyngier <maz at kernel.org>
---
arch/arm64/kvm/pauth.c | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/kvm/pauth.c b/arch/arm64/kvm/pauth.c
index a3a5c404375b..8baf2a2cbdd3 100644
--- a/arch/arm64/kvm/pauth.c
+++ b/arch/arm64/kvm/pauth.c
@@ -17,6 +17,22 @@
#include <asm/kvm_emulate.h>
#include <asm/pointer_auth.h>
+/*
+ * "// This is some of my finest work" (Will Deacon, 2019-02-12)
+ *
+ * The jury is still out on that one.
+ */
+#define REG(r) "(0%x[" #r "] - ((0%x[" #r "] >> 4) * 6))"
+
+/* PACGA Xd, Xn, Xm */
+#define PACGA(d,n,m) \
+ asm volatile(".inst 0x9AC03000 |" \
+ "(" REG(Rd) "<< 0) |" \
+ "(" REG(Rn) "<< 5) |" \
+ "(" REG(Rm) "<< 16)\n" \
+ : [Rd] "=r" ((d)) \
+ : [Rn] "r" ((n)), [Rm] "r" ((m)))
+
static u64 compute_pac(struct kvm_vcpu *vcpu, u64 ptr,
struct ptrauth_key ikey)
{
@@ -36,8 +52,7 @@ static u64 compute_pac(struct kvm_vcpu *vcpu, u64 ptr,
__ptrauth_key_install_nosync(APGA, ikey);
isb();
- asm volatile(ARM64_ASM_PREAMBLE ".arch_extension pauth\n"
- "pacga %0, %1, %2" : "=r" (pac) : "r" (ptr), "r" (mod));
+ PACGA(pac, ptr, mod);
isb();
__ptrauth_key_install_nosync(APGA, gkey);
--
2.39.2
More information about the linux-arm-kernel
mailing list