|
27 | 27 |
|
28 | 28 | #define rseq_smp_load_acquire(p) \
|
29 | 29 | __extension__ ({ \
|
30 |
| - __typeof(*p) ____p1; \ |
31 |
| - switch (sizeof(*p)) { \ |
| 30 | + union { rseq_unqual_scalar_typeof(*(p)) __val; char __c[sizeof(*(p))]; } __u; \ |
| 31 | + switch (sizeof(*(p))) { \ |
32 | 32 | case 1: \
|
33 |
| - asm volatile ("ldarb %w0, %1" \ |
34 |
| - : "=r" (*(__u8 *)p) \ |
35 |
| - : "Q" (*p) : "memory"); \ |
| 33 | + __asm__ __volatile__ ("ldarb %w0, %1" \ |
| 34 | + : "=r" (*(__u8 *)__u.__c) \ |
| 35 | + : "Q" (*(p)) : "memory"); \ |
36 | 36 | break; \
|
37 | 37 | case 2: \
|
38 |
| - asm volatile ("ldarh %w0, %1" \ |
39 |
| - : "=r" (*(__u16 *)p) \ |
40 |
| - : "Q" (*p) : "memory"); \ |
| 38 | + __asm__ __volatile__ ("ldarh %w0, %1" \ |
| 39 | + : "=r" (*(__u16 *)__u.__c) \ |
| 40 | + : "Q" (*(p)) : "memory"); \ |
41 | 41 | break; \
|
42 | 42 | case 4: \
|
43 |
| - asm volatile ("ldar %w0, %1" \ |
44 |
| - : "=r" (*(__u32 *)p) \ |
45 |
| - : "Q" (*p) : "memory"); \ |
| 43 | + __asm__ __volatile__ ("ldar %w0, %1" \ |
| 44 | + : "=r" (*(__u32 *)__u.__c) \ |
| 45 | + : "Q" (*(p)) : "memory"); \ |
46 | 46 | break; \
|
47 | 47 | case 8: \
|
48 |
| - asm volatile ("ldar %0, %1" \ |
49 |
| - : "=r" (*(__u64 *)p) \ |
50 |
| - : "Q" (*p) : "memory"); \ |
| 48 | + __asm__ __volatile__ ("ldar %0, %1" \ |
| 49 | + : "=r" (*(__u64 *)__u.__c) \ |
| 50 | + : "Q" (*(p)) : "memory"); \ |
51 | 51 | break; \
|
52 | 52 | } \
|
53 |
| - ____p1; \ |
| 53 | + (rseq_unqual_scalar_typeof(*(p)))__u.__val; \ |
54 | 54 | })
|
55 | 55 |
|
56 | 56 | #define rseq_smp_acquire__after_ctrl_dep() rseq_smp_rmb()
|
57 | 57 |
|
58 | 58 | #define rseq_smp_store_release(p, v) \
|
59 | 59 | do { \
|
60 |
| - switch (sizeof(*p)) { \ |
| 60 | + union { rseq_unqual_scalar_typeof(*(p)) __val; char __c[sizeof(*(p))]; } __u = \ |
| 61 | + { .__val = (rseq_unqual_scalar_typeof(*(p))) (v) }; \ |
| 62 | + switch (sizeof(*(p))) { \ |
61 | 63 | case 1: \
|
62 |
| - asm volatile ("stlrb %w1, %0" \ |
63 |
| - : "=Q" (*p) \ |
64 |
| - : "r" ((__u8)v) \ |
| 64 | + __asm__ __volatile__ ("stlrb %w1, %0" \ |
| 65 | + : "=Q" (*(p)) \ |
| 66 | + : "r" (*(__u8 *)__u.__c) \ |
65 | 67 | : "memory"); \
|
66 | 68 | break; \
|
67 | 69 | case 2: \
|
68 |
| - asm volatile ("stlrh %w1, %0" \ |
69 |
| - : "=Q" (*p) \ |
70 |
| - : "r" ((__u16)v) \ |
| 70 | + __asm__ __volatile__ ("stlrh %w1, %0" \ |
| 71 | + : "=Q" (*(p)) \ |
| 72 | + : "r" (*(__u16 *)__u.__c) \ |
71 | 73 | : "memory"); \
|
72 | 74 | break; \
|
73 | 75 | case 4: \
|
74 |
| - asm volatile ("stlr %w1, %0" \ |
75 |
| - : "=Q" (*p) \ |
76 |
| - : "r" ((__u32)v) \ |
| 76 | + __asm__ __volatile__ ("stlr %w1, %0" \ |
| 77 | + : "=Q" (*(p)) \ |
| 78 | + : "r" (*(__u32 *)__u.__c) \ |
77 | 79 | : "memory"); \
|
78 | 80 | break; \
|
79 | 81 | case 8: \
|
80 |
| - asm volatile ("stlr %1, %0" \ |
81 |
| - : "=Q" (*p) \ |
82 |
| - : "r" ((__u64)v) \ |
| 82 | + __asm__ __volatile__ ("stlr %1, %0" \ |
| 83 | + : "=Q" (*(p)) \ |
| 84 | + : "r" (*(__u64 *)__u.__c) \ |
83 | 85 | : "memory"); \
|
84 | 86 | break; \
|
85 | 87 | } \
|
|
0 commit comments