Re: [PATCH 07/10] Add kvmppc_mmu_dtlb/itlb_miss for booke

2008-12-18 Thread Hollis Blanchard
On Thu, 2008-12-18 at 20:22 +0800, Liu Yu wrote:
 When itlb or dtlb miss happens, E500 needs to update some mmu registers.
 So that the auto-load mechanism can work on E500 when write a tlb entry.
 
 Signed-off-by: Liu Yu yu@freescale.com
 ---
  arch/powerpc/include/asm/kvm_ppc.h |2 ++
  arch/powerpc/kvm/44x_tlb.c |8 
  arch/powerpc/kvm/booke.c   |2 ++
  3 files changed, 12 insertions(+), 0 deletions(-)
 
 diff --git a/arch/powerpc/include/asm/kvm_ppc.h 
 b/arch/powerpc/include/asm/kvm_ppc.h
 index f4b041b..82547c8 100644
 --- a/arch/powerpc/include/asm/kvm_ppc.h
 +++ b/arch/powerpc/include/asm/kvm_ppc.h
 @@ -63,6 +63,8 @@ extern int kvmppc_mmu_dtlb_index(struct kvm_vcpu *vcpu, 
 gva_t eaddr);
  extern int kvmppc_mmu_itlb_index(struct kvm_vcpu *vcpu, gva_t eaddr);
  extern gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, unsigned int gtlb_index,
gva_t eaddr);
 +extern void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu);
 +extern void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu);
 
  extern struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm,
  unsigned int id);
 diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c
 index e67b731..4a16f47 100644
 --- a/arch/powerpc/kvm/44x_tlb.c
 +++ b/arch/powerpc/kvm/44x_tlb.c
 @@ -232,6 +232,14 @@ int kvmppc_mmu_dtlb_index(struct kvm_vcpu *vcpu, gva_t 
 eaddr)
   return kvmppc_44x_tlb_index(vcpu, eaddr, vcpu-arch.pid, as);
  }
 
 +void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu)
 +{
 +}
 +
 +void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu)
 +{
 +}
 +
  static void kvmppc_44x_shadow_release(struct kvmppc_vcpu_44x *vcpu_44x,
unsigned int stlb_index)
  {
 diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
 index a73b395..933c406 100644
 --- a/arch/powerpc/kvm/booke.c
 +++ b/arch/powerpc/kvm/booke.c
 @@ -295,6 +295,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct 
 kvm_vcpu *vcpu,
   kvmppc_booke_queue_irqprio(vcpu, 
 BOOKE_IRQPRIO_DTLB_MISS);
   vcpu-arch.dear = vcpu-arch.fault_dear;
   vcpu-arch.esr = vcpu-arch.fault_esr;
 + kvmppc_mmu_dtlb_miss(vcpu);
   kvmppc_account_exit(vcpu, DTLB_REAL_MISS_EXITS);
   r = RESUME_GUEST;
   break;
 @@ -337,6 +338,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct 
 kvm_vcpu *vcpu,
   if (gtlb_index  0) {
   /* The guest didn't have a mapping for it. */
   kvmppc_booke_queue_irqprio(vcpu, 
 BOOKE_IRQPRIO_ITLB_MISS);
 + kvmppc_mmu_itlb_miss(vcpu);
   kvmppc_account_exit(vcpu, ITLB_REAL_MISS_EXITS);
   break;
   }

I don't think you've supplied an implementation of these hooks for e500.
Does it build with this patch series applied?

-- 
Hollis Blanchard
IBM Linux Technology Center

--
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 07/10] Add kvmppc_mmu_dtlb/itlb_miss for booke

2008-12-18 Thread Liu Yu

 -Original Message-
 From: kvm-ppc-ow...@vger.kernel.org 
 [mailto:kvm-ppc-ow...@vger.kernel.org] On Behalf Of Hollis Blanchard
 Sent: Friday, December 19, 2008 7:49 AM
 To: Liu Yu-B13201
 Cc: kvm-ppc@vger.kernel.org
 Subject: Re: [PATCH 07/10] Add kvmppc_mmu_dtlb/itlb_miss for booke
 
 On Thu, 2008-12-18 at 20:22 +0800, Liu Yu wrote:
  When itlb or dtlb miss happens, E500 needs to update some 
 mmu registers.
  So that the auto-load mechanism can work on E500 when write 
 a tlb entry.
  
  Signed-off-by: Liu Yu yu@freescale.com
  ---
   arch/powerpc/include/asm/kvm_ppc.h |2 ++
   arch/powerpc/kvm/44x_tlb.c |8 
   arch/powerpc/kvm/booke.c   |2 ++
   3 files changed, 12 insertions(+), 0 deletions(-)
  
  diff --git a/arch/powerpc/include/asm/kvm_ppc.h 
 b/arch/powerpc/include/asm/kvm_ppc.h
  index f4b041b..82547c8 100644
  --- a/arch/powerpc/include/asm/kvm_ppc.h
  +++ b/arch/powerpc/include/asm/kvm_ppc.h
  @@ -63,6 +63,8 @@ extern int kvmppc_mmu_dtlb_index(struct 
 kvm_vcpu *vcpu, gva_t eaddr);
   extern int kvmppc_mmu_itlb_index(struct kvm_vcpu *vcpu, 
 gva_t eaddr);
   extern gpa_t kvmppc_mmu_xlate(struct kvm_vcpu *vcpu, 
 unsigned int gtlb_index,
 gva_t eaddr);
  +extern void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu);
  +extern void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu);
  
   extern struct kvm_vcpu *kvmppc_core_vcpu_create(struct kvm *kvm,
   unsigned int id);
  diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c
  index e67b731..4a16f47 100644
  --- a/arch/powerpc/kvm/44x_tlb.c
  +++ b/arch/powerpc/kvm/44x_tlb.c
  @@ -232,6 +232,14 @@ int kvmppc_mmu_dtlb_index(struct 
 kvm_vcpu *vcpu, gva_t eaddr)
  return kvmppc_44x_tlb_index(vcpu, eaddr, vcpu-arch.pid, as);
   }
  
  +void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu)
  +{
  +}
  +
  +void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu)
  +{
  +}
  +
   static void kvmppc_44x_shadow_release(struct 
 kvmppc_vcpu_44x *vcpu_44x,
 unsigned int stlb_index)
   {
  diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
  index a73b395..933c406 100644
  --- a/arch/powerpc/kvm/booke.c
  +++ b/arch/powerpc/kvm/booke.c
  @@ -295,6 +295,7 @@ int kvmppc_handle_exit(struct kvm_run 
 *run, struct kvm_vcpu *vcpu,
  kvmppc_booke_queue_irqprio(vcpu, 
 BOOKE_IRQPRIO_DTLB_MISS);
  vcpu-arch.dear = vcpu-arch.fault_dear;
  vcpu-arch.esr = vcpu-arch.fault_esr;
  +   kvmppc_mmu_dtlb_miss(vcpu);
  kvmppc_account_exit(vcpu, DTLB_REAL_MISS_EXITS);
  r = RESUME_GUEST;
  break;
  @@ -337,6 +338,7 @@ int kvmppc_handle_exit(struct kvm_run 
 *run, struct kvm_vcpu *vcpu,
  if (gtlb_index  0) {
  /* The guest didn't have a mapping for it. */
  kvmppc_booke_queue_irqprio(vcpu, 
 BOOKE_IRQPRIO_ITLB_MISS);
  +   kvmppc_mmu_itlb_miss(vcpu);
  kvmppc_account_exit(vcpu, ITLB_REAL_MISS_EXITS);
  break;
  }
 
 I don't think you've supplied an implementation of these 
 hooks for e500.
 Does it build with this patch series applied?
 

Sorry, these hooks for e500 exists in [PATCH 06/10] E500 TLB
emulation.

--
+static inline void kvmppc_e500_deliver_tlb_miss(struct kvm_vcpu *vcpu,
+   unsigned int eaddr, int as)
+{
+   struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
+   unsigned int victim, pidsel, tsized;
+   int tlbsel;
+
+   /* since we only have two TLBs, only lower bit is used. */
+   tlbsel = (vcpu_e500-mas4  28)  0x1;
+   victim = (tlbsel == 0) ? tlb0_get_next_victim(vcpu_e500) : 0;
+   pidsel = (vcpu_e500-mas4  16)  0xf;
+   tsized = (vcpu_e500-mas4  8)  0xf;
+
+   vcpu_e500-mas0 = MAS0_TLBSEL(tlbsel) | MAS0_ESEL(victim)
+   | MAS0_NV(vcpu_e500-guest_tlb_nv[tlbsel]);
+   vcpu_e500-mas1 = MAS1_VALID | (as ? MAS1_TS : 0)
+   | MAS1_TID(vcpu_e500-pid[pidsel])
+   | MAS1_TSIZE(tsized);
+   vcpu_e500-mas2 = (eaddr  MAS2_EPN)
+   | (vcpu_e500-mas4  MAS2_ATTRIB_MASK);
+   vcpu_e500-mas3 = MAS3_U0 | MAS3_U1 | MAS3_U2 | MAS3_U3;
+   vcpu_e500-mas6 = (vcpu_e500-mas6  MAS6_SPID1)
+   | (get_cur_pid(vcpu)  16)
+   | (as ? MAS6_SAS : 0);
+   vcpu_e500-mas7 = 0;
+}

+void kvmppc_mmu_itlb_miss(struct kvm_vcpu *vcpu)
+{
+   unsigned int as = !!(vcpu-arch.msr  MSR_IS);
+
+   kvmppc_e500_deliver_tlb_miss(vcpu, vcpu-arch.pc, as);
+}
+
+void kvmppc_mmu_dtlb_miss(struct kvm_vcpu *vcpu)
+{
+   unsigned int as = !!(vcpu-arch.msr  MSR_DS);
+
+   kvmppc_e500_deliver_tlb_miss(vcpu, vcpu-arch.fault_dear, as);
+}
--
To unsubscribe from this list: send the line unsubscribe kvm-ppc in
the body of a message

RE: [PATCH 07/10] Add kvmppc_mmu_dtlb/itlb_miss for booke

2008-12-18 Thread Liu Yu

 -Original Message-
 From: kvm-ppc-ow...@vger.kernel.org 
 [mailto:kvm-ppc-ow...@vger.kernel.org] On Behalf Of Hollis Blanchard
 Sent: Friday, December 19, 2008 7:49 AM
 To: Liu Yu-B13201
 Cc: kvm-ppc@vger.kernel.org
 Subject: Re: [PATCH 07/10] Add kvmppc_mmu_dtlb/itlb_miss for booke
 
 I don't think you've supplied an implementation of these 
 hooks for e500.
 Does it build with this patch series applied?
 

Yes. I have git-am all this patch series, rebuilt and retested them.
--
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