|
@@ -117,8 +117,9 @@ static void arm_kernel_cmpxchg32_helper(CPUARMState *env)
|
|
{
|
|
{
|
|
uint32_t oldval, newval, val, addr, cpsr, *host_addr;
|
|
uint32_t oldval, newval, val, addr, cpsr, *host_addr;
|
|
|
|
|
|
- oldval = env->regs[0];
|
|
|
|
- newval = env->regs[1];
|
|
|
|
|
|
+ /* Swap if host != guest endianness, for the host cmpxchg below */
|
|
|
|
+ oldval = tswap32(env->regs[0]);
|
|
|
|
+ newval = tswap32(env->regs[1]);
|
|
addr = env->regs[2];
|
|
addr = env->regs[2];
|
|
|
|
|
|
mmap_lock();
|
|
mmap_lock();
|
|
@@ -174,6 +175,10 @@ static void arm_kernel_cmpxchg64_helper(CPUARMState *env)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* Swap if host != guest endianness, for the host cmpxchg below */
|
|
|
|
+ oldval = tswap64(oldval);
|
|
|
|
+ newval = tswap64(newval);
|
|
|
|
+
|
|
#ifdef CONFIG_ATOMIC64
|
|
#ifdef CONFIG_ATOMIC64
|
|
val = qatomic_cmpxchg__nocheck(host_addr, oldval, newval);
|
|
val = qatomic_cmpxchg__nocheck(host_addr, oldval, newval);
|
|
cpsr = (val == oldval) * CPSR_C;
|
|
cpsr = (val == oldval) * CPSR_C;
|