add urcu/arch_generic.h
[urcu.git] / urcu / arch_generic.h
CommitLineData
e4d1eb09
PB
1#ifndef _URCU_ARCH_GENERIC_H
2#define _URCU_ARCH_GENERIC_H
3
4/*
5 * arch_generic.h: common definitions for multiple architectures.
6 *
7 * Copyright (c) 2010 Paolo Bonzini <pbonzini@redhat.com>
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13*
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#include <urcu/compiler.h>
25#include <urcu/config.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31#ifndef CACHE_LINE_SIZE
32#define CACHE_LINE_SIZE 64
33#endif
34
35#if !defined(mc) && !defined(rmc) && !defined(wmc)
36#define CONFIG_HAVE_MEM_COHERENCY
37/*
38 * Architectures with cache coherency must _not_ define mc/rmc/wmc.
39 *
40 * For them, mc/rmc/wmc are implemented with a * simple compiler barrier;
41 * in addition, we provide defaults for mb (using GCC builtins) as well as
42 * rmb and wmb (defaulting to mb).
43 */
44
45#ifndef mb
46#define mb() __sync_synchronize()
47#endif
48
49#ifndef rmb
50#define rmb() mb()
51#endif
52
53#ifndef wmb
54#define wmb() mb()
55#endif
56
57#define mc() barrier()
58#define rmc() barrier()
59#define wmc() barrier()
60#else
61/*
62 * Architectures without cache coherency need something like the following:
63 *
64 * #define mc() arch_cache_flush()
65 * #define rmc() arch_cache_flush_read()
66 * #define wmc() arch_cache_flush_write()
67 *
68 * Of these, only mc is mandatory. rmc and wmc default to mc. mb/rmb/wmb
69 * use these definitions by default:
70 *
71 * #define mb() mc()
72 * #define rmb() rmc()
73 * #define wmb() wmc()
74 */
75
76#ifndef mb
77#define mb() mc()
78#endif
79
80#ifndef rmb
81#define rmb() rmc()
82#endif
83
84#ifndef wmb
85#define wmb() wmc()
86#endif
87
88#ifndef rmc
89#define rmc() mc()
90#endif
91
92#ifndef wmc
93#define wmc() mc()
94#endif
95#endif
96
97/* Nop everywhere except on alpha. */
98#ifndef read_barrier_depends
99#define read_barrier_depends()
100#endif
101
102#ifdef CONFIG_RCU_SMP
103#define smp_mb() mb()
104#define smp_rmb() rmb()
105#define smp_wmb() wmb()
106#define smp_mc() mc()
107#define smp_rmc() rmc()
108#define smp_wmc() wmc()
109#define smp_read_barrier_depends() read_barrier_depends()
110#else
111#define smp_mb() barrier()
112#define smp_rmb() barrier()
113#define smp_wmb() barrier()
114#define smp_mc() barrier()
115#define smp_rmc() barrier()
116#define smp_wmc() barrier()
117#define smp_read_barrier_depends()
118#endif
119
120#ifndef cpu_relax
121#define cpu_relax() barrier()
122#endif
123
124#ifndef sync_core
125#define sync_core() mb()
126#endif
127
128#ifdef __cplusplus
129}
130#endif
131
132#endif /* _URCU_ARCH_GENERIC_H */
This page took 0.037503 seconds and 4 git commands to generate.