blob: 50cbac5fa7ede092f4a42c3e25d2ad8904404f4f [file] [log] [blame]
#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__ */