RE: Emulating lwarx and stwcx instructions in PowerPc BOOKE e500

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Aashish,
Following is an example of the linux code where it uses lwarx and stcwx. 

1:     lwarx   %0,0,%3         # atomic_add\n\
        add     %0,%2,%0\n"
        PPC405_ERR77(0,%3)
"       stwcx.  %0,0,%3 \n\
        bne-    1b"

As you would notice after stcwx it checks for equal bit in the cr register. So I think in your code
you should also update the cr register after stcwx for the guest. 

Regards
Varun
> -----Original Message-----
> From: kvm-ppc-owner@xxxxxxxxxxxxxxx [mailto:kvm-ppc-
> owner@xxxxxxxxxxxxxxx] On Behalf Of Aashish Mittal
> Sent: Tuesday, March 06, 2012 2:07 AM
> To: kvm-ppc@xxxxxxxxxxxxxxx
> Subject: Emulating lwarx and stwcx instructions in PowerPc BOOKE e500
> 
> Hi
> I'm working on powerpc booke architecture and my project requires me to
> remove read and write privileges on some pages. Due to this any
> instruction accessing these pages traps and i'm trying to emulate the
> behavior of these instructions.
> 
> I've emulated lwarx and stwcx instruction but i think stwcx is not
> working correctly. The emulation i've written is written below
> 
> case OP_31_XOP_LWARX:
> {
>   ulong ret;
>   ulong addr;
>   int eh = inst & 0x00000001 ;
>   kvm_gva_to_hva(vcpu,ea,&addr);
>   /*lwarx RT RA RB EH*/
>   if(eh == 0)
>       __asm__ __volatile__("lwarx %0,0,%1,0; isync":"=r" (ret) :"r"
> (addr));
>   else
>      __asm__ __volatile__("lwarx %0,0,%1,1; isync":"=r" (ret) :"r"
> (addr));
> 
>   kvmppc_set_gpr(vcpu,rt,ret);
> }
> 
> case OP_31_XOP_STWCX:
> {
>   ulong tmp;
>   ulong addr;
>   ulong data;
>   kvm_gva_to_hva(vcpu,ea,&addr);
>   kvmppc_read_guest(vcpu,ea,&data,sizeof(data));
>   __asm__ __volatile__("stwcx. %1,0,%2; isync"
>   :"=r" (tmp):"r" (data),"r" (addr):"memory");
> 
> }
> 
> Here kvm_gva_to_hva function convrets a guest effective address to host
> virtual address .
> 
> void kvm_gva_to_hva(struct kvm_vcpu *vcpu, ulong ea,ulong* hva) {
>   gfn_t gfn;
>   gpa_t gpa ;
>   int gtlb_index;
>   int offset;
>   ulong addr;
>   struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
> 
>   gtlb_index = kvmppc_mmu_itlb_index(vcpu, ea);
>   gpa = kvmppc_mmu_xlate(vcpu,gtlb_index, ea);
>   gfn = gpa >> PAGE_SHIFT;
>   addr = (ulong)gfn_to_hva(vcpu_e500->vcpu.kvm, gfn);
>   offset = offset_in_page(gpa);
> 
>   *hva = addr + offset;
>   return;
> }
> 
> The guest just hangs once it encounters a stwcx instruction. Does anybody
> have any idea why this is not working and what's wrong about the
> emulation code.
> 
> Also i'm working on linux-3.0-rc4 kernel .
> 
> Thanks in advance
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the
> body of a message to majordomo@xxxxxxxxxxxxxxx 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM Development]     [KVM ARM]     [KVM ia64]     [Linux Virtualization]     [Linux USB Devel]     [Linux Video]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux