| #pragma once |
| |
| #include <ros/common.h> |
| #include <compiler.h> |
| |
| #ifndef __ASSEMBLER__ |
| #include <sys/types.h> |
| #include <linux/overflow.h> |
| #endif |
| |
| /* Force a rebuild of the whole kernel if 64BIT-ness changed */ |
| #ifdef CONFIG_64BIT |
| #endif |
| |
| #define PASTE_THEM(x, y) x ## y |
| #define PASTE(x, y) PASTE_THEM(x, y) |
| |
| // Efficient min and max operations |
| #define MIN(_a, _b) \ |
| ({ \ |
| typeof(_a) __a = (_a); \ |
| typeof(_b) __b = (_b); \ |
| __a <= __b ? __a : __b; \ |
| }) |
| #define MAX(_a, _b) \ |
| ({ \ |
| typeof(_a) __a = (_a); \ |
| typeof(_b) __b = (_b); \ |
| __a >= __b ? __a : __b; \ |
| }) |
| |
| /* Test for alignment, e.g. 2^6 */ |
| #define ALIGNED(p, a) (!(((uintptr_t)(p)) & ((a)-1))) |
| /* Aligns x up to the mask, e.g. (2^6 - 1) (round up if any mask bits are set)*/ |
| #define __ALIGN_MASK(x, mask) (((uintptr_t)(x) + (mask)) & ~(mask)) |
| /* Aligns x up to the alignment, e.g. 2^6. */ |
| #define ALIGN(x, a) ((typeof(x)) __ALIGN_MASK(x, (a) - 1)) |
| /* Aligns x down to the mask, e.g. (2^6 - 1) |
| * (round down if any mask bits are set)*/ |
| #define __ALIGN_MASK_DOWN(x, mask) ((uintptr_t)(x) & ~(mask)) |
| /* Aligns x down to the alignment, e.g. 2^6. */ |
| #define ALIGN_DOWN(x, a) ((typeof(x)) __ALIGN_MASK_DOWN(x, (a) - 1)) |
| /* Will return false for 0. Debatable, based on what you want. */ |
| #define IS_PWR2(x) ((x) && !((x) & (x - 1))) |
| |
| #define ARRAY_SIZE(x) COUNT_OF(x) |
| |
| /* 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 won */ \ |
| 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) |
| |
| #ifndef __ASSEMBLER__ |
| |
| /* Returns the least common multiple of x and p2; p2 is a power of 2. Returns 0 |
| * on error, including non-power-of-2, overflow, or a 0 input. */ |
| static inline unsigned long LCM_PWR2(unsigned long x, unsigned long p2) |
| { |
| /* All multiples of p2, which has exactly one bit set, will have zeros |
| * for the bits below its set bit. The LCM will be x, shifted left as |
| * little as possible, such that it has no bits below p2's set bit. |
| * Each shift is a multiplication by 2, which is the only prime factor |
| * if p2. */ |
| int p2_bit, x_first_bit; |
| unsigned long ret; |
| |
| if (!x || !IS_PWR2(p2)) |
| return 0; |
| p2_bit = __builtin_ffsl(p2); |
| x_first_bit = __builtin_ffsl(x); |
| if (x_first_bit >= p2_bit) |
| return x; |
| if (check_shl_overflow(x, p2_bit - x_first_bit, &ret)) |
| return 0; |
| return ret; |
| } |
| |
| static inline uint32_t low32(uint64_t val) |
| { |
| return val & 0xffffffff; |
| } |
| |
| static inline uint32_t high32(uint64_t val) |
| { |
| return val >> 32; |
| } |
| |
| #endif /* !__ASSEMBLER__ */ |