| #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__ */ |