[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check t
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX |
Date: |
Thu, 18 Jun 2015 17:46:40 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 |
On 18/06/2015 17:44, address@hidden wrote:
> + hwaddr len = 8 << size;
Should be 1 << size, and likewise below in the "if".
Paolo
> + hwaddr paddr;
> + target_ulong page_size;
> + int prot;
> +
> + arm_exclusive_lock();
> +
> + if (env->exclusive_addr != addr) {
> + arm_exclusive_unlock();
> + return 1;
> + }
> +
> + if (arm_get_phys_addr(env, addr, 1, &paddr, &prot, &page_size) != 0) {
> + tlb_fill(ENV_GET_CPU(env), addr, MMU_DATA_STORE, cpu_mmu_index(env),
> + retaddr);
> + if (arm_get_phys_addr(env, addr, 1, &paddr, &prot, &page_size) !=
> 0) {
> + arm_exclusive_unlock();
> + return 1;
> + }
> + }
> +
> + switch (size) {
> + case 0:
> + {
> + uint8_t oldval, *p;
> + p = address_space_map(cs->as, paddr, &len, true);
> + if (len == 8 << size) {
> + oldval = (uint8_t)env->exclusive_val;
> + result = (atomic_cmpxchg(p, oldval, (uint8_t)newval) == oldval);
> + }
> + address_space_unmap(cs->as, p, len, true, result ? 8 : 0);
> + }
> + break;
> + case 1:
> + {
> + uint16_t oldval, *p;
> + p = address_space_map(cs->as, paddr, &len, true);
> + if (len == 8 << size) {
> + oldval = (uint16_t)env->exclusive_val;
> + result = (atomic_cmpxchg(p, oldval, (uint16_t)newval) == oldval);
> + }
> + address_space_unmap(cs->as, p, len, true, result ? 8 : 0);
> + }
> + break;
> + case 2:
> + {
> + uint32_t oldval, *p;
> + p = address_space_map(cs->as, paddr, &len, true);
> + if (len == 8 << size) {
> + oldval = (uint32_t)env->exclusive_val;
> + result = (atomic_cmpxchg(p, oldval, (uint32_t)newval) == oldval);
> + }
> + address_space_unmap(cs->as, p, len, true, result ? 8 : 0);
> + }
> + break;
> + case 3:
> + {
> + uint64_t oldval, *p;
> + p = address_space_map(cs->as, paddr, &len, true);
> + if (len == 8 << size) {
> + oldval = (uint64_t)env->exclusive_val;
> + result = (atomic_cmpxchg(p, oldval, (uint64_t)newval) == oldval);
> + }
> + address_space_unmap(cs->as, p, len, true, result ? 8 : 0);
> + }
> + break;
> + default:
> + abort();
> + break;
- [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX, fred . konrad, 2015/06/18
- Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX,
Paolo Bonzini <=
- Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX, Peter Maydell, 2015/06/18
- Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX, Mark Burton, 2015/06/18
- Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX, Peter Maydell, 2015/06/18
- Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX, Mark Burton, 2015/06/19
- Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX, Paolo Bonzini, 2015/06/19
- Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX, Mark Burton, 2015/06/19
- Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX, Paolo Bonzini, 2015/06/19
- Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX, Mark Burton, 2015/06/19