[PATCH v1 19/26] KVM: arm64: Share KVM feature detection macros
From: Steffen Eiden <seiden@linux.ibm.com>
Date: 2026-05-29 15:56:47
Also in:
kvm, kvmarm, linux-s390, lkml
Subsystem:
arm64 port (aarch64 architecture), kernel virtual machine for arm64 (kvm/arm64), the rest · Maintainers:
Catalin Marinas, Will Deacon, Marc Zyngier, Oliver Upton, Linus Torvalds
Move kvm feature definitions from arch/arm64/include to a shared location
(include/kvm/arm64) to enable reuse by e.g. s390 for KVM/arm64 on s390
support.
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
---
arch/arm64/include/asm/kvm_feature.h | 60 +------------------
.../asm => include/kvm/arm64}/kvm_feature.h | 28 ++-------
2 files changed, 5 insertions(+), 83 deletions(-)
copy {arch/arm64/include/asm => include/kvm/arm64}/kvm_feature.h (76%)
diff --git a/arch/arm64/include/asm/kvm_feature.h b/arch/arm64/include/asm/kvm_feature.h
index 27a472d2343e..e1fb8b9f5ce2 100644
--- a/arch/arm64/include/asm/kvm_feature.h
+++ b/arch/arm64/include/asm/kvm_feature.h@@ -2,65 +2,7 @@ #ifndef __ARM64_KVM_FEATURE_H__ #define __ARM64_KVM_FEATURE_H__ -#include <linux/types.h> -#include <linux/bitfield.h> -#include <asm/sysreg-defs.h> - -#define extract_id_field_unsigned(val, id, fld) \ - (FIELD_GET(id##_##fld##_MASK, (val))) - -#define extract_id_field_signed(val, id, fld) \ - ({ \ - u64 __val = extract_id_field_unsigned((val), id, fld); \ - sign_extend64(__val, id##_##fld##_WIDTH - 1); \ - }) - -#define cmp_id_feat_signed(val, id, fld, op, limit) \ - (extract_id_field_signed((val), id, fld) op S64_SYS_FIELD_VALUE(id, fld, limit)) - -#define cmp_id_feat_unsigned(val, id, fld, op, limit) \ - (extract_id_field_unsigned((val), id, fld) op (u64)SYS_FIELD_VALUE(id, fld, limit)) - -#define cmp_id_feat(val, id, fld, op, limit) \ - (id##_##fld##_SIGNED ? \ - cmp_id_feat_signed(val, id, fld, op, limit) : \ - cmp_id_feat_unsigned(val, id, fld, op, limit)) - -#define id_has_feat(val, id, fld, limit) \ - cmp_id_feat(val, id, fld, >=, limit) - -#define id_has_feat_enum(val, id, fld, variant) \ - cmp_id_feat_unsigned(val, id, fld, ==, variant) - -#define id_has_feat_range(val, id, fld, min, max) \ - (cmp_id_feat(val, id, fld, >=, min) && \ - cmp_id_feat(val, id, fld, <=, max)) - -#define __kvm_has_feat(kvm, id, fld, limit) \ - id_has_feat(kvm_read_vm_id_reg((kvm), SYS_##id), id, fld, limit) - -#define kvm_has_feat(kvm, ...) __kvm_has_feat(kvm, __VA_ARGS__) - -#define __kvm_has_feat_enum(kvm, id, fld, val) \ - id_has_feat_enum(kvm_read_vm_id_reg((kvm), SYS_##id), id, fld, val) - -#define kvm_has_feat_enum(kvm, ...) __kvm_has_feat_enum(kvm, __VA_ARGS__) - - -/* 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; \ - }) +#include <kvm/arm64/kvm_feature.h> #define kvm_has_fpmr(k) \ (system_supports_fpmr() && \
diff --git a/arch/arm64/include/asm/kvm_feature.h b/include/kvm/arm64/kvm_feature.h
similarity index 76%
copy from arch/arm64/include/asm/kvm_feature.h
copy to include/kvm/arm64/kvm_feature.h
index 27a472d2343e..945abbbf1aa8 100644
--- a/arch/arm64/include/asm/kvm_feature.h
+++ b/include/kvm/arm64/kvm_feature.h@@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -#ifndef __ARM64_KVM_FEATURE_H__ -#define __ARM64_KVM_FEATURE_H__ + +#ifndef __KVM_ARM64_FEATURE_H__ +#define __KVM_ARM64_FEATURE_H__ #include <linux/types.h> #include <linux/bitfield.h>
@@ -46,7 +47,6 @@ #define kvm_has_feat_enum(kvm, ...) __kvm_has_feat_enum(kvm, __VA_ARGS__) - /* Check for a given level of PAuth support */ #define kvm_has_pauth(k, l) \ ({ \
@@ -62,24 +62,4 @@ (pa + pi + pa3) == 1; \ }) -#define kvm_has_fpmr(k) \ - (system_supports_fpmr() && \ - kvm_has_feat((k), ID_AA64PFR2_EL1, FPMR, IMP)) - -#define kvm_has_tcr2(k) \ - (kvm_has_feat((k), ID_AA64MMFR3_EL1, TCRX, IMP)) - -#define kvm_has_s1pie(k) \ - (kvm_has_feat((k), ID_AA64MMFR3_EL1, S1PIE, IMP)) - -#define kvm_has_s1poe(k) \ - (system_supports_poe() && \ - kvm_has_feat((k), ID_AA64MMFR3_EL1, S1POE, IMP)) - -#define kvm_has_ras(k) \ - (kvm_has_feat((k), ID_AA64PFR0_EL1, RAS, IMP)) - -#define kvm_has_sctlr2(k) \ - (kvm_has_feat((k), ID_AA64MMFR3_EL1, SCTLRX, IMP)) - -#endif /* __ARM64_KVM_FEATURE_H__*/ +#endif /* __KVM_ARM64_FEATURE_H__*/
--
2.53.0