From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33898) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5c1h-00030m-Bw for qemu-devel@nongnu.org; Thu, 18 Jun 2015 11:46:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z5c1e-0004Nc-0K for qemu-devel@nongnu.org; Thu, 18 Jun 2015 11:46:49 -0400 Received: from mx1.redhat.com ([209.132.183.28]:45384) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5c1d-0004NV-HC for qemu-devel@nongnu.org; Thu, 18 Jun 2015 11:46:45 -0400 Message-ID: <5582E7E0.2040903@redhat.com> Date: Thu, 18 Jun 2015 17:46:40 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1434642290-17610-1-git-send-email-fred.konrad@greensocs.com> In-Reply-To: <1434642290-17610-1-git-send-email-fred.konrad@greensocs.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH V3] Use atomic cmpxchg to atomically check the exclusive value in a STREX List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: fred.konrad@greensocs.com, qemu-devel@nongnu.org, mttcg@greensocs.com Cc: mark.burton@greensocs.com, peter.maydell@linaro.org, alex.bennee@linaro.org, agraf@suse.de, guillaume.delbergue@greensocs.com On 18/06/2015 17:44, fred.konrad@greensocs.com 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;