1*c9945492SAndroid Build Coastguard Worker #if __mips_isa_rev < 6 2*c9945492SAndroid Build Coastguard Worker #define LLSC_M "m" 3*c9945492SAndroid Build Coastguard Worker #else 4*c9945492SAndroid Build Coastguard Worker #define LLSC_M "ZC" 5*c9945492SAndroid Build Coastguard Worker #endif 6*c9945492SAndroid Build Coastguard Worker 7*c9945492SAndroid Build Coastguard Worker #define a_ll a_ll a_ll(volatile int * p)8*c9945492SAndroid Build Coastguard Workerstatic inline int a_ll(volatile int *p) 9*c9945492SAndroid Build Coastguard Worker { 10*c9945492SAndroid Build Coastguard Worker int v; 11*c9945492SAndroid Build Coastguard Worker #if __mips < 2 12*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__ ( 13*c9945492SAndroid Build Coastguard Worker ".set push ; .set mips2\n\t" 14*c9945492SAndroid Build Coastguard Worker "ll %0, %1" 15*c9945492SAndroid Build Coastguard Worker "\n\t.set pop" 16*c9945492SAndroid Build Coastguard Worker : "=r"(v) : "m"(*p)); 17*c9945492SAndroid Build Coastguard Worker #else 18*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__ ( 19*c9945492SAndroid Build Coastguard Worker "ll %0, %1" 20*c9945492SAndroid Build Coastguard Worker : "=r"(v) : LLSC_M(*p)); 21*c9945492SAndroid Build Coastguard Worker #endif 22*c9945492SAndroid Build Coastguard Worker return v; 23*c9945492SAndroid Build Coastguard Worker } 24*c9945492SAndroid Build Coastguard Worker 25*c9945492SAndroid Build Coastguard Worker #define a_sc a_sc a_sc(volatile int * p,int v)26*c9945492SAndroid Build Coastguard Workerstatic inline int a_sc(volatile int *p, int v) 27*c9945492SAndroid Build Coastguard Worker { 28*c9945492SAndroid Build Coastguard Worker int r; 29*c9945492SAndroid Build Coastguard Worker #if __mips < 2 30*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__ ( 31*c9945492SAndroid Build Coastguard Worker ".set push ; .set mips2\n\t" 32*c9945492SAndroid Build Coastguard Worker "sc %0, %1" 33*c9945492SAndroid Build Coastguard Worker "\n\t.set pop" 34*c9945492SAndroid Build Coastguard Worker : "=r"(r), "=m"(*p) : "0"(v) : "memory"); 35*c9945492SAndroid Build Coastguard Worker #else 36*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__ ( 37*c9945492SAndroid Build Coastguard Worker "sc %0, %1" 38*c9945492SAndroid Build Coastguard Worker : "=r"(r), "="LLSC_M(*p) : "0"(v) : "memory"); 39*c9945492SAndroid Build Coastguard Worker #endif 40*c9945492SAndroid Build Coastguard Worker return r; 41*c9945492SAndroid Build Coastguard Worker } 42*c9945492SAndroid Build Coastguard Worker 43*c9945492SAndroid Build Coastguard Worker #define a_barrier a_barrier a_barrier()44*c9945492SAndroid Build Coastguard Workerstatic inline void a_barrier() 45*c9945492SAndroid Build Coastguard Worker { 46*c9945492SAndroid Build Coastguard Worker __asm__ __volatile__ ("sync" : : : "memory"); 47*c9945492SAndroid Build Coastguard Worker } 48*c9945492SAndroid Build Coastguard Worker 49*c9945492SAndroid Build Coastguard Worker #define a_pre_llsc a_barrier 50*c9945492SAndroid Build Coastguard Worker #define a_post_llsc a_barrier 51*c9945492SAndroid Build Coastguard Worker 52*c9945492SAndroid Build Coastguard Worker #undef LLSC_M 53