diff mbox series

[09/14] KVM: arm64: Reuse sys_reg() macro when searching the trap table

Message ID 20190124140032.8588-10-christoffer.dall@arm.com (mailing list archive)
State New, archived
Headers show
Series KVM: arm/arm64: Various rework in preparation of nested virt support | expand

Commit Message

Christoffer Dall Jan. 24, 2019, 2 p.m. UTC
From: Marc Zyngier <marc.zyngier@arm.com>

Instead of having an open-coded macro, reuse the sys_reg() macro
that does the exact same thing.

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Acked-by: Christoffer Dall <christoffer.dall@arm.com>
---
 arch/arm64/kvm/sys_regs.c | 19 ++++++-------------
 1 file changed, 6 insertions(+), 13 deletions(-)

Comments

Andre Przywara Jan. 30, 2019, 8:57 a.m. UTC | #1
On Thu, 24 Jan 2019 15:00:27 +0100
Christoffer Dall <christoffer.dall@arm.com> wrote:

Hi,

> From: Marc Zyngier <marc.zyngier@arm.com>
> 
> Instead of having an open-coded macro, reuse the sys_reg() macro
> that does the exact same thing.

It's not the exact same thing, is it? It looks like being off by 5 bit
to me. I think the patch is still fine, but maybe mention in the commit
message that this difference is OK since it's only used as a key for
comparing register indices?

Cheers,
Andre.

> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> Acked-by: Christoffer Dall <christoffer.dall@arm.com>
> ---
>  arch/arm64/kvm/sys_regs.c | 19 ++++++-------------
>  1 file changed, 6 insertions(+), 13 deletions(-)
> 
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index e3e37228ae4e..1a5bea4285e4 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -965,6 +965,10 @@ static bool access_pmuserenr(struct kvm_vcpu
> *vcpu, struct sys_reg_params *p, return true;
>  }
>  
> +#define
> reg_to_encoding(x)						\
> +	sys_reg((u32)(x)->Op0,
> (u32)(x)->Op1,				\
> +		(u32)(x)->CRn, (u32)(x)->CRm, (u32)(x)->Op2);
> +
>  /* Silly macro to expand the DBG{BCR,BVR,WVR,WCR}n_EL1 registers in
> one go */ #define
> DBG_BCR_BVR_WCR_WVR_EL1(n)					\
> { SYS_DESC(SYS_DBGBVRn_EL1(n)),
> \ @@ -1820,30 +1824,19 @@ static const struct sys_reg_desc
> *get_target_table(unsigned target, } }
>  
> -#define
> reg_to_match_value(x)						\
> -
> ({								\
> -		unsigned long
> val;					\
> -		val  = (x)->Op0 <<
> 14;					\
> -		val |= (x)->Op1 <<
> 11;					\
> -		val |= (x)->CRn <<
> 7;					\
> -		val |= (x)->CRm <<
> 3;					\
> -		val |=
> (x)->Op2;					\
> -
> val;							\
> -	 })
> -
>  static int match_sys_reg(const void *key, const void *elt)
>  {
>  	const unsigned long pval = (unsigned long)key;
>  	const struct sys_reg_desc *r = elt;
>  
> -	return pval - reg_to_match_value(r);
> +	return pval - reg_to_encoding(r);
>  }
>  
>  static const struct sys_reg_desc *find_reg(const struct
> sys_reg_params *params, const struct sys_reg_desc table[],
>  					 unsigned int num)
>  {
> -	unsigned long pval = reg_to_match_value(params);
> +	unsigned long pval = reg_to_encoding(params);
>  
>  	return bsearch((void *)pval, table, num, sizeof(table[0]),
> match_sys_reg); }
diff mbox series

Patch

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index e3e37228ae4e..1a5bea4285e4 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -965,6 +965,10 @@  static bool access_pmuserenr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
 	return true;
 }
 
+#define reg_to_encoding(x)						\
+	sys_reg((u32)(x)->Op0, (u32)(x)->Op1,				\
+		(u32)(x)->CRn, (u32)(x)->CRm, (u32)(x)->Op2);
+
 /* Silly macro to expand the DBG{BCR,BVR,WVR,WCR}n_EL1 registers in one go */
 #define DBG_BCR_BVR_WCR_WVR_EL1(n)					\
 	{ SYS_DESC(SYS_DBGBVRn_EL1(n)),					\
@@ -1820,30 +1824,19 @@  static const struct sys_reg_desc *get_target_table(unsigned target,
 	}
 }
 
-#define reg_to_match_value(x)						\
-	({								\
-		unsigned long val;					\
-		val  = (x)->Op0 << 14;					\
-		val |= (x)->Op1 << 11;					\
-		val |= (x)->CRn << 7;					\
-		val |= (x)->CRm << 3;					\
-		val |= (x)->Op2;					\
-		val;							\
-	 })
-
 static int match_sys_reg(const void *key, const void *elt)
 {
 	const unsigned long pval = (unsigned long)key;
 	const struct sys_reg_desc *r = elt;
 
-	return pval - reg_to_match_value(r);
+	return pval - reg_to_encoding(r);
 }
 
 static const struct sys_reg_desc *find_reg(const struct sys_reg_params *params,
 					 const struct sys_reg_desc table[],
 					 unsigned int num)
 {
-	unsigned long pval = reg_to_match_value(params);
+	unsigned long pval = reg_to_encoding(params);
 
 	return bsearch((void *)pval, table, num, sizeof(table[0]), match_sys_reg);
 }