Move definitions related to kvm feature handling to a separate header. Add flexibility through separation of concerns and allow sharing those definitions in the future. Co-developed-by: Nina Schoetterl-Glausch Signed-off-by: Nina Schoetterl-Glausch Signed-off-by: Steffen Eiden --- arch/arm64/include/asm/kvm_emulate.h | 1 + arch/arm64/include/asm/kvm_feature.h | 93 ++++++++++++++++++++++ arch/arm64/include/asm/kvm_host.h | 84 ------------------- arch/arm64/include/asm/kvm_nested.h | 1 + arch/arm64/kvm/at.c | 1 + arch/arm64/kvm/config.c | 1 + arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h | 1 + arch/arm64/kvm/hyp/nvhe/hyp-main.c | 1 + arch/arm64/kvm/hyp/nvhe/sys_regs.c | 1 + arch/arm64/kvm/vgic/vgic.h | 1 + 10 files changed, 101 insertions(+), 84 deletions(-) create mode 100644 arch/arm64/include/asm/kvm_feature.h diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h index 41eac2b5de14..2cb8511baddc 100644 --- a/arch/arm64/include/asm/kvm_emulate.h +++ b/arch/arm64/include/asm/kvm_emulate.h @@ -16,6 +16,7 @@ #include #include +#include #include #include #include diff --git a/arch/arm64/include/asm/kvm_feature.h b/arch/arm64/include/asm/kvm_feature.h new file mode 100644 index 000000000000..8d0c65246aa0 --- /dev/null +++ b/arch/arm64/include/asm/kvm_feature.h @@ -0,0 +1,93 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __ARM64_KVM_FEATURE_H__ +#define __ARM64_KVM_FEATURE_H__ + +#include +#include +#include + +#define __expand_field_sign_unsigned(id, fld, val) \ + ((u64)SYS_FIELD_VALUE(id, fld, val)) + +#define __expand_field_sign_signed(id, fld, val) \ + ({ \ + u64 __val = SYS_FIELD_VALUE(id, fld, val); \ + sign_extend64(__val, id##_##fld##_WIDTH - 1); \ + }) + +#define get_idreg_field_unsigned(kvm, id, fld) \ + ({ \ + u64 __val = kvm_read_vm_id_reg((kvm), SYS_##id); \ + FIELD_GET(id##_##fld##_MASK, __val); \ + }) + +#define get_idreg_field_signed(kvm, id, fld) \ + ({ \ + u64 __val = get_idreg_field_unsigned(kvm, id, fld); \ + sign_extend64(__val, id##_##fld##_WIDTH - 1); \ + }) + +#define get_idreg_field_enum(kvm, id, fld) \ + get_idreg_field_unsigned(kvm, id, fld) + +#define kvm_cmp_feat_signed(kvm, id, fld, op, limit) \ + (get_idreg_field_signed((kvm), id, fld) op __expand_field_sign_signed(id, fld, limit)) + +#define kvm_cmp_feat_unsigned(kvm, id, fld, op, limit) \ + (get_idreg_field_unsigned((kvm), id, fld) op __expand_field_sign_unsigned(id, fld, limit)) + +#define kvm_cmp_feat(kvm, id, fld, op, limit) \ + (id##_##fld##_SIGNED ? \ + kvm_cmp_feat_signed(kvm, id, fld, op, limit) : \ + kvm_cmp_feat_unsigned(kvm, id, fld, op, limit)) + +#define __kvm_has_feat(kvm, id, fld, limit) \ + kvm_cmp_feat(kvm, id, fld, >=, limit) + +#define kvm_has_feat(kvm, ...) __kvm_has_feat(kvm, __VA_ARGS__) + +#define __kvm_has_feat_enum(kvm, id, fld, val) \ + kvm_cmp_feat_unsigned(kvm, id, fld, ==, val) + +#define kvm_has_feat_enum(kvm, ...) __kvm_has_feat_enum(kvm, __VA_ARGS__) + +#define kvm_has_feat_range(kvm, id, fld, min, max) \ + (kvm_cmp_feat(kvm, id, fld, >=, min) && \ + kvm_cmp_feat(kvm, 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; \ + }) + +#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__*/ diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 2db51746b4d8..4c2c62b8b506 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -1423,90 +1423,6 @@ static inline u64 *__vm_id_reg(struct kvm_arch *ka, u32 reg) void kvm_set_vm_id_reg(struct kvm *kvm, u32 reg, u64 val); -#define __expand_field_sign_unsigned(id, fld, val) \ - ((u64)SYS_FIELD_VALUE(id, fld, val)) - -#define __expand_field_sign_signed(id, fld, val) \ - ({ \ - u64 __val = SYS_FIELD_VALUE(id, fld, val); \ - sign_extend64(__val, id##_##fld##_WIDTH - 1); \ - }) - -#define get_idreg_field_unsigned(kvm, id, fld) \ - ({ \ - u64 __val = kvm_read_vm_id_reg((kvm), SYS_##id); \ - FIELD_GET(id##_##fld##_MASK, __val); \ - }) - -#define get_idreg_field_signed(kvm, id, fld) \ - ({ \ - u64 __val = get_idreg_field_unsigned(kvm, id, fld); \ - sign_extend64(__val, id##_##fld##_WIDTH - 1); \ - }) - -#define get_idreg_field_enum(kvm, id, fld) \ - get_idreg_field_unsigned(kvm, id, fld) - -#define kvm_cmp_feat_signed(kvm, id, fld, op, limit) \ - (get_idreg_field_signed((kvm), id, fld) op __expand_field_sign_signed(id, fld, limit)) - -#define kvm_cmp_feat_unsigned(kvm, id, fld, op, limit) \ - (get_idreg_field_unsigned((kvm), id, fld) op __expand_field_sign_unsigned(id, fld, limit)) - -#define kvm_cmp_feat(kvm, id, fld, op, limit) \ - (id##_##fld##_SIGNED ? \ - kvm_cmp_feat_signed(kvm, id, fld, op, limit) : \ - kvm_cmp_feat_unsigned(kvm, id, fld, op, limit)) - -#define __kvm_has_feat(kvm, id, fld, limit) \ - kvm_cmp_feat(kvm, id, fld, >=, limit) - -#define kvm_has_feat(kvm, ...) __kvm_has_feat(kvm, __VA_ARGS__) - -#define __kvm_has_feat_enum(kvm, id, fld, val) \ - kvm_cmp_feat_unsigned(kvm, id, fld, ==, val) - -#define kvm_has_feat_enum(kvm, ...) __kvm_has_feat_enum(kvm, __VA_ARGS__) - -#define kvm_has_feat_range(kvm, id, fld, min, max) \ - (kvm_cmp_feat(kvm, id, fld, >=, min) && \ - kvm_cmp_feat(kvm, 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; \ - }) - -#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)) - static inline bool kvm_arch_has_irq_bypass(void) { return true; diff --git a/arch/arm64/include/asm/kvm_nested.h b/arch/arm64/include/asm/kvm_nested.h index dc2957662ff2..5da9ffae4f73 100644 --- a/arch/arm64/include/asm/kvm_nested.h +++ b/arch/arm64/include/asm/kvm_nested.h @@ -5,6 +5,7 @@ #include #include #include +#include #include static inline bool vcpu_has_nv(const struct kvm_vcpu *vcpu) diff --git a/arch/arm64/kvm/at.c b/arch/arm64/kvm/at.c index 9f8f0ae8e86e..ae91734dde37 100644 --- a/arch/arm64/kvm/at.c +++ b/arch/arm64/kvm/at.c @@ -7,6 +7,7 @@ #include #include +#include #include #include #include diff --git a/arch/arm64/kvm/config.c b/arch/arm64/kvm/config.c index 0622162b089e..014fe04daabf 100644 --- a/arch/arm64/kvm/config.c +++ b/arch/arm64/kvm/config.c @@ -6,6 +6,7 @@ #include #include +#include #include #include diff --git a/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h b/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h index a17cbe7582de..dd824096dfc1 100644 --- a/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h +++ b/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/hyp-main.c index 06db299c37a8..3e5c9107d78f 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/arch/arm64/kvm/hyp/nvhe/sys_regs.c b/arch/arm64/kvm/hyp/nvhe/sys_regs.c index 8c3fbb413a06..b5a0de84ce01 100644 --- a/arch/arm64/kvm/hyp/nvhe/sys_regs.c +++ b/arch/arm64/kvm/hyp/nvhe/sys_regs.c @@ -7,6 +7,7 @@ #include #include +#include #include #include diff --git a/arch/arm64/kvm/vgic/vgic.h b/arch/arm64/kvm/vgic/vgic.h index 9d941241c8a2..b275d3cabe21 100644 --- a/arch/arm64/kvm/vgic/vgic.h +++ b/arch/arm64/kvm/vgic/vgic.h @@ -6,6 +6,7 @@ #define __KVM_ARM_VGIC_NEW_H__ #include +#include #include #define PRODUCT_ID_KVM 0x4b /* ASCII code K */ -- 2.53.0