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