• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #if __mips_isa_rev < 6
2 #define LLSC_M "m"
3 #else
4 #define LLSC_M "ZC"
5 #endif
6 
7 #define a_ll a_ll
a_ll(volatile int * p)8 static inline int a_ll(volatile int *p)
9 {
10 	int v;
11 	__asm__ __volatile__ (
12 		"ll %0, %1"
13 		: "=r"(v) : LLSC_M(*p));
14 	return v;
15 }
16 
17 #define a_sc a_sc
a_sc(volatile int * p,int v)18 static inline int a_sc(volatile int *p, int v)
19 {
20 	int r;
21 	__asm__ __volatile__ (
22 		"sc %0, %1"
23 		: "=r"(r), "="LLSC_M(*p) : "0"(v) : "memory");
24 	return r;
25 }
26 
27 #define a_ll_p a_ll_p
a_ll_p(volatile void * p)28 static inline void *a_ll_p(volatile void *p)
29 {
30 	void *v;
31 	__asm__ __volatile__ (
32 		"lld %0, %1"
33 		: "=r"(v) : LLSC_M(*(void *volatile *)p));
34 	return v;
35 }
36 
37 #define a_sc_p a_sc_p
a_sc_p(volatile void * p,void * v)38 static inline int a_sc_p(volatile void *p, void *v)
39 {
40 	long r;
41 	__asm__ __volatile__ (
42 		"scd %0, %1"
43 		: "=r"(r), "="LLSC_M(*(void *volatile *)p) : "0"(v) : "memory");
44 	return r;
45 }
46 
47 #define a_barrier a_barrier
a_barrier()48 static inline void a_barrier()
49 {
50 	__asm__ __volatile__ ("sync" : : : "memory");
51 }
52 
53 #define a_pre_llsc a_barrier
54 #define a_post_llsc a_barrier
55 
56 #undef LLSC_M
57