]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: nv: Add kvm_has_pauth() helper
authorMarc Zyngier <maz@kernel.org>
Fri, 19 Apr 2024 10:29:31 +0000 (11:29 +0100)
committerMarc Zyngier <maz@kernel.org>
Sat, 20 Apr 2024 11:42:51 +0000 (12:42 +0100)
Pointer Authentication comes in many flavors, and a faithful emulation
relies on correctly handling the flavour implemented by the HW.

For this, provide a new kvm_has_pauth() that checks whether we
expose to the guest a particular level of support. This checks
across all 3 possible authentication algorithms (Q5, Q3 and IMPDEF).

Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240419102935.1935571-12-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/include/asm/kvm_host.h

index 465cfd49cf7e518e60bb98bd54e5eb8b8290f8b9..a6ba90daa195474ec23657600dc8af1766473147 100644 (file)
@@ -1336,4 +1336,19 @@ bool kvm_arm_vcpu_stopped(struct kvm_vcpu *vcpu);
        (get_idreg_field((kvm), id, fld) >= expand_field_sign(id, fld, min) && \
         get_idreg_field((kvm), id, fld) <= expand_field_sign(id, fld, max))
 
+/* Check for a given level of PAuth support */
+#define kvm_has_pauth(k, l)                                            \
+       ({                                                              \
+               bool pa, pi, pa3;                                       \
+                                                                       \
+               pa  = kvm_has_feat((k), ID_AA64ISAR1_EL1, APA, l);      \
+               pa &= kvm_has_feat((k), ID_AA64ISAR1_EL1, GPA, IMP);    \
+               pi  = kvm_has_feat((k), ID_AA64ISAR1_EL1, API, l);      \
+               pi &= kvm_has_feat((k), ID_AA64ISAR1_EL1, GPI, IMP);    \
+               pa3  = kvm_has_feat((k), ID_AA64ISAR2_EL1, APA3, l);    \
+               pa3 &= kvm_has_feat((k), ID_AA64ISAR2_EL1, GPA3, IMP);  \
+                                                                       \
+               (pa + pi + pa3) == 1;                                   \
+       })
+
 #endif /* __ARM64_KVM_HOST_H__ */