[PATCH 1/5] KVM: PPC: Book3S HV: Fix computation of tlbie operand

2014-11-02 Thread Paul Mackerras
The B (segment size) field in the RB operand for the tlbie
instruction is two bits, which we get from the top two bits of
the first doubleword of the HPT entry to be invalidated.  These
bits go in bits 8 and 9 of the RB operand (bits 54 and 55 in IBM
bit numbering).

The compute_tlbie_rb() function gets these bits as v  (62 - 8),
which is not correct as it will bring in the top 10 bits, not
just the top two.  These extra bits could corrupt the AP, AVAL
and L fields in the RB value.  To fix this we shift right 62 bits
and then shift left 8 bits, so we only get the two bits of the
B field.

The first doubleword of the HPT entry is under the control of the
guest kernel.  In fact, Linux guests will always put zeroes in bits
54 -- 61 (IBM bits 2 -- 9), but we should not rely on guests doing
this.

Cc: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com
Signed-off-by: Paul Mackerras pau...@samba.org
---
 arch/powerpc/include/asm/kvm_book3s_64.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h 
b/arch/powerpc/include/asm/kvm_book3s_64.h
index 0aa8179..a37f1a4 100644
--- a/arch/powerpc/include/asm/kvm_book3s_64.h
+++ b/arch/powerpc/include/asm/kvm_book3s_64.h
@@ -148,7 +148,7 @@ static inline unsigned long compute_tlbie_rb(unsigned long 
v, unsigned long r,
/* This covers 14..54 bits of va*/
rb = (v  ~0x7fUL)  16;   /* AVA field */
 
-   rb |= v  (62 - 8);/*  B field */
+   rb |= (v  HPTE_V_SSIZE_SHIFT)  8;   /*  B field */
/*
 * AVA in v had cleared lower 23 bits. We need to derive
 * that from pteg index
-- 
2.1.1

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/5] KVM: PPC: Book3S HV: Fix computation of tlbie operand

2014-11-02 Thread Aneesh Kumar K.V
Paul Mackerras pau...@samba.org writes:

 The B (segment size) field in the RB operand for the tlbie
 instruction is two bits, which we get from the top two bits of
 the first doubleword of the HPT entry to be invalidated.  These
 bits go in bits 8 and 9 of the RB operand (bits 54 and 55 in IBM
 bit numbering).

 The compute_tlbie_rb() function gets these bits as v  (62 - 8),
 which is not correct as it will bring in the top 10 bits, not
 just the top two.  These extra bits could corrupt the AP, AVAL
 and L fields in the RB value.  To fix this we shift right 62 bits
 and then shift left 8 bits, so we only get the two bits of the
 B field.

Good catch.


 The first doubleword of the HPT entry is under the control of the
 guest kernel.  In fact, Linux guests will always put zeroes in bits
 54 -- 61 (IBM bits 2 -- 9), but we should not rely on guests doing
 this.

 Cc: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com
 Signed-off-by: Paul Mackerras pau...@samba.org


Reviewed-by: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com

 ---
  arch/powerpc/include/asm/kvm_book3s_64.h | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

 diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h 
 b/arch/powerpc/include/asm/kvm_book3s_64.h
 index 0aa8179..a37f1a4 100644
 --- a/arch/powerpc/include/asm/kvm_book3s_64.h
 +++ b/arch/powerpc/include/asm/kvm_book3s_64.h
 @@ -148,7 +148,7 @@ static inline unsigned long compute_tlbie_rb(unsigned 
 long v, unsigned long r,
   /* This covers 14..54 bits of va*/
   rb = (v  ~0x7fUL)  16;   /* AVA field */
  
 - rb |= v  (62 - 8);/*  B field */
 + rb |= (v  HPTE_V_SSIZE_SHIFT)  8;   /*  B field */
   /*
* AVA in v had cleared lower 23 bits. We need to derive
* that from pteg index
 -- 
 2.1.1

 --
 To unsubscribe from this list: send the line unsubscribe kvm-ppc in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/5] KVM: PPC: Book3S HV: Fix computation of tlbie operand

2014-11-02 Thread Aneesh Kumar K.V
Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com writes:

 Paul Mackerras pau...@samba.org writes:

 The B (segment size) field in the RB operand for the tlbie
 instruction is two bits, which we get from the top two bits of
 the first doubleword of the HPT entry to be invalidated.  These
 bits go in bits 8 and 9 of the RB operand (bits 54 and 55 in IBM
 bit numbering).

 The compute_tlbie_rb() function gets these bits as v  (62 - 8),
 which is not correct as it will bring in the top 10 bits, not
 just the top two.  These extra bits could corrupt the AP, AVAL
 and L fields in the RB value.  To fix this we shift right 62 bits
 and then shift left 8 bits, so we only get the two bits of the
 B field.

 Good catch.


 The first doubleword of the HPT entry is under the control of the
 guest kernel.  In fact, Linux guests will always put zeroes in bits
 54 -- 61 (IBM bits 2 -- 9), but we should not rely on guests doing
 this.

 Cc: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com
 Signed-off-by: Paul Mackerras pau...@samba.org


 Reviewed-by: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com

 ---
  arch/powerpc/include/asm/kvm_book3s_64.h | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

 diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h 
 b/arch/powerpc/include/asm/kvm_book3s_64.h
 index 0aa8179..a37f1a4 100644
 --- a/arch/powerpc/include/asm/kvm_book3s_64.h
 +++ b/arch/powerpc/include/asm/kvm_book3s_64.h
 @@ -148,7 +148,7 @@ static inline unsigned long compute_tlbie_rb(unsigned 
 long v, unsigned long r,
  /* This covers 14..54 bits of va*/
  rb = (v  ~0x7fUL)  16;   /* AVA field */
  
 -rb |= v  (62 - 8);/*  B field */
 +rb |= (v  HPTE_V_SSIZE_SHIFT)  8;   /*  B field */

or should we do. I guess the below is more closer to what we have in
rest of the code ?

   rb |= ((v  (HPTE_V_SSIZE_SHIFT - 8))  ~0xffUL); 


  /*
   * AVA in v had cleared lower 23 bits. We need to derive
   * that from pteg index
 -- 
 2.1.1

 --
 To unsubscribe from this list: send the line unsubscribe kvm-ppc in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/5] KVM: PPC: Book3S HV: Fix computation of tlbie operand

2014-11-02 Thread Paul Mackerras
The B (segment size) field in the RB operand for the tlbie
instruction is two bits, which we get from the top two bits of
the first doubleword of the HPT entry to be invalidated.  These
bits go in bits 8 and 9 of the RB operand (bits 54 and 55 in IBM
bit numbering).

The compute_tlbie_rb() function gets these bits as v  (62 - 8),
which is not correct as it will bring in the top 10 bits, not
just the top two.  These extra bits could corrupt the AP, AVAL
and L fields in the RB value.  To fix this we shift right 62 bits
and then shift left 8 bits, so we only get the two bits of the
B field.

The first doubleword of the HPT entry is under the control of the
guest kernel.  In fact, Linux guests will always put zeroes in bits
54 -- 61 (IBM bits 2 -- 9), but we should not rely on guests doing
this.

Cc: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com
Signed-off-by: Paul Mackerras pau...@samba.org
---
 arch/powerpc/include/asm/kvm_book3s_64.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h 
b/arch/powerpc/include/asm/kvm_book3s_64.h
index 0aa8179..a37f1a4 100644
--- a/arch/powerpc/include/asm/kvm_book3s_64.h
+++ b/arch/powerpc/include/asm/kvm_book3s_64.h
@@ -148,7 +148,7 @@ static inline unsigned long compute_tlbie_rb(unsigned long 
v, unsigned long r,
/* This covers 14..54 bits of va*/
rb = (v  ~0x7fUL)  16;   /* AVA field */
 
-   rb |= v  (62 - 8);/*  B field */
+   rb |= (v  HPTE_V_SSIZE_SHIFT)  8;   /*  B field */
/*
 * AVA in v had cleared lower 23 bits. We need to derive
 * that from pteg index
-- 
2.1.1

--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/5] KVM: PPC: Book3S HV: Fix computation of tlbie operand

2014-11-02 Thread Aneesh Kumar K.V
Paul Mackerras pau...@samba.org writes:

 The B (segment size) field in the RB operand for the tlbie
 instruction is two bits, which we get from the top two bits of
 the first doubleword of the HPT entry to be invalidated.  These
 bits go in bits 8 and 9 of the RB operand (bits 54 and 55 in IBM
 bit numbering).

 The compute_tlbie_rb() function gets these bits as v  (62 - 8),
 which is not correct as it will bring in the top 10 bits, not
 just the top two.  These extra bits could corrupt the AP, AVAL
 and L fields in the RB value.  To fix this we shift right 62 bits
 and then shift left 8 bits, so we only get the two bits of the
 B field.

Good catch.


 The first doubleword of the HPT entry is under the control of the
 guest kernel.  In fact, Linux guests will always put zeroes in bits
 54 -- 61 (IBM bits 2 -- 9), but we should not rely on guests doing
 this.

 Cc: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com
 Signed-off-by: Paul Mackerras pau...@samba.org


Reviewed-by: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com

 ---
  arch/powerpc/include/asm/kvm_book3s_64.h | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

 diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h 
 b/arch/powerpc/include/asm/kvm_book3s_64.h
 index 0aa8179..a37f1a4 100644
 --- a/arch/powerpc/include/asm/kvm_book3s_64.h
 +++ b/arch/powerpc/include/asm/kvm_book3s_64.h
 @@ -148,7 +148,7 @@ static inline unsigned long compute_tlbie_rb(unsigned 
 long v, unsigned long r,
   /* This covers 14..54 bits of va*/
   rb = (v  ~0x7fUL)  16;   /* AVA field */
  
 - rb |= v  (62 - 8);/*  B field */
 + rb |= (v  HPTE_V_SSIZE_SHIFT)  8;   /*  B field */
   /*
* AVA in v had cleared lower 23 bits. We need to derive
* that from pteg index
 -- 
 2.1.1

 --
 To unsubscribe from this list: send the line unsubscribe kvm-ppc in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/5] KVM: PPC: Book3S HV: Fix computation of tlbie operand

2014-11-02 Thread Aneesh Kumar K.V
Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com writes:

 Paul Mackerras pau...@samba.org writes:

 The B (segment size) field in the RB operand for the tlbie
 instruction is two bits, which we get from the top two bits of
 the first doubleword of the HPT entry to be invalidated.  These
 bits go in bits 8 and 9 of the RB operand (bits 54 and 55 in IBM
 bit numbering).

 The compute_tlbie_rb() function gets these bits as v  (62 - 8),
 which is not correct as it will bring in the top 10 bits, not
 just the top two.  These extra bits could corrupt the AP, AVAL
 and L fields in the RB value.  To fix this we shift right 62 bits
 and then shift left 8 bits, so we only get the two bits of the
 B field.

 Good catch.


 The first doubleword of the HPT entry is under the control of the
 guest kernel.  In fact, Linux guests will always put zeroes in bits
 54 -- 61 (IBM bits 2 -- 9), but we should not rely on guests doing
 this.

 Cc: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com
 Signed-off-by: Paul Mackerras pau...@samba.org


 Reviewed-by: Aneesh Kumar K.V aneesh.ku...@linux.vnet.ibm.com

 ---
  arch/powerpc/include/asm/kvm_book3s_64.h | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

 diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h 
 b/arch/powerpc/include/asm/kvm_book3s_64.h
 index 0aa8179..a37f1a4 100644
 --- a/arch/powerpc/include/asm/kvm_book3s_64.h
 +++ b/arch/powerpc/include/asm/kvm_book3s_64.h
 @@ -148,7 +148,7 @@ static inline unsigned long compute_tlbie_rb(unsigned 
 long v, unsigned long r,
  /* This covers 14..54 bits of va*/
  rb = (v  ~0x7fUL)  16;   /* AVA field */
  
 -rb |= v  (62 - 8);/*  B field */
 +rb |= (v  HPTE_V_SSIZE_SHIFT)  8;   /*  B field */

or should we do. I guess the below is more closer to what we have in
rest of the code ?

   rb |= ((v  (HPTE_V_SSIZE_SHIFT - 8))  ~0xffUL); 


  /*
   * AVA in v had cleared lower 23 bits. We need to derive
   * that from pteg index
 -- 
 2.1.1

 --
 To unsubscribe from this list: send the line unsubscribe kvm-ppc in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html