Re: Emulating lwarx and stwcx instructions in PowerPc BOOKE e500

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

 



I'm thinking of emulating the lwarx and stwcx instruction as follows

1) to emulate lwarx i will just do a load word instruction .
 In order to emulate lwarx correctly, i will need to setup a global
reservation structure, which has a reservation entry for each CPU.
Upon making the lwarx, i will set the internal reserve bit, then setup a
snoop address.  All writes to the memory block that the address is in
will destroy the reservation in this structure.
Since i'm not calling a direct lwarx instruction upon encountering a lwarx in
guest this will not leave a reservation when i'm returning to guest.

2) Upon encountering a stwcx instruction in guest i can match the
reservation address
as stored in my global reservation structure. If it matches then i can
fire a dummy lwarx
first in host and then fire the stwcx.

Will that work ?

Thanks in advance


On Tue, Mar 6, 2012 at 8:16 PM, Sethi Varun-B16395 <B16395@xxxxxxxxxxxxx> wrote:
> 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



-- 
Thanks and regards
Aashish Mittal
Final year Dual Degree
IIT delhi
--
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