FD.io VPP  v21.01.1
Vector Packet Processing
clib.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 /*
16  Copyright (c) 2001, 2002, 2003 Eliot Dresselhaus
17 
18  Permission is hereby granted, free of charge, to any person obtaining
19  a copy of this software and associated documentation files (the
20  "Software"), to deal in the Software without restriction, including
21  without limitation the rights to use, copy, modify, merge, publish,
22  distribute, sublicense, and/or sell copies of the Software, and to
23  permit persons to whom the Software is furnished to do so, subject to
24  the following conditions:
25 
26  The above copyright notice and this permission notice shall be
27  included in all copies or substantial portions of the Software.
28 
29  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
33  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
34  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
35  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 */
37 
38 #ifndef included_clib_h
39 #define included_clib_h
40 
41 #include <stddef.h>
42 #include <vppinfra/config.h>
43 
44 #ifdef __x86_64__
45 #include <x86intrin.h>
46 #endif
47 
48 /* Standalone means to not assume we are running on a Unix box. */
49 #if ! defined (CLIB_STANDALONE) && ! defined (CLIB_LINUX_KERNEL)
50 #define CLIB_UNIX
51 #endif
52 
53 #include <vppinfra/types.h>
54 #include <vppinfra/atomics.h>
55 
56 /* Global DEBUG flag. Setting this to 1 or 0 turns off
57  ASSERT (see vppinfra/error.h) & other debugging code. */
58 #ifndef CLIB_DEBUG
59 #define CLIB_DEBUG 0
60 #endif
61 
62 #ifndef NULL
63 #define NULL ((void *) 0)
64 #endif
65 
66 #define BITS(x) (8*sizeof(x))
67 #define ARRAY_LEN(x) (sizeof (x)/sizeof (x[0]))
68 
69 #define _STRUCT_FIELD(t,f) (((t *) 0)->f)
70 #define STRUCT_OFFSET_OF(t,f) offsetof(t, f)
71 #define STRUCT_BIT_OFFSET_OF(t,f) (BITS(u8) * STRUCT_OFFSET_OF (t, f))
72 #define STRUCT_SIZE_OF(t,f) (sizeof (_STRUCT_FIELD (t, f)))
73 #define STRUCT_BITS_OF(t,f) (BITS (_STRUCT_FIELD (t, f)))
74 #define STRUCT_ARRAY_LEN(t,f) ARRAY_LEN (_STRUCT_FIELD (t, f))
75 #define STRUCT_MARK(mark) u8 mark[0]
76 #define STRUCT_MARK_PTR(v, f) &(v)->f
77 
78 /* Stride in bytes between struct array elements. */
79 #define STRUCT_STRIDE_OF(t,f) \
80  ( ((uword) & (((t *) 0)[1].f)) \
81  - ((uword) & (((t *) 0)[0].f)))
82 
83 #define STRUCT_OFFSET_OF_VAR(v,f) ((uword) (&(v)->f) - (uword) (v))
84 
85 /* Used to pack structure elements. */
86 #define CLIB_PACKED(x) x __attribute__ ((packed))
87 #define CLIB_UNUSED(x) x __attribute__ ((unused))
88 
89 /* similar to CLIB_CACHE_LINE_ALIGN_MARK() but with arbitrary alignment */
90 #define CLIB_ALIGN_MARK(name, alignment) u8 name[0] __attribute__((aligned(alignment)))
91 
92 /* Make a string from the macro's argument */
93 #define CLIB_STRING_MACRO(x) #x
94 
95 #define __clib_unused __attribute__ ((unused))
96 #define __clib_weak __attribute__ ((weak))
97 #define __clib_packed __attribute__ ((packed))
98 #define __clib_constructor __attribute__ ((constructor))
99 #define __clib_noinline __attribute__ ((noinline))
100 #define __clib_aligned(x) __attribute__ ((aligned(x)))
101 #define __clib_section(s) __attribute__ ((section(s)))
102 #define __clib_warn_unused_result __attribute__ ((warn_unused_result))
103 #define __clib_export __attribute__ ((visibility("default")))
104 
105 #define never_inline __attribute__ ((__noinline__))
106 
107 #if CLIB_DEBUG > 0
108 #define always_inline static inline
109 #define static_always_inline static inline
110 #else
111 #define always_inline static inline __attribute__ ((__always_inline__))
112 #define static_always_inline static inline __attribute__ ((__always_inline__))
113 #endif
114 
115 
116 /* Reserved (unused) structure element with address offset between
117  from and to. */
118 #define CLIB_PAD_FROM_TO(from,to) u8 pad_##from[(to) - (from)]
119 
120 /* Hints to compiler about hot/cold code. */
121 #define PREDICT_FALSE(x) __builtin_expect((x),0)
122 #define PREDICT_TRUE(x) __builtin_expect((x),1)
123 
124 /*
125  * Compiler barrier
126  * prevent compiler to reorder memory access accross this boundary
127  * prevent compiler to cache values in register (force reload)
128  * Not to be confused with CPU memory barrier below
129  */
130 #define CLIB_COMPILER_BARRIER() asm volatile ("":::"memory")
131 
132 /* Full memory barrier (read and write). */
133 #define CLIB_MEMORY_BARRIER() __sync_synchronize ()
134 
135 #if __x86_64__
136 #define CLIB_MEMORY_STORE_BARRIER() __builtin_ia32_sfence ()
137 #else
138 #define CLIB_MEMORY_STORE_BARRIER() __sync_synchronize ()
139 #endif
140 
141 /* Arranges for function to be called before main. */
142 #define INIT_FUNCTION(decl) \
143  decl __attribute ((constructor)); \
144  decl
145 
146 /* Arranges for function to be called before exit. */
147 #define EXIT_FUNCTION(decl) \
148  decl __attribute ((destructor)); \
149  decl
150 
151 /* Use __builtin_clz if available. */
152 #if uword_bits == 64
153 #define count_leading_zeros(x) __builtin_clzll (x)
154 #define count_trailing_zeros(x) __builtin_ctzll (x)
155 #else
156 #define count_leading_zeros(x) __builtin_clzl (x)
157 #define count_trailing_zeros(x) __builtin_ctzl (x)
158 #endif
159 
160 #if defined (count_leading_zeros)
163 {
164  uword n;
165  n = count_leading_zeros (x);
166  return BITS (uword) - n - 1;
167 }
168 #else
170 min_log2 (uword x)
171 {
172  uword a = x, b = BITS (uword) / 2, c = 0, r = 0;
173 
174  /* Reduce x to 4 bit result. */
175 #define _ \
176 { \
177  c = a >> b; \
178  if (c) a = c; \
179  if (c) r += b; \
180  b /= 2; \
181 }
182 
183  if (BITS (uword) > 32)
184  _;
185  _;
186  _;
187  _;
188 #undef _
189 
190  /* Do table lookup on 4 bit partial. */
191  if (BITS (uword) > 32)
192  {
193  const u64 table = 0x3333333322221104LL;
194  uword t = (table >> (4 * a)) & 0xf;
195  r = t < 4 ? r + t : ~0;
196  }
197  else
198  {
199  const u32 table = 0x22221104;
200  uword t = (a & 8) ? 3 : ((table >> (4 * a)) & 0xf);
201  r = t < 4 ? r + t : ~0;
202  }
203 
204  return r;
205 }
206 #endif
207 
210 {
211  uword l = min_log2 (x);
212  if (x > ((uword) 1 << l))
213  l++;
214  return l;
215 }
216 
219 {
220  if (BITS (uword) == 64)
221  return min_log2 (x);
222  else
223  {
224  uword l, y;
225  y = x;
226  l = 0;
227  if (y == 0)
228  {
229  l += 32;
230  x >>= 32;
231  }
232  l += min_log2 (x);
233  return l;
234  }
235 }
236 
239 {
240  return ((uword) 1 << x) - (uword) 1;
241 }
242 
245 {
246  word y = (word) 1 << min_log2 (x);
247  if (x > y)
248  y *= 2;
249  return y;
250 }
251 
254 {
255  return 0 == (x & (x - 1));
256 }
257 
260 {
261  return (x) & ~(pow2 - 1);
262 }
263 
266 {
267  return (x + pow2 - 1) & ~(pow2 - 1);
268 }
269 
272 {
273  return (x + pow2 - 1) & ~(pow2 - 1);
274 }
275 
278 {
279  return x & -x;
280 }
281 
284 {
285  uword result;
286 #ifdef count_trailing_zeros
287  result = count_trailing_zeros (x);
288 #else
289  result = min_log2 (first_set (x));
290 #endif
291  return result;
292 }
293 
296 {
297  return (int) x;
298 }
299 
302 {
303  return (word) (x + .5);
304 }
305 
308 {
309  return f * flt_round_nearest (x / f);
310 }
311 
313 extract_bits (uword x, int start, int count)
314 {
315 #ifdef __BMI__
316  return _bextr_u64 (x, start, count);
317 #endif
318  return (x >> start) & pow2_mask (count);
319 }
320 
321 #define clib_max(x,y) \
322 ({ \
323  __typeof__ (x) _x = (x); \
324  __typeof__ (y) _y = (y); \
325  _x > _y ? _x : _y; \
326 })
327 
328 #define clib_min(x,y) \
329 ({ \
330  __typeof__ (x) _x = (x); \
331  __typeof__ (y) _y = (y); \
332  _x < _y ? _x : _y; \
333 })
334 
335 #define clib_clamp(x,lo,hi) \
336 ({ \
337  __typeof__ (x) _x = (x); \
338  __typeof__ (lo) _lo = (lo); \
339  __typeof__ (hi) _hi = (hi); \
340  _x < _lo ? _lo : (_x > _hi ? _hi : _x); \
341 })
342 
343 #define clib_abs(x) \
344 ({ \
345  __typeof__ (x) _x = (x); \
346  _x < 0 ? -_x : _x; \
347 })
348 
349 /* Standard standalone-only function declarations. */
350 #ifndef CLIB_UNIX
351 void clib_standalone_init (void *memory, uword memory_bytes);
352 
353 void qsort (void *base, uword n, uword size,
354  int (*)(const void *, const void *));
355 #endif
356 
357 /* Stack backtrace. */
358 uword
359 clib_backtrace (uword * callers, uword max_callers, uword n_frames_to_skip);
360 
361 #endif /* included_clib_h */
362 
363 /*
364  * fd.io coding-style-patch-verification: ON
365  *
366  * Local Variables:
367  * eval: (c-set-style "gnu")
368  * End:
369  */
vhost_user_memory_t memory
Definition: vhost_user.h:112
a
Definition: bitmap.h:544
static uword log2_first_set(uword x)
Definition: clib.h:283
#define count_leading_zeros(x)
Definition: clib.h:156
unsigned long u64
Definition: types.h:89
#define count_trailing_zeros(x)
Definition: clib.h:157
static uword min_log2(uword x)
Definition: clib.h:162
double f64
Definition: types.h:142
i64 word
Definition: types.h:111
#define always_inline
Definition: clib.h:108
static uword pow2_mask(uword x)
Definition: clib.h:238
const cJSON *const b
Definition: cJSON.h:255
unsigned int u32
Definition: types.h:88
static u64 min_log2_u64(u64 x)
Definition: clib.h:218
uword clib_backtrace(uword *callers, uword max_callers, uword n_frames_to_skip)
Definition: backtrace.c:226
svmdb_client_t * c
static f64 flt_round_to_multiple(f64 x, f64 f)
Definition: clib.h:307
static uword max_pow2(uword x)
Definition: clib.h:244
static u64 round_pow2_u64(u64 x, u64 pow2)
Definition: clib.h:271
static uword round_pow2(uword x, uword pow2)
Definition: clib.h:265
static uword first_set(uword x)
Definition: clib.h:277
static uword is_pow2(uword x)
Definition: clib.h:253
static uword extract_bits(uword x, int start, int count)
Definition: clib.h:313
static word flt_round_nearest(f64 x)
Definition: clib.h:301
void qsort(void *base, uword n, uword size, int(*compar)(const void *, const void *))
Definition: qsort.c:56
static uword max_log2(uword x)
Definition: clib.h:209
u64 uword
Definition: types.h:112
static f64 flt_round_down(f64 x)
Definition: clib.h:295
u8 count
Definition: dhcp.api:208
static uword round_down_pow2(uword x, uword pow2)
Definition: clib.h:259
#define BITS(x)
Definition: clib.h:66