[PATCH] KVM: arm64: nv: Work around lack of pauth support in old toolchains
Mark Rutland
mark.rutland at arm.com
Tue Apr 23 01:37:04 PDT 2024
On Mon, Apr 22, 2024 at 11:48:49PM +0100, Marc Zyngier wrote:
> 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)))
Can you please use <asm/gpr-num.h> rather than open-coding this new REG()
helper? That way this'll be consistent with the way we assemble MRS/MSR in
<asm/sysreg.h>, and it avoids the few seconds of confusion trying to figure out
the maths in the REG() helper (neat trick though!).
Fixlet for that below; I've build tested this and the resulting object file is
the same before and after (diff shows that only the name of the file changed):
| [mark at lakrids:~/src/linux]% usekorg 13.2.0 aarch64-linux-objdump -d pauth-maz.o | grep pacga
| 204: 9ac03335 pacga x21, x25, x0
| [mark at lakrids:~/src/linux]% usekorg 13.2.0 aarch64-linux-objdump -d pauth-rutland.o | grep pacga
| 204: 9ac03335 pacga x21, x25, x0
| [mark at lakrids:~/src/linux]% diff <(usekorg 13.2.0 aarch64-linux-objdump -d pauth-maz.o) <(usekorg 13.2.0 aarch64-linux-objdump -d pauth-rutland.o)
| 2c2
| < pauth-maz.o: file format elf64-littleaarch64
| ---
| > pauth-rutland.o: file format elf64-littleaarch64
If you'd prefer I can send this as a patch.
Otherwise, this looks good to me; thanks for the fix!
Mark.
---->8----
diff --git a/arch/arm64/kvm/pauth.c b/arch/arm64/kvm/pauth.c
index 8baf2a2cbdd32..e518baf570c86 100644
--- a/arch/arm64/kvm/pauth.c
+++ b/arch/arm64/kvm/pauth.c
@@ -14,24 +14,20 @@
#include <linux/kvm_host.h>
+#include <asm/gpr-num.h>
#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)))
+#define PACGA(d,n,m) \
+ asm volatile( \
+ __DEFINE_ASM_GPR_NUMS \
+ " .inst 0x9AC03000 |" \
+ " (.L__gpr_num_%[Rd] << 0) |" \
+ " (.L__gpr_num_%[Rn] << 5) |" \
+ " (.L__gpr_num_%[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)
More information about the linux-arm-kernel
mailing list