|
@@ -1795,6 +1795,17 @@ static bool index_to_params(u64 id, struct sys_reg_params *params)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+const struct sys_reg_desc *find_reg_by_id(u64 id,
|
|
|
|
+ struct sys_reg_params *params,
|
|
|
|
+ const struct sys_reg_desc table[],
|
|
|
|
+ unsigned int num)
|
|
|
|
+{
|
|
|
|
+ if (!index_to_params(id, params))
|
|
|
|
+ return NULL;
|
|
|
|
+
|
|
|
|
+ return find_reg(params, table, num);
|
|
|
|
+}
|
|
|
|
+
|
|
/* Decode an index value, and find the sys_reg_desc entry. */
|
|
/* Decode an index value, and find the sys_reg_desc entry. */
|
|
static const struct sys_reg_desc *index_to_sys_reg_desc(struct kvm_vcpu *vcpu,
|
|
static const struct sys_reg_desc *index_to_sys_reg_desc(struct kvm_vcpu *vcpu,
|
|
u64 id)
|
|
u64 id)
|
|
@@ -1807,11 +1818,8 @@ static const struct sys_reg_desc *index_to_sys_reg_desc(struct kvm_vcpu *vcpu,
|
|
if ((id & KVM_REG_ARM_COPROC_MASK) != KVM_REG_ARM64_SYSREG)
|
|
if ((id & KVM_REG_ARM_COPROC_MASK) != KVM_REG_ARM64_SYSREG)
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
- if (!index_to_params(id, ¶ms))
|
|
|
|
- return NULL;
|
|
|
|
-
|
|
|
|
table = get_target_table(vcpu->arch.target, true, &num);
|
|
table = get_target_table(vcpu->arch.target, true, &num);
|
|
- r = find_reg(¶ms, table, num);
|
|
|
|
|
|
+ r = find_reg_by_id(id, ¶ms, table, num);
|
|
if (!r)
|
|
if (!r)
|
|
r = find_reg(¶ms, sys_reg_descs, ARRAY_SIZE(sys_reg_descs));
|
|
r = find_reg(¶ms, sys_reg_descs, ARRAY_SIZE(sys_reg_descs));
|
|
|
|
|
|
@@ -1918,10 +1926,8 @@ static int get_invariant_sys_reg(u64 id, void __user *uaddr)
|
|
struct sys_reg_params params;
|
|
struct sys_reg_params params;
|
|
const struct sys_reg_desc *r;
|
|
const struct sys_reg_desc *r;
|
|
|
|
|
|
- if (!index_to_params(id, ¶ms))
|
|
|
|
- return -ENOENT;
|
|
|
|
-
|
|
|
|
- r = find_reg(¶ms, invariant_sys_regs, ARRAY_SIZE(invariant_sys_regs));
|
|
|
|
|
|
+ r = find_reg_by_id(id, ¶ms, invariant_sys_regs,
|
|
|
|
+ ARRAY_SIZE(invariant_sys_regs));
|
|
if (!r)
|
|
if (!r)
|
|
return -ENOENT;
|
|
return -ENOENT;
|
|
|
|
|
|
@@ -1935,9 +1941,8 @@ static int set_invariant_sys_reg(u64 id, void __user *uaddr)
|
|
int err;
|
|
int err;
|
|
u64 val = 0; /* Make sure high bits are 0 for 32-bit regs */
|
|
u64 val = 0; /* Make sure high bits are 0 for 32-bit regs */
|
|
|
|
|
|
- if (!index_to_params(id, ¶ms))
|
|
|
|
- return -ENOENT;
|
|
|
|
- r = find_reg(¶ms, invariant_sys_regs, ARRAY_SIZE(invariant_sys_regs));
|
|
|
|
|
|
+ r = find_reg_by_id(id, ¶ms, invariant_sys_regs,
|
|
|
|
+ ARRAY_SIZE(invariant_sys_regs));
|
|
if (!r)
|
|
if (!r)
|
|
return -ENOENT;
|
|
return -ENOENT;
|
|
|
|
|