Message ID | 1479906118-15832-4-git-send-email-vijay.kilari@gmail.com |
---|---|
State | Superseded |
Headers | show |
Hi Vijay, On 23/11/2016 14:01, vijay.kilari@gmail.com wrote: > From: Vijaya Kumar K <Vijaya.Kumar@cavium.com> > > In order to implement vGICv3 CPU interface access, we will need to perform > table lookup of system registers. We would need both index_to_params() and > find_reg() exported for that purpose, but instead we export a single > function which combines them both. > > Signed-off-by: Pavel Fedin <p.fedin@samsung.com> > Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@cavium.com> > Reviewed-by: Andre Przywara <andre.przywara@arm.com> > Acked-by: Christoffer Dall <christoffer.dall@linaro.org> > --- > arch/arm64/kvm/sys_regs.c | 22 +++++++++++++++------- > arch/arm64/kvm/sys_regs.h | 4 ++++ > 2 files changed, 19 insertions(+), 7 deletions(-) > > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c > index f302fdb..1330d4c 100644 > --- a/arch/arm64/kvm/sys_regs.c > +++ b/arch/arm64/kvm/sys_regs.c > @@ -1789,6 +1789,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); > +} > + Can't you use find_reg_by_id in index_to_sys_reg_desc too? Besides Reviewed-by: Eric Auger <eric.auger@redhat.com> Thanks Eric > /* 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, > u64 id) > @@ -1912,10 +1923,8 @@ static int get_invariant_sys_reg(u64 id, void __user *uaddr) > struct sys_reg_params params; > 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) > return -ENOENT; > > @@ -1929,9 +1938,8 @@ static int set_invariant_sys_reg(u64 id, void __user *uaddr) > int err; > 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) > return -ENOENT; > > diff --git a/arch/arm64/kvm/sys_regs.h b/arch/arm64/kvm/sys_regs.h > index dbbb01c..9c6ffd0 100644 > --- a/arch/arm64/kvm/sys_regs.h > +++ b/arch/arm64/kvm/sys_regs.h > @@ -136,6 +136,10 @@ static inline int cmp_sys_reg(const struct sys_reg_desc *i1, > return i1->Op2 - i2->Op2; > } > > +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); > > #define Op0(_x) .Op0 = _x > #define Op1(_x) .Op1 = _x > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index f302fdb..1330d4c 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -1789,6 +1789,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. */ static const struct sys_reg_desc *index_to_sys_reg_desc(struct kvm_vcpu *vcpu, u64 id) @@ -1912,10 +1923,8 @@ static int get_invariant_sys_reg(u64 id, void __user *uaddr) struct sys_reg_params params; 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) return -ENOENT; @@ -1929,9 +1938,8 @@ static int set_invariant_sys_reg(u64 id, void __user *uaddr) int err; 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) return -ENOENT; diff --git a/arch/arm64/kvm/sys_regs.h b/arch/arm64/kvm/sys_regs.h index dbbb01c..9c6ffd0 100644 --- a/arch/arm64/kvm/sys_regs.h +++ b/arch/arm64/kvm/sys_regs.h @@ -136,6 +136,10 @@ static inline int cmp_sys_reg(const struct sys_reg_desc *i1, return i1->Op2 - i2->Op2; } +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); #define Op0(_x) .Op0 = _x #define Op1(_x) .Op1 = _x