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