arch,lib/seqlock: implement seqlock with C++ atomic if compiled with C++
[fio.git] / arch / arch.h
1 #ifndef ARCH_H
2 #define ARCH_H
3
4 #ifdef __cplusplus
5 #include <atomic>
6 #else
7 #include <stdatomic.h>
8 #endif
9
10 #include "../lib/types.h"
11
12 enum {
13         arch_x86_64 = 1,
14         arch_x86,
15         arch_ppc,
16         arch_ia64,
17         arch_s390,
18         arch_alpha,
19         arch_sparc,
20         arch_sparc64,
21         arch_arm,
22         arch_sh,
23         arch_hppa,
24         arch_mips,
25         arch_aarch64,
26
27         arch_generic,
28
29         arch_nr,
30 };
31
32 enum {
33         ARCH_FLAG_1     = 1 << 0,
34         ARCH_FLAG_2     = 1 << 1,
35         ARCH_FLAG_3     = 1 << 2,
36         ARCH_FLAG_4     = 1 << 3,
37 };
38
39 extern unsigned long arch_flags;
40
41 #define ARCH_CPU_CLOCK_WRAPS
42
43 #ifdef __cplusplus
44 #define atomic_add(p, v)                                                \
45         std::atomic_fetch_add(p, (v))
46 #define atomic_sub(p, v)                                                \
47         std::atomic_fetch_sub(p, (v))
48 #define atomic_load_relaxed(p)                                  \
49         std::atomic_load_explicit(p,                            \
50                              std::memory_order_relaxed)
51 #define atomic_load_acquire(p)                                  \
52         std::atomic_load_explicit(p,                            \
53                              std::memory_order_acquire)
54 #define atomic_store_release(p, v)                              \
55         std::atomic_store_explicit(p, (v),                      \
56                              std::memory_order_release)
57 #else
58 #define atomic_add(p, v)                                        \
59         atomic_fetch_add((_Atomic typeof(*(p)) *)(p), v)
60 #define atomic_sub(p, v)                                        \
61         atomic_fetch_sub((_Atomic typeof(*(p)) *)(p), v)
62 #define atomic_load_relaxed(p)                                  \
63         atomic_load_explicit((_Atomic typeof(*(p)) *)(p),       \
64                              memory_order_relaxed)
65 #define atomic_load_acquire(p)                                  \
66         atomic_load_explicit((_Atomic typeof(*(p)) *)(p),       \
67                              memory_order_acquire)
68 #define atomic_store_release(p, v)                              \
69         atomic_store_explicit((_Atomic typeof(*(p)) *)(p), (v), \
70                               memory_order_release)
71 #endif
72
73 /* IWYU pragma: begin_exports */
74 #if defined(__i386__)
75 #include "arch-x86.h"
76 #elif defined(__x86_64__)
77 #include "arch-x86_64.h"
78 #elif defined(__powerpc__) || defined(__powerpc64__) || defined(__ppc__)
79 #include "arch-ppc.h"
80 #elif defined(__ia64__)
81 #include "arch-ia64.h"
82 #elif defined(__alpha__)
83 #include "arch-alpha.h"
84 #elif defined(__s390x__) || defined(__s390__)
85 #include "arch-s390.h"
86 #elif defined(__sparc__)
87 #include "arch-sparc.h"
88 #elif defined(__sparc64__)
89 #include "arch-sparc64.h"
90 #elif defined(__arm__)
91 #include "arch-arm.h"
92 #elif defined(__mips__) || defined(__mips64__)
93 #include "arch-mips.h"
94 #elif defined(__sh__)
95 #include "arch-sh.h"
96 #elif defined(__hppa__)
97 #include "arch-hppa.h"
98 #elif defined(__aarch64__)
99 #include "arch-aarch64.h"
100 #else
101 #warning "Unknown architecture, attempting to use generic model."
102 #include "arch-generic.h"
103 #endif
104
105 #include "../lib/ffz.h"
106 /* IWYU pragma: end_exports */
107
108 #ifndef ARCH_HAVE_INIT
109 static inline int arch_init(char *envp[])
110 {
111         return 0;
112 }
113 #endif
114
115 #ifdef __alpha__
116 /*
117  * alpha is the only exception, all other architectures
118  * have common numbers for new system calls.
119  */
120 # ifndef __NR_io_uring_setup
121 #  define __NR_io_uring_setup           535
122 # endif
123 # ifndef __NR_io_uring_enter
124 #  define __NR_io_uring_enter           536
125 # endif
126 # ifndef __NR_io_uring_register
127 #  define __NR_io_uring_register        537
128 # endif
129 #else /* !__alpha__ */
130 # ifndef __NR_io_uring_setup
131 #  define __NR_io_uring_setup           425
132 # endif
133 # ifndef __NR_io_uring_enter
134 #  define __NR_io_uring_enter           426
135 # endif
136 # ifndef __NR_io_uring_register
137 #  define __NR_io_uring_register        427
138 # endif
139 #endif
140
141 #define ARCH_HAVE_IOURING
142
143 #endif