pkt_buff: minor: another minor update
[netsniff-ng.git] / src / built_in.h
blob3861d3fb2dbb29d5bcb76038f7df63b89c5eb089
1 /*
2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2009-2012 Daniel Borkmann.
5 * Subject to the GPL, version 2.
6 */
8 #ifndef BUILT_IN_H
9 #define BUILT_IN_H
11 #include <linux/if_packet.h>
12 #include <assert.h>
14 /* /sys/devices/system/cpu/cpuX/cache/indexX/coherency_line_size */
16 #if defined(__amd64__) || defined(__x86_64__) || defined(__AMD64__) || \
17 defined(_M_X64) || defined(__amd64)
18 # define CO_IN_CACHE_SHIFT 7
19 #elif defined(__i386__) || defined(__x86__) || defined(__X86__) || \
20 defined(_M_IX86) || defined(__i386)
21 # define CO_IN_CACHE_SHIFT 7
22 #elif defined(__ia64__) || defined(__IA64__) || defined(__M_IA64)
23 # define CO_IN_CACHE_SHIFT 6
24 #elif defined(__SPU__)
25 # define CO_IN_CACHE_SHIFT 7
26 #elif defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || \
27 defined(_ARCH_PPC64)
28 # define CO_IN_CACHE_SHIFT 8
29 #elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) || \
30 defined(_ARCH_PPC)
31 # define CO_IN_CACHE_SHIFT 7
32 #elif defined(__sparcv9__) || defined(__sparcv9)
33 # define CO_IN_CACHE_SHIFT 6
34 #elif defined(__sparc_v8__)
35 # define CO_IN_CACHE_SHIFT 5
36 #elif defined(__sparc__) || defined(__sparc)
37 # define CO_IN_CACHE_SHIFT 5
38 #elif defined(__ARM_EABI__)
39 # define CO_IN_CACHE_SHIFT 5
40 #elif defined(__arm__)
41 # define CO_IN_CACHE_SHIFT 5
42 #elif defined(__mips__) || defined(__mips) || defined(__MIPS__)
43 # if defined(_ABIO32)
44 # define CO_IN_CACHE_SHIFT 5
45 # elif defined(_ABIN32)
46 # define CO_IN_CACHE_SHIFT 5
47 # else
48 # define CO_IN_CACHE_SHIFT 6
49 # endif
50 #else
51 # define CO_IN_CACHE_SHIFT 5
52 #endif
54 #ifndef CO_CACHE_LINE_SIZE
55 # define CO_CACHE_LINE_SIZE (1 << CO_IN_CACHE_SHIFT)
56 #endif
58 #ifndef __aligned_16
59 # define __aligned_16 __attribute__((aligned(16)))
60 #endif
62 #ifndef __cacheline_aligned
63 # define __cacheline_aligned __attribute__((aligned(CO_CACHE_LINE_SIZE)))
64 #endif
66 #ifndef __aligned_tpacket
67 # define __aligned_tpacket __attribute__((aligned(TPACKET_ALIGNMENT)))
68 #endif
70 #ifndef round_up
71 # define round_up(x, alignment) (((x) + (alignment) - 1) & ~((alignment) - 1))
72 #endif
74 #ifndef round_up_cacheline
75 # define round_up_cacheline(x) round_up((x), CO_CACHE_LINE_SIZE)
76 #endif
78 #ifndef likely
79 # define likely(x) __builtin_expect(!!(x), 1)
80 #endif
82 #ifndef unlikely
83 # define unlikely(x) __builtin_expect(!!(x), 0)
84 #endif
86 #ifndef prefetch_rd_hi
87 # define prefetch_rd_hi(addr) __builtin_prefetch(addr, 0, 3)
88 #endif
90 #ifndef prefetch_rd_lo
91 # define prefetch_rd_lo(addr) __builtin_prefetch(addr, 0, 0)
92 #endif
94 #ifndef prefetch_wr_hi
95 # define prefetch_wr_hi(addr) __builtin_prefetch(addr, 1, 3)
96 #endif
98 #ifndef prefetch_wr_lo
99 # define prefetch_wr_lo(addr) __builtin_prefetch(addr, 1, 0)
100 #endif
102 #ifndef fmemset
103 # define fmemset __builtin_memset
104 #endif
106 #ifndef fmemcpy
107 # define fmemcpy __builtin_memcpy
108 #endif
110 #ifndef atomic_cmp_swp
111 # define atomic_cmp_swp __sync_val_compare_and_swap
112 #endif
114 #ifndef __deprecated
115 # define __deprecated /* unimplemented */
116 #endif
118 #ifndef unreachable
119 # define unreachable() do { } while (1)
120 #endif
122 #ifndef __read_mostly
123 # define __read_mostly __attribute__((__section__(".data.read_mostly")))
124 #endif
126 #ifndef noinline
127 # define noinline __attribute__((noinline))
128 #endif
130 #ifndef __always_inline
131 # define __always_inline inline
132 #endif
134 #ifndef __hidden
135 # define __hidden __attribute__((visibility("hidden")))
136 #endif
138 #ifndef __pure
139 # define __pure __attribute__ ((pure))
140 #endif
142 #ifndef force_cast
143 # define force_cast(type, arg) ((type) (arg))
144 #endif
146 #ifndef access_once
147 # define access_once(x) (*(volatile typeof(x) *) &(x))
148 #endif
150 #ifndef max
151 # define max(a, b) \
152 ({ \
153 typeof (a) _a = (a); \
154 typeof (b) _b = (b); \
155 _a > _b ? _a : _b; \
157 #endif /* max */
159 #ifndef min
160 # define min(a, b) \
161 ({ \
162 typeof (a) _a = (a); \
163 typeof (b) _b = (b); \
164 _a < _b ? _a : _b; \
166 #endif /* min */
168 #ifndef ispow2
169 #define ispow2(x) ({ !!((x) && !((x) & ((x) - 1))); })
170 #endif
172 #ifndef offsetof
173 # define offsetof(type, member) ((size_t) &((type *) 0)->member)
174 #endif
176 #ifndef container_of
177 # define container_of(ptr, type, member) \
178 ({ \
179 const typeof(((type *) 0)->member) * __mptr = (ptr); \
180 (type *) ((char *) __mptr - offsetof(type, member)); \
182 #endif
184 #ifndef array_size
185 # define array_size(x) (sizeof(x) / sizeof((x)[0]) + __must_be_array(x))
186 #endif
188 #ifndef __must_be_array
189 # define __must_be_array(x) \
190 build_bug_on_zero(__builtin_types_compatible_p(typeof(x), \
191 typeof(&x[0])))
192 #endif
194 #ifndef build_bug_on_zero
195 # define build_bug_on_zero(e) (sizeof(char[1 - 2 * !!(e)]) - 1)
196 #endif
198 #ifndef bug_on
199 # define bug_on(cond) assert(!(cond))
200 #endif
202 #ifndef bug
203 # define bug assert(0)
204 #endif
206 #endif /* BUILT_IN_H */