1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef PERF_LINUX_KERNEL_H_ 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_LINUX_KERNEL_H_ 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdarg.h> 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdio.h> 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdlib.h> 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <assert.h> 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define PERF_ALIGN(x, a) __PERF_ALIGN_MASK(x, (typeof(x))(a)-1) 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __PERF_ALIGN_MASK(x, mask) (((x)+(mask))&~(mask)) 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef offsetof 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef container_of 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/** 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * container_of - cast a member of a structure out to the containing structure 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * @ptr: the pointer to the member. 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * @type: the type of the container struct this is embedded in. 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * @member: the name of the member within the struct. 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define container_of(ptr, type, member) ({ \ 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const typeof(((type *)0)->member) * __mptr = (ptr); \ 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng (type *)((char *)__mptr - offsetof(type, member)); }) 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef max 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define max(x, y) ({ \ 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng typeof(x) _max1 = (x); \ 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng typeof(y) _max2 = (y); \ 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng (void) (&_max1 == &_max2); \ 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng _max1 > _max2 ? _max1 : _max2; }) 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef min 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define min(x, y) ({ \ 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng typeof(x) _min1 = (x); \ 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng typeof(y) _min2 = (y); \ 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng (void) (&_min1 == &_min2); \ 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng _min1 < _min2 ? _min1 : _min2; }) 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef roundup 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define roundup(x, y) ( \ 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ \ 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const typeof(y) __y = y; \ 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng (((x) + (__y - 1)) / __y) * __y; \ 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} \ 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng) 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef BUG_ON 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifdef NDEBUG 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define BUG_ON(cond) do { if (cond) {} } while (0) 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#else 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define BUG_ON(cond) assert(!(cond)) 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Both need more care to handle endianness 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * (Don't use bitmap_copy_le() for now) 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define cpu_to_le64(x) (x) 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define cpu_to_le32(x) (x) 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvscnprintf(char *buf, size_t size, const char *fmt, va_list args) 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i; 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ssize_t ssize = size; 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng i = vsnprintf(buf, size, fmt, args); 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return (i >= ssize) ? (ssize - 1) : i; 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int scnprintf(char * buf, size_t size, const char * fmt, ...) 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_list args; 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ssize_t ssize = size; 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i; 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_start(args, fmt); 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng i = vsnprintf(buf, size, fmt, args); 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng va_end(args); 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return (i >= ssize) ? (ssize - 1) : i; 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline unsigned long 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsimple_strtoul(const char *nptr, char **endptr, int base) 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return strtoul(nptr, endptr, base); 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint eprintf(int level, 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *fmt, ...) __attribute__((format(printf, 2, 3))); 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef pr_fmt 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define pr_fmt(fmt) fmt 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define pr_err(fmt, ...) \ 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng eprintf(0, pr_fmt(fmt), ##__VA_ARGS__) 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define pr_warning(fmt, ...) \ 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng eprintf(0, pr_fmt(fmt), ##__VA_ARGS__) 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define pr_info(fmt, ...) \ 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng eprintf(0, pr_fmt(fmt), ##__VA_ARGS__) 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define pr_debug(fmt, ...) \ 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng eprintf(1, pr_fmt(fmt), ##__VA_ARGS__) 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define pr_debugN(n, fmt, ...) \ 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng eprintf(n, pr_fmt(fmt), ##__VA_ARGS__) 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define pr_debug2(fmt, ...) pr_debugN(2, pr_fmt(fmt), ##__VA_ARGS__) 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define pr_debug3(fmt, ...) pr_debugN(3, pr_fmt(fmt), ##__VA_ARGS__) 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define pr_debug4(fmt, ...) pr_debugN(4, pr_fmt(fmt), ##__VA_ARGS__) 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This looks more complex than it should be. But we need to 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * get the type for the ~ right in round_down (it needs to be 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * as wide as the result!), and we want to evaluate the macro 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * arguments just once each. 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __round_mask(x, y) ((__typeof__(x))((y)-1)) 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define round_down(x, y) ((x) & ~__round_mask(x, y)) 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 135