long __lock arch_atomic_cmpxchg(atomic_t *atom, long oldval, long newval) { long previous, res; arch_smp_mb(); do { __asm__ __volatile__("@ atomic_cmpxchg\n" "ldrex %1, [%3]\n" "mov %0, #0\n" "teq %1, %4\n" "strexeq %0, %5, [%3]\n" : "=&r" (res), "=&r" (previous), "+Qo" (atom->counter) : "r" (&atom->counter), "Ir" (oldval), "r" (newval) : "cc"); } while (res); arch_smp_mb(); return oldval; }
static void __arm_lpae_set_pte(arm_lpae_iopte *ptep, arm_lpae_iopte pte, struct io_pgtable_cfg *cfg) { *ptep = pte; arch_smp_mb(); }