mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 21:57:43 +00:00
KVM: arm64: Add get_reg_by_id() as a sys_reg_desc retrieving helper
find_reg_by_id() requires a sys_reg_param as input, which most users provide as a on-stack variable, but don't make any use of the result. Provide a helper that doesn't have this requirement and simplify the callers (all but one). Reviewed-by: Reiji Watanabe <reijiw@google.com> Signed-off-by: Marc Zyngier <maz@kernel.org>
This commit is contained in:
parent
a111daf0c5
commit
da8d120fba
3 changed files with 23 additions and 17 deletions
|
@ -2650,21 +2650,29 @@ const struct sys_reg_desc *find_reg_by_id(u64 id,
|
||||||
return find_reg(params, table, num);
|
return find_reg(params, table, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct sys_reg_desc *get_reg_by_id(u64 id,
|
||||||
|
const struct sys_reg_desc table[],
|
||||||
|
unsigned int num)
|
||||||
|
{
|
||||||
|
struct sys_reg_params params;
|
||||||
|
|
||||||
|
if (!index_to_params(id, ¶ms))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return find_reg(¶ms, 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)
|
||||||
{
|
{
|
||||||
const struct sys_reg_desc *r;
|
const struct sys_reg_desc *r;
|
||||||
struct sys_reg_params params;
|
|
||||||
|
|
||||||
/* We only do sys_reg for now. */
|
/* We only do sys_reg for now. */
|
||||||
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))
|
r = get_reg_by_id(id, sys_reg_descs, ARRAY_SIZE(sys_reg_descs));
|
||||||
return NULL;
|
|
||||||
|
|
||||||
r = find_reg(¶ms, sys_reg_descs, ARRAY_SIZE(sys_reg_descs));
|
|
||||||
|
|
||||||
/* Not saved in the sys_reg array and not otherwise accessible? */
|
/* Not saved in the sys_reg array and not otherwise accessible? */
|
||||||
if (r && !(r->reg || r->get_user))
|
if (r && !(r->reg || r->get_user))
|
||||||
|
@ -2723,11 +2731,10 @@ static int reg_to_user(void __user *uaddr, const u64 *val, u64 id)
|
||||||
|
|
||||||
static int get_invariant_sys_reg(u64 id, void __user *uaddr)
|
static int get_invariant_sys_reg(u64 id, void __user *uaddr)
|
||||||
{
|
{
|
||||||
struct sys_reg_params params;
|
|
||||||
const struct sys_reg_desc *r;
|
const struct sys_reg_desc *r;
|
||||||
|
|
||||||
r = find_reg_by_id(id, ¶ms, invariant_sys_regs,
|
r = get_reg_by_id(id, invariant_sys_regs,
|
||||||
ARRAY_SIZE(invariant_sys_regs));
|
ARRAY_SIZE(invariant_sys_regs));
|
||||||
if (!r)
|
if (!r)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
|
@ -2736,13 +2743,12 @@ static int get_invariant_sys_reg(u64 id, void __user *uaddr)
|
||||||
|
|
||||||
static int set_invariant_sys_reg(u64 id, void __user *uaddr)
|
static int set_invariant_sys_reg(u64 id, void __user *uaddr)
|
||||||
{
|
{
|
||||||
struct sys_reg_params params;
|
|
||||||
const struct sys_reg_desc *r;
|
const struct sys_reg_desc *r;
|
||||||
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 */
|
||||||
|
|
||||||
r = find_reg_by_id(id, ¶ms, invariant_sys_regs,
|
r = get_reg_by_id(id, invariant_sys_regs,
|
||||||
ARRAY_SIZE(invariant_sys_regs));
|
ARRAY_SIZE(invariant_sys_regs));
|
||||||
if (!r)
|
if (!r)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
|
|
|
@ -195,6 +195,10 @@ const struct sys_reg_desc *find_reg_by_id(u64 id,
|
||||||
const struct sys_reg_desc table[],
|
const struct sys_reg_desc table[],
|
||||||
unsigned int num);
|
unsigned int num);
|
||||||
|
|
||||||
|
const struct sys_reg_desc *get_reg_by_id(u64 id,
|
||||||
|
const struct sys_reg_desc table[],
|
||||||
|
unsigned int num);
|
||||||
|
|
||||||
#define AA32(_x) .aarch32_map = AA32_##_x
|
#define AA32(_x) .aarch32_map = AA32_##_x
|
||||||
#define Op0(_x) .Op0 = _x
|
#define Op0(_x) .Op0 = _x
|
||||||
#define Op1(_x) .Op1 = _x
|
#define Op1(_x) .Op1 = _x
|
||||||
|
|
|
@ -263,14 +263,10 @@ static const struct sys_reg_desc gic_v3_icc_reg_descs[] = {
|
||||||
int vgic_v3_has_cpu_sysregs_attr(struct kvm_vcpu *vcpu, bool is_write, u64 id,
|
int vgic_v3_has_cpu_sysregs_attr(struct kvm_vcpu *vcpu, bool is_write, u64 id,
|
||||||
u64 *reg)
|
u64 *reg)
|
||||||
{
|
{
|
||||||
struct sys_reg_params params;
|
|
||||||
u64 sysreg = (id & KVM_DEV_ARM_VGIC_SYSREG_MASK) | KVM_REG_SIZE_U64;
|
u64 sysreg = (id & KVM_DEV_ARM_VGIC_SYSREG_MASK) | KVM_REG_SIZE_U64;
|
||||||
|
|
||||||
params.regval = *reg;
|
if (get_reg_by_id(sysreg, gic_v3_icc_reg_descs,
|
||||||
params.is_write = is_write;
|
ARRAY_SIZE(gic_v3_icc_reg_descs)))
|
||||||
|
|
||||||
if (find_reg_by_id(sysreg, ¶ms, gic_v3_icc_reg_descs,
|
|
||||||
ARRAY_SIZE(gic_v3_icc_reg_descs)))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
Loading…
Reference in a new issue