diff mbox

[v9,03/11] arm/arm64: vgic: Introduce find_reg_by_id()

Message ID 1479906118-15832-4-git-send-email-vijay.kilari@gmail.com
State Superseded
Headers show

Commit Message

Vijay Kilari Nov. 23, 2016, 1:01 p.m. UTC
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(-)

-- 
1.9.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Comments

Eric Auger Dec. 6, 2016, 1:27 p.m. UTC | #1
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, &params))

> -		return -ENOENT;

> -

> -	r = find_reg(&params, invariant_sys_regs, ARRAY_SIZE(invariant_sys_regs));

> +	r = find_reg_by_id(id, &params, 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, &params))

> -		return -ENOENT;

> -	r = find_reg(&params, invariant_sys_regs, ARRAY_SIZE(invariant_sys_regs));

> +	r = find_reg_by_id(id, &params, 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 mbox

Patch

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, &params))
-		return -ENOENT;
-
-	r = find_reg(&params, invariant_sys_regs, ARRAY_SIZE(invariant_sys_regs));
+	r = find_reg_by_id(id, &params, 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, &params))
-		return -ENOENT;
-	r = find_reg(&params, invariant_sys_regs, ARRAY_SIZE(invariant_sys_regs));
+	r = find_reg_by_id(id, &params, 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