On 18/06/2015 17:44, fred.kon...@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;