|  | #pragma once | 
|  |  | 
|  | #ifndef __ASSEMBLER__ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  | #include <sys/types.h> | 
|  | #include <stdbool.h> | 
|  | #include <string.h> | 
|  |  | 
|  | typedef uintptr_t physaddr_t; | 
|  | typedef long intreg_t; | 
|  | typedef unsigned long uintreg_t; | 
|  |  | 
|  | #ifndef NULL | 
|  | #define NULL ((void*) 0) | 
|  | #endif | 
|  |  | 
|  | #ifndef TRUE | 
|  | #define TRUE	1 | 
|  | #endif | 
|  |  | 
|  | #ifndef FALSE | 
|  | #define FALSE	0 | 
|  | #endif | 
|  |  | 
|  | #define FOR_CIRC_BUFFER(next, size, var) \ | 
|  | for (int _var = 0, var = (next); _var < (size); _var++, var = (var + 1) % (size)) | 
|  |  | 
|  | #define STRINGIFY(s) __STRINGIFY(s) | 
|  | #define __STRINGIFY(s) #s | 
|  |  | 
|  | /* A macro for testing if another macro has been #defined or not.  Can be used | 
|  | * wherever you need a boolean defined.  Returns 0 or 1. */ | 
|  | #define is_defined(macro) is_defined_(macro) | 
|  | #define is_defined_test_1 , | 
|  | #define is_defined_(value) is_defined__(is_defined_test_##value, value) | 
|  | #define is_defined__(comma, value) is_defined___(comma 1, 0) | 
|  | #define is_defined___(_, v, ...) v | 
|  |  | 
|  | #define COUNT_OF(x) (sizeof((x))/sizeof((x)[0])) | 
|  |  | 
|  | #define ZERO_DATA(s) memset(&(s), 0, sizeof(s)) | 
|  |  | 
|  | /* Rounding operations (efficient when n is a power of 2) | 
|  | * Round down to the nearest multiple of n. | 
|  | * The compiler should compile out the branch.  This is needed for 32 bit, so | 
|  | * that we can round down uint64_t, without chopping off the top 32 bits. */ | 
|  | #define ROUNDDOWN(a, n)                                                        \ | 
|  | ({                                                                             \ | 
|  | typeof(a) __b;                                                         \ | 
|  | if (sizeof(a) == 8) {                                                  \ | 
|  | uint64_t __a = (uint64_t) (a);                                 \ | 
|  | __b = (typeof(a)) (__a - __a % (n));                           \ | 
|  | } else {                                                               \ | 
|  | uintptr_t __a = (uintptr_t) (a);                               \ | 
|  | __b = (typeof(a)) (__a - __a % (n));                           \ | 
|  | }                                                                      \ | 
|  | __b;                                                                   \ | 
|  | }) | 
|  |  | 
|  | /* Round up to the nearest multiple of n */ | 
|  | #define ROUNDUP(a, n)                                                          \ | 
|  | ({                                                                             \ | 
|  | typeof(a) __b;                                                         \ | 
|  | if (sizeof(a) == 8) {                                                  \ | 
|  | uint64_t __n = (uint64_t) (n);                                 \ | 
|  | __b = (typeof(a)) (ROUNDDOWN((uint64_t) (a) + __n - 1, __n));  \ | 
|  | } else {                                                               \ | 
|  | uintptr_t __n = (uintptr_t) (n);                               \ | 
|  | __b = (typeof(a)) (ROUNDDOWN((uintptr_t) (a) + __n - 1, __n)); \ | 
|  | }                                                                      \ | 
|  | __b;                                                                   \ | 
|  | }) | 
|  |  | 
|  | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | 
|  |  | 
|  | // Return the integer logarithm of the value provided rounded down | 
|  | static inline uintptr_t LOG2_DOWN(uintptr_t value) | 
|  | { | 
|  | value |= 1;  // clz(0) is undefined, just or in a 1 bit and define it | 
|  | // intrinsic __builtin_clz supported by both > gcc4.6 and LLVM > 1.5 | 
|  | return (sizeof(value) == 8) ? 63 - __builtin_clzll(value) | 
|  | : 31 - __builtin_clz(value); | 
|  | } | 
|  |  | 
|  | // Return the integer logarithm of the value provided rounded up | 
|  | static inline uintptr_t LOG2_UP(uintptr_t value) | 
|  | { | 
|  | uintptr_t ret = LOG2_DOWN(value); | 
|  |  | 
|  | // Add 1 if a lower bit set | 
|  | ret += 0 != (value ^ ((uintptr_t) 1 << ret)); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | static inline uintptr_t ROUNDUPPWR2(uintptr_t value) | 
|  | { | 
|  | return 1 << LOG2_UP(value); | 
|  | } | 
|  |  | 
|  | static inline uintptr_t ROUNDDOWNPWR2(uintptr_t value) | 
|  | { | 
|  | return 1 << LOG2_DOWN(value); | 
|  | } | 
|  |  | 
|  | /* We wraparound if UINT_MAX < a * b, which is also UINT_MAX / a < b. */ | 
|  | static inline bool mult_will_overflow_u64(uint64_t a, uint64_t b) | 
|  | { | 
|  | if (!a) | 
|  | return FALSE; | 
|  | return (uint64_t)(-1) / a < b; | 
|  | } | 
|  |  | 
|  | // Return the offset of 'member' relative to the beginning of a struct type | 
|  | #ifndef offsetof | 
|  | #define offsetof(type, member)  ((size_t) (&((type*)0)->member)) | 
|  | #endif | 
|  |  | 
|  | /* Return the container/struct holding the object 'ptr' points to */ | 
|  | #define container_of(ptr, type, member) ({                                     \ | 
|  | (type*)((char*)ptr - offsetof(type, member));                         \ | 
|  | }) | 
|  |  | 
|  | /* Makes sure func is run exactly once.  Can handle concurrent callers, and | 
|  | * other callers spin til the func is complete. */ | 
|  | #define run_once(func)                                                         \ | 
|  | do {                                                                           \ | 
|  | static bool ran_once = FALSE;                                          \ | 
|  | static bool is_running = FALSE;                                        \ | 
|  | if (!ran_once) {                                                       \ | 
|  | /* fetch and set TRUE, w/o a header or test_and_set weirdness*/\ | 
|  | if (!__sync_fetch_and_or(&is_running, TRUE)) {                 \ | 
|  | /* we won the race and get to run the func */          \ | 
|  | func;                                                  \ | 
|  | /* don't let the ran_once write pass previous writes */\ | 
|  | wmb();                                                 \ | 
|  | ran_once = TRUE;                                       \ | 
|  | } else {                                                       \ | 
|  | /* someone else woni */                                \ | 
|  | while (!ran_once)                                      \ | 
|  | cpu_relax();                                   \ | 
|  | }                                                              \ | 
|  | }                                                                      \ | 
|  | } while (0) | 
|  |  | 
|  | /* Unprotected, single-threaded version, makes sure func is run exactly once */ | 
|  | #define run_once_racy(func)                                                    \ | 
|  | do {                                                                           \ | 
|  | static bool ran_once = FALSE;                                          \ | 
|  | if (!ran_once) {                                                       \ | 
|  | func;                                                          \ | 
|  | ran_once = TRUE;                                               \ | 
|  | }                                                                      \ | 
|  | } while (0) | 
|  |  | 
|  | #ifdef ROS_KERNEL | 
|  | #include <compiler.h> | 
|  | #else | 
|  | /* Force the reading/writing exactly once of x.  You may still need mbs().  See | 
|  | * http://lwn.net/Articles/508991/ for more info. */ | 
|  | #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) | 
|  | #define READ_ONCE(x) ACCESS_ONCE(x) | 
|  | #define WRITE_ONCE(x, val) ((*(volatile typeof(x) *)&(x)) = val) | 
|  | #endif | 
|  |  | 
|  | #endif /* __ASSEMBLER__ */ |