Subversion Repositories Kolibri OS

Rev

Rev 5270 | Rev 6934 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5270 Rev 6082
Line 33... Line 33...
33
 
33
 
34
#ifdef CONFIG_SMP
34
#ifdef CONFIG_SMP
35
#define smp_mb()	mb()
35
#define smp_mb()	mb()
36
#define smp_rmb()	dma_rmb()
36
#define smp_rmb()	dma_rmb()
37
#define smp_wmb()	barrier()
37
#define smp_wmb()	barrier()
38
#define set_mb(var, value) do { (void)xchg(&var, value); } while (0)
38
#define smp_store_mb(var, value) do { (void)xchg(&var, value); } while (0)
39
#else /* !SMP */
39
#else /* !SMP */
40
#define smp_mb()	barrier()
40
#define smp_mb()	barrier()
41
#define smp_rmb()	barrier()
41
#define smp_rmb()	barrier()
42
#define smp_wmb()	barrier()
42
#define smp_wmb()	barrier()
43
#define set_mb(var, value) do { var = value; barrier(); } while (0)
43
#define smp_store_mb(var, value) do { WRITE_ONCE(var, value); barrier(); } while (0)
Line 44... Line 44...
44
#endif /* SMP */
44
#endif /* SMP */
45
 
45
 
Line 55... Line 55...
55
 
55
 
56
#define smp_store_release(p, v)						\
56
#define smp_store_release(p, v)						\
57
do {									\
57
do {									\
58
	compiletime_assert_atomic_type(*p);				\
58
	compiletime_assert_atomic_type(*p);				\
59
	smp_mb();							\
59
	smp_mb();							\
60
	ACCESS_ONCE(*p) = (v);						\
60
	WRITE_ONCE(*p, v);						\
Line 61... Line 61...
61
} while (0)
61
} while (0)
62
 
62
 
63
#define smp_load_acquire(p)						\
63
#define smp_load_acquire(p)						\
64
({									\
64
({									\
65
	typeof(*p) ___p1 = ACCESS_ONCE(*p);				\
65
	typeof(*p) ___p1 = READ_ONCE(*p);				\
66
	compiletime_assert_atomic_type(*p);				\
66
	compiletime_assert_atomic_type(*p);				\
67
	smp_mb();							\
67
	smp_mb();							\
Line 72... Line 72...
72
 
72
 
73
#define smp_store_release(p, v)						\
73
#define smp_store_release(p, v)						\
74
do {									\
74
do {									\
75
	compiletime_assert_atomic_type(*p);				\
75
	compiletime_assert_atomic_type(*p);				\
76
	barrier();							\
76
	barrier();							\
77
	ACCESS_ONCE(*p) = (v);						\
77
	WRITE_ONCE(*p, v);						\
Line 78... Line 78...
78
} while (0)
78
} while (0)
79
 
79
 
80
#define smp_load_acquire(p)						\
80
#define smp_load_acquire(p)						\
81
({									\
81
({									\
82
	typeof(*p) ___p1 = ACCESS_ONCE(*p);				\
82
	typeof(*p) ___p1 = READ_ONCE(*p);				\
83
	compiletime_assert_atomic_type(*p);				\
83
	compiletime_assert_atomic_type(*p);				\
84
	barrier();							\
84
	barrier();							\
Line 89... Line 89...
89
 
89
 
90
/* Atomic operations are already serializing on x86 */
90
/* Atomic operations are already serializing on x86 */
91
#define smp_mb__before_atomic()	barrier()
91
#define smp_mb__before_atomic()	barrier()
Line 92... Line -...
92
#define smp_mb__after_atomic()	barrier()
-
 
93
 
-
 
94
/*
-
 
95
 * Stop RDTSC speculation. This is needed when you need to use RDTSC
-
 
96
 * (or get_cycles or vread that possibly accesses the TSC) in a defined
-
 
97
 * code region.
-
 
98
 *
-
 
99
 * (Could use an alternative three way for this if there was one.)
-
 
100
 */
-
 
101
static __always_inline void rdtsc_barrier(void)
-
 
102
{
-
 
103
	alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC);
-
 
104
	alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC);
-
 
105
}
92
#define smp_mb__after_atomic()	barrier()