Define the constant `num_sys_reg_descs` which stores the number of elements in the sys_reg_descs array. Replace all occurrences of ARRAY_SIZE(sys_reg_descs) with the new constant. This refactoring eases the integration of handling system registers for arm on s390. s390 needs code from the shared code to define the sys_reg_descs. But also the shared code needs the definition of the sys_reg_array and we cannot forward declare arrays and use their size before it is properly defined. This patch solves this chicken or egg problem. For the time being s390 cannot process the full arm64 defined sys_reg_descs array. No functional changes. Co-developed-by: Andreas Grapentin Signed-off-by: Andreas Grapentin Signed-off-by: Steffen Eiden --- arch/arm64/kvm/sys_regs.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index 0f0b0495b710..2b28b929f9f3 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -3976,6 +3976,8 @@ static const struct sys_reg_desc sys_reg_descs[] = { EL2_REG(SP_EL2, NULL, reset_unknown, 0), }; +static const size_t num_sys_reg_descs = ARRAY_SIZE(sys_reg_descs); + static bool handle_at_s1e01(struct kvm_vcpu *vcpu, struct sys_reg_params *p, const struct sys_reg_desc *r) { @@ -5187,7 +5189,7 @@ static bool emulate_sys_reg(struct kvm_vcpu *vcpu, { const struct sys_reg_desc *r; - r = find_reg(params, sys_reg_descs, ARRAY_SIZE(sys_reg_descs)); + r = find_reg(params, sys_reg_descs, num_sys_reg_descs); if (likely(r)) { perform_access(vcpu, params, r); return true; @@ -5205,7 +5207,7 @@ static const struct sys_reg_desc *idregs_debug_find(struct kvm *kvm, loff_t pos) { unsigned long i, idreg_idx = 0; - for (i = 0; i < ARRAY_SIZE(sys_reg_descs); i++) { + for (i = 0; i < num_sys_reg_descs; i++) { const struct sys_reg_desc *r = &sys_reg_descs[i]; if (!is_vm_ftr_id_reg(reg_to_encoding(r))) @@ -5268,7 +5270,7 @@ static const struct sys_reg_desc *sr_resx_find(struct kvm *kvm, loff_t pos) { unsigned long i, sr_idx = 0; - for (i = 0; i < ARRAY_SIZE(sys_reg_descs); i++) { + for (i = 0; i < num_sys_reg_descs; i++) { const struct sys_reg_desc *r = &sys_reg_descs[i]; if (r->reg < __SANITISED_REG_START__) @@ -5370,7 +5372,7 @@ void kvm_reset_sys_regs(struct kvm_vcpu *vcpu) struct kvm *kvm = vcpu->kvm; unsigned long i; - for (i = 0; i < ARRAY_SIZE(sys_reg_descs); i++) { + for (i = 0; i < num_sys_reg_descs; i++) { const struct sys_reg_desc *r = &sys_reg_descs[i]; if (!r->reset) @@ -5594,8 +5596,8 @@ int kvm_arm_sys_reg_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_DEMUX) return demux_c15_get(vcpu, reg->id, uaddr); - return kvm_sys_reg_get_user(vcpu, reg, - sys_reg_descs, ARRAY_SIZE(sys_reg_descs)); + return kvm_sys_reg_get_user(vcpu, reg, sys_reg_descs, + num_sys_reg_descs); } int kvm_sys_reg_set_user(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg, @@ -5634,8 +5636,8 @@ int kvm_arm_sys_reg_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_DEMUX) return demux_c15_set(vcpu, reg->id, uaddr); - return kvm_sys_reg_set_user(vcpu, reg, - sys_reg_descs, ARRAY_SIZE(sys_reg_descs)); + return kvm_sys_reg_set_user(vcpu, reg, sys_reg_descs, + num_sys_reg_descs); } static unsigned int num_demux_regs(void) @@ -5723,7 +5725,7 @@ static int walk_sys_regs(struct kvm_vcpu *vcpu, u64 __user *uind) int err; i2 = sys_reg_descs; - end2 = sys_reg_descs + ARRAY_SIZE(sys_reg_descs); + end2 = sys_reg_descs + num_sys_reg_descs; while (i2 != end2) { err = walk_one_sys_reg(vcpu, i2++, &uind, &total); @@ -5772,7 +5774,7 @@ int kvm_vm_ioctl_get_reg_writable_masks(struct kvm *kvm, struct reg_mask_range * if (clear_user(masks, KVM_ARM_FEATURE_ID_RANGE_SIZE * sizeof(__u64))) return -EFAULT; - for (int i = 0; i < ARRAY_SIZE(sys_reg_descs); i++) { + for (int i = 0; i < num_sys_reg_descs; i++) { const struct sys_reg_desc *reg = &sys_reg_descs[i]; u32 encoding = reg_to_encoding(reg); u64 val; @@ -5957,7 +5959,7 @@ int __init kvm_sys_reg_table_init(void) int ret = 0; /* Make sure tables are unique and in order. */ - valid &= check_sysreg_table(sys_reg_descs, ARRAY_SIZE(sys_reg_descs), true); + valid &= check_sysreg_table(sys_reg_descs, num_sys_reg_descs, true); valid &= check_sysreg_table(cp14_regs, ARRAY_SIZE(cp14_regs), false); valid &= check_sysreg_table(cp14_64_regs, ARRAY_SIZE(cp14_64_regs), false); valid &= check_sysreg_table(cp15_regs, ARRAY_SIZE(cp15_regs), false); @@ -5980,7 +5982,7 @@ int __init kvm_sys_reg_table_init(void) check_feature_map(); - for (i = 0; !ret && i < ARRAY_SIZE(sys_reg_descs); i++) + for (i = 0; !ret && i < num_sys_reg_descs; i++) ret = populate_sysreg_config(sys_reg_descs + i, i); for (i = 0; !ret && i < ARRAY_SIZE(sys_insn_descs); i++) -- 2.56.0