hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __ASM_BARRIER_H
#define __ASM_BARRIER_H
 
#include <asm/alternative.h>
 
#ifndef __ASSEMBLY__
 
/* The synchronize caches instruction executes as a nop on systems in
   which all memory references are performed in order. */
#define synchronize_caches() asm volatile("sync" \
   ALTERNATIVE(ALT_COND_NO_SMP, INSN_NOP) \
   : : : "memory")
 
#if defined(CONFIG_SMP)
#define mb()        do { synchronize_caches(); } while (0)
#define rmb()        mb()
#define wmb()        mb()
#define dma_rmb()    mb()
#define dma_wmb()    mb()
#else
#define mb()        barrier()
#define rmb()        barrier()
#define wmb()        barrier()
#define dma_rmb()    barrier()
#define dma_wmb()    barrier()
#endif
 
#define __smp_mb()    mb()
#define __smp_rmb()    mb()
#define __smp_wmb()    mb()
 
#define __smp_store_release(p, v)                    \
do {                                    \
   typeof(p) __p = (p);                        \
        union { typeof(*p) __val; char __c[1]; } __u =            \
                { .__val = (__force typeof(*p)) (v) };            \
   compiletime_assert_atomic_type(*p);                \
   switch (sizeof(*p)) {                        \
   case 1:                                \
       asm volatile("stb,ma %0,0(%1)"                \
               : : "r"(*(__u8 *)__u.__c), "r"(__p)    \
               : "memory");                \
       break;                            \
   case 2:                                \
       asm volatile("sth,ma %0,0(%1)"                \
               : : "r"(*(__u16 *)__u.__c), "r"(__p)    \
               : "memory");                \
       break;                            \
   case 4:                                \
       asm volatile("stw,ma %0,0(%1)"                \
               : : "r"(*(__u32 *)__u.__c), "r"(__p)    \
               : "memory");                \
       break;                            \
   case 8:                                \
       if (IS_ENABLED(CONFIG_64BIT))                \
           asm volatile("std,ma %0,0(%1)"            \
               : : "r"(*(__u64 *)__u.__c), "r"(__p)    \
               : "memory");                \
       break;                            \
   }                                \
} while (0)
 
#define __smp_load_acquire(p)                        \
({                                    \
   union { typeof(*p) __val; char __c[1]; } __u;            \
   typeof(p) __p = (p);                        \
   compiletime_assert_atomic_type(*p);                \
   switch (sizeof(*p)) {                        \
   case 1:                                \
       asm volatile("ldb,ma 0(%1),%0"                \
               : "=r"(*(__u8 *)__u.__c) : "r"(__p)    \
               : "memory");                \
       break;                            \
   case 2:                                \
       asm volatile("ldh,ma 0(%1),%0"                \
               : "=r"(*(__u16 *)__u.__c) : "r"(__p)    \
               : "memory");                \
       break;                            \
   case 4:                                \
       asm volatile("ldw,ma 0(%1),%0"                \
               : "=r"(*(__u32 *)__u.__c) : "r"(__p)    \
               : "memory");                \
       break;                            \
   case 8:                                \
       if (IS_ENABLED(CONFIG_64BIT))                \
           asm volatile("ldd,ma 0(%1),%0"            \
               : "=r"(*(__u64 *)__u.__c) : "r"(__p)    \
               : "memory");                \
       break;                            \
   }                                \
   __u.__val;                            \
})
#include <asm-generic/barrier.h>
 
#endif /* !__ASSEMBLY__ */
#endif /* __ASM_BARRIER_H */