#include #include #include #include void spin_lock(struct spinlock *lock) { u32 val, fail; dmb(); if (!mmu_enabled()) { lock->v = 1; return; } do { asm volatile( "1: ldrex %0, [%2]\n" " teq %0, #0\n" " bne 1b\n" " mov %0, #1\n" " strex %1, %0, [%2]\n" : "=&r" (val), "=&r" (fail) : "r" (&lock->v) : "cc" ); } while (fail); dmb(); } void spin_unlock(struct spinlock *lock) { lock->v = 0; dmb(); }