Blame view

include/linux/kernel.h 23.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
  #ifndef _LINUX_KERNEL_H
  #define _LINUX_KERNEL_H
  
  /*
   * 'kernel.h' contains some often-used function prototypes etc
   */
a79ff731a   Alexey Dobriyan   netfilter: xtable...
7
8
  #define __ALIGN_KERNEL(x, a)		__ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
  #define __ALIGN_KERNEL_MASK(x, mask)	(((x) + (mask)) & ~(mask))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
14
15
16
17
  
  #ifdef __KERNEL__
  
  #include <stdarg.h>
  #include <linux/linkage.h>
  #include <linux/stddef.h>
  #include <linux/types.h>
  #include <linux/compiler.h>
  #include <linux/bitops.h>
f0d1b0b30   David Howells   [PATCH] LOG2: Imp...
18
  #include <linux/log2.h>
e0deaff47   Andrew Morton   split the typeche...
19
  #include <linux/typecheck.h>
968ab1838   Linus Torvalds   include/linux/ker...
20
  #include <linux/printk.h>
e9d376f0f   Jason Baron   dynamic debug: co...
21
  #include <linux/dynamic_debug.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
  #include <asm/byteorder.h>
  #include <asm/bug.h>
4be929be3   Alexey Dobriyan   kernel-wide: repl...
24
25
26
  #define USHRT_MAX	((u16)(~0U))
  #define SHRT_MAX	((s16)(USHRT_MAX>>1))
  #define SHRT_MIN	((s16)(-SHRT_MAX - 1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
29
30
31
32
  #define INT_MAX		((int)(~0U>>1))
  #define INT_MIN		(-INT_MAX - 1)
  #define UINT_MAX	(~0U)
  #define LONG_MAX	((long)(~0UL>>1))
  #define LONG_MIN	(-LONG_MAX - 1)
  #define ULONG_MAX	(~0UL)
111ebb6e6   OGAWA Hirofumi   [PATCH] writeback...
33
34
35
  #define LLONG_MAX	((long long)(~0ULL>>1))
  #define LLONG_MIN	(-LLONG_MAX - 1)
  #define ULLONG_MAX	(~0ULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
  
  #define STACK_MAGIC	0xdeadbeef
a79ff731a   Alexey Dobriyan   netfilter: xtable...
38
  #define ALIGN(x, a)		__ALIGN_KERNEL((x), (a))
9f93ff5be   Alexey Dobriyan   Restore __ALIGN_M...
39
  #define __ALIGN_MASK(x, mask)	__ALIGN_KERNEL_MASK((x), (mask))
a83308e60   Matthew Wilcox   PTR_ALIGN
40
  #define PTR_ALIGN(p, a)		((typeof(p))ALIGN((unsigned long)(p), (a)))
f10db6277   Herbert Xu   Avoid divide in I...
41
  #define IS_ALIGNED(x, a)		(((x) & ((typeof(x))(a) - 1)) == 0)
2ea581447   Linus Torvalds   Fix 'ALIGN()' mac...
42

c5e631cf6   Rusty Russell   ARRAY_SIZE: check...
43
  #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
9b3be9f99   Yinghai Lu   Move round_up/dow...
44
45
46
47
48
49
50
51
52
  /*
   * This looks more complex than it should be. But we need to
   * get the type for the ~ right in round_down (it needs to be
   * as wide as the result!), and we want to evaluate the macro
   * arguments just once each.
   */
  #define __round_mask(x, y) ((__typeof__(x))((y)-1))
  #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
  #define round_down(x, y) ((x) & ~__round_mask(x, y))
4552d5dc0   Jan Beulich   [PATCH] x86_64: r...
53
  #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
930631edd   Steven Whitehouse   [PATCH] add DIV_R...
54
  #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
36a26c69b   Nicholas Bellinger   kernel.h: Add DIV...
55
56
57
58
59
60
61
62
  #define DIV_ROUND_UP_ULL(ll,d) \
  	({ unsigned long long _tmp = (ll)+(d)-1; do_div(_tmp, d); _tmp; })
  
  #if BITS_PER_LONG == 32
  # define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d)
  #else
  # define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d)
  #endif
074e61ec3   James Morris   kernel: add round...
63
64
  
  /* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */
b28efd54d   Eric Paris   kernel: roundup s...
65
66
  #define roundup(x, y) (					\
  {							\
6070bf359   Tetsuo Handa   kernel: Constify ...
67
  	const typeof(y) __y = y;			\
b28efd54d   Eric Paris   kernel: roundup s...
68
69
70
  	(((x) + (__y - 1)) / __y) * __y;		\
  }							\
  )
686a0f3d7   Eric Paris   kernel: rounddown...
71
72
73
74
75
76
  #define rounddown(x, y) (				\
  {							\
  	typeof(x) __x = (x);				\
  	__x - (__x % (y));				\
  }							\
  )
9fe06081e   Darrick J. Wong   Create a DIV_ROUN...
77
78
79
80
81
82
  #define DIV_ROUND_CLOSEST(x, divisor)(			\
  {							\
  	typeof(divisor) __divisor = divisor;		\
  	(((x) + ((__divisor) / 2)) / (__divisor));	\
  }							\
  )
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83

ca31e146d   Eduard - Gabriel Munteanu   Move _RET_IP_ and...
84
85
  #define _RET_IP_		(unsigned long)__builtin_return_address(0)
  #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
90c699a9e   Bartlomiej Zolnierkiewicz   block: rename CON...
86
  #ifdef CONFIG_LBDAF
2da96acde   Jens Axboe   [BLOCK] Move sect...
87
88
89
90
91
92
93
94
95
96
97
98
  # include <asm/div64.h>
  # define sector_div(a, b) do_div(a, b)
  #else
  # define sector_div(n, b)( \
  { \
  	int _res; \
  	_res = (n) % (b); \
  	(n) /= (b); \
  	_res; \
  } \
  )
  #endif
218e180e7   Andrew Morton   add upper-32-bits...
99
100
101
102
103
104
105
106
107
  /**
   * upper_32_bits - return bits 32-63 of a number
   * @n: the number we're accessing
   *
   * A basic shift-right of a 64- or 32-bit quantity.  Use this to suppress
   * the "right shift count >= width of type" warning when that quantity is
   * 32-bits.
   */
  #define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
204b885e7   Joerg Roedel   introduce lower_3...
108
109
110
111
112
  /**
   * lower_32_bits - return bits 0-31 of a number
   * @n: the number we're accessing
   */
  #define lower_32_bits(n) ((u32)(n))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
  struct completion;
df2e71fb9   Andrew Morton   [PATCH] dump_thre...
114
115
  struct pt_regs;
  struct user;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116

070cb0659   Uwe Kleine-König   move kernel-doc c...
117
118
119
120
121
122
  #ifdef CONFIG_PREEMPT_VOLUNTARY
  extern int _cond_resched(void);
  # define might_resched() _cond_resched()
  #else
  # define might_resched() do { } while (0)
  #endif
d902db1eb   Frederic Weisbecker   sched: Generalize...
123
  #ifdef CONFIG_DEBUG_ATOMIC_SLEEP
d894837f2   Simon Kagstrom   sched: might_slee...
124
    void __might_sleep(const char *file, int line, int preempt_offset);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
126
127
128
129
130
131
  /**
   * might_sleep - annotation for functions that can sleep
   *
   * this macro will print a stack trace if it is executed in an atomic
   * context (spinlock, irq-handler, ...).
   *
   * This is a useful debugging help to be able to catch problems early and not
e20ec9911   Jim Cromie   fix spelling erro...
132
   * be bitten later when the calling function happens to sleep when it is not
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
134
   * supposed to.
   */
f8cbd99bd   Ingo Molnar   [PATCH] sched: vo...
135
  # define might_sleep() \
e4aafea2d   Frederic Weisbecker   sched: Add a pree...
136
  	do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
  #else
d894837f2   Simon Kagstrom   sched: might_slee...
138
139
    static inline void __might_sleep(const char *file, int line,
  				   int preempt_offset) { }
f8cbd99bd   Ingo Molnar   [PATCH] sched: vo...
140
  # define might_sleep() do { might_resched(); } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
  #endif
368a5fa1f   Hua Zhong   [PATCH] remove un...
142
  #define might_sleep_if(cond) do { if (cond) might_sleep(); } while (0)
f8cbd99bd   Ingo Molnar   [PATCH] sched: vo...
143

71a904844   Andrew Morton   include/linux/ker...
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
  /*
   * abs() handles unsigned and signed longs, ints, shorts and chars.  For all
   * input types abs() returns a signed long.
   * abs() should not be used for 64-bit types (s64, u64, long long) - use abs64()
   * for those.
   */
  #define abs(x) ({						\
  		long ret;					\
  		if (sizeof(x) == sizeof(long)) {		\
  			long __x = (x);				\
  			ret = (__x < 0) ? -__x : __x;		\
  		} else {					\
  			int __x = (x);				\
  			ret = (__x < 0) ? -__x : __x;		\
  		}						\
  		ret;						\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
  	})
658716d19   Brian Behlendorf   div64_u64(): impr...
161
162
163
164
  #define abs64(x) ({				\
  		s64 __x = (x);			\
  		(__x < 0) ? -__x : __x;		\
  	})
3ee1afa30   Nick Piggin   x86: some lock an...
165
166
167
168
169
170
171
172
  #ifdef CONFIG_PROVE_LOCKING
  void might_fault(void);
  #else
  static inline void might_fault(void)
  {
  	might_sleep();
  }
  #endif
e041c6834   Alan Stern   [PATCH] Notifier ...
173
  extern struct atomic_notifier_head panic_notifier_list;
c7ff0d9c9   TAMUKI Shoichi   panic: keep blink...
174
  extern long (*panic_blink)(int state);
9402c95f3   Joe Perches   treewide: remove ...
175
  __printf(1, 2)
4da478599   Joe Perches   kernel.h: neaten ...
176
  void panic(const char *fmt, ...)
ff2d8b19a   Joe Perches   treewide: convert...
177
  	__noreturn __cold;
dd287796d   Andrew Morton   [PATCH] pause_on_...
178
179
  extern void oops_enter(void);
  extern void oops_exit(void);
863a60492   Anton Blanchard   lib/bug.c: add oo...
180
  void print_oops_end_marker(void);
dd287796d   Andrew Morton   [PATCH] pause_on_...
181
  extern int oops_may_print(void);
9402c95f3   Joe Perches   treewide: remove ...
182
  void do_exit(long error_code)
ff2d8b19a   Joe Perches   treewide: convert...
183
  	__noreturn;
9402c95f3   Joe Perches   treewide: remove ...
184
  void complete_and_exit(struct completion *, long)
ff2d8b19a   Joe Perches   treewide: convert...
185
  	__noreturn;
33ee3b2e2   Alexey Dobriyan   kstrto*: converti...
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
  
  /* Internal, do not use. */
  int __must_check _kstrtoul(const char *s, unsigned int base, unsigned long *res);
  int __must_check _kstrtol(const char *s, unsigned int base, long *res);
  
  int __must_check kstrtoull(const char *s, unsigned int base, unsigned long long *res);
  int __must_check kstrtoll(const char *s, unsigned int base, long long *res);
  static inline int __must_check kstrtoul(const char *s, unsigned int base, unsigned long *res)
  {
  	/*
  	 * We want to shortcut function call, but
  	 * __builtin_types_compatible_p(unsigned long, unsigned long long) = 0.
  	 */
  	if (sizeof(unsigned long) == sizeof(unsigned long long) &&
  	    __alignof__(unsigned long) == __alignof__(unsigned long long))
  		return kstrtoull(s, base, (unsigned long long *)res);
  	else
  		return _kstrtoul(s, base, res);
  }
  
  static inline int __must_check kstrtol(const char *s, unsigned int base, long *res)
  {
  	/*
  	 * We want to shortcut function call, but
  	 * __builtin_types_compatible_p(long, long long) = 0.
  	 */
  	if (sizeof(long) == sizeof(long long) &&
  	    __alignof__(long) == __alignof__(long long))
  		return kstrtoll(s, base, (long long *)res);
  	else
  		return _kstrtol(s, base, res);
  }
  
  int __must_check kstrtouint(const char *s, unsigned int base, unsigned int *res);
  int __must_check kstrtoint(const char *s, unsigned int base, int *res);
  
  static inline int __must_check kstrtou64(const char *s, unsigned int base, u64 *res)
  {
  	return kstrtoull(s, base, res);
  }
  
  static inline int __must_check kstrtos64(const char *s, unsigned int base, s64 *res)
  {
  	return kstrtoll(s, base, res);
  }
  
  static inline int __must_check kstrtou32(const char *s, unsigned int base, u32 *res)
  {
  	return kstrtouint(s, base, res);
  }
  
  static inline int __must_check kstrtos32(const char *s, unsigned int base, s32 *res)
  {
  	return kstrtoint(s, base, res);
  }
  
  int __must_check kstrtou16(const char *s, unsigned int base, u16 *res);
  int __must_check kstrtos16(const char *s, unsigned int base, s16 *res);
  int __must_check kstrtou8(const char *s, unsigned int base, u8 *res);
  int __must_check kstrtos8(const char *s, unsigned int base, s8 *res);
c196e32a1   Alexey Dobriyan   lib: add kstrto*_...
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
  int __must_check kstrtoull_from_user(const char __user *s, size_t count, unsigned int base, unsigned long long *res);
  int __must_check kstrtoll_from_user(const char __user *s, size_t count, unsigned int base, long long *res);
  int __must_check kstrtoul_from_user(const char __user *s, size_t count, unsigned int base, unsigned long *res);
  int __must_check kstrtol_from_user(const char __user *s, size_t count, unsigned int base, long *res);
  int __must_check kstrtouint_from_user(const char __user *s, size_t count, unsigned int base, unsigned int *res);
  int __must_check kstrtoint_from_user(const char __user *s, size_t count, unsigned int base, int *res);
  int __must_check kstrtou16_from_user(const char __user *s, size_t count, unsigned int base, u16 *res);
  int __must_check kstrtos16_from_user(const char __user *s, size_t count, unsigned int base, s16 *res);
  int __must_check kstrtou8_from_user(const char __user *s, size_t count, unsigned int base, u8 *res);
  int __must_check kstrtos8_from_user(const char __user *s, size_t count, unsigned int base, s8 *res);
  
  static inline int __must_check kstrtou64_from_user(const char __user *s, size_t count, unsigned int base, u64 *res)
  {
  	return kstrtoull_from_user(s, count, base, res);
  }
  
  static inline int __must_check kstrtos64_from_user(const char __user *s, size_t count, unsigned int base, s64 *res)
  {
  	return kstrtoll_from_user(s, count, base, res);
  }
  
  static inline int __must_check kstrtou32_from_user(const char __user *s, size_t count, unsigned int base, u32 *res)
  {
  	return kstrtouint_from_user(s, count, base, res);
  }
  
  static inline int __must_check kstrtos32_from_user(const char __user *s, size_t count, unsigned int base, s32 *res)
  {
  	return kstrtoint_from_user(s, count, base, res);
  }
67d0a0754   Joe Perches   kernel.h/checkpat...
276
  /* Obsolete, do not use.  Use kstrto<foo> instead */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
278
279
280
  extern unsigned long simple_strtoul(const char *,char **,unsigned int);
  extern long simple_strtol(const char *,char **,unsigned int);
  extern unsigned long long simple_strtoull(const char *,char **,unsigned int);
  extern long long simple_strtoll(const char *,char **,unsigned int);
33ee3b2e2   Alexey Dobriyan   kstrto*: converti...
281
282
283
284
  #define strict_strtoul	kstrtoul
  #define strict_strtol	kstrtol
  #define strict_strtoull	kstrtoull
  #define strict_strtoll	kstrtoll
67d0a0754   Joe Perches   kernel.h/checkpat...
285
  /* lib/printf utilities */
b9075fa96   Joe Perches   treewide: use __p...
286
287
288
289
290
291
292
293
294
295
296
297
  extern __printf(2, 3) int sprintf(char *buf, const char * fmt, ...);
  extern __printf(2, 0) int vsprintf(char *buf, const char *, va_list);
  extern __printf(3, 4)
  int snprintf(char *buf, size_t size, const char *fmt, ...);
  extern __printf(3, 0)
  int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
  extern __printf(3, 4)
  int scnprintf(char *buf, size_t size, const char *fmt, ...);
  extern __printf(3, 0)
  int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
  extern __printf(2, 3)
  char *kasprintf(gfp_t gfp, const char *fmt, ...);
11443ec7d   Jeremy Fitzhardinge   Add kvasprintf()
298
  extern char *kvasprintf(gfp_t gfp, const char *fmt, va_list args);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
299
300
301
302
303
304
305
306
  
  extern int sscanf(const char *, const char *, ...)
  	__attribute__ ((format (scanf, 2, 3)));
  extern int vsscanf(const char *, const char *, va_list)
  	__attribute__ ((format (scanf, 2, 0)));
  
  extern int get_option(char **str, int *pint);
  extern char *get_options(const char *str, int nints, int *ints);
d974ae379   Jeremy Fitzhardinge   generic, memparse...
307
  extern unsigned long long memparse(const char *ptr, char **retptr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
308

5e3766138   Trent Piepho   [PATCH] symbol_pu...
309
  extern int core_kernel_text(unsigned long addr);
cdbe61bfe   Steven Rostedt   ftrace: Allow dyn...
310
  extern int core_kernel_data(unsigned long addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
312
  extern int __kernel_text_address(unsigned long addr);
  extern int kernel_text_address(unsigned long addr);
ab7476cf7   Arjan van de Ven   debug: add notifi...
313
  extern int func_ptr_is_kernel_text(void *ptr);
ab7476cf7   Arjan van de Ven   debug: add notifi...
314

04a2e6a5c   Eric W. Biederman   [PATCH] pid: make...
315
316
  struct pid;
  extern struct pid *session_of_pgrp(struct pid *pgrp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
317

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
  unsigned long int_sqrt(unsigned long);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
  extern void bust_spinlocks(int yes);
e3e8a75d2   Kirill Korotaev   [PATCH] Extract a...
320
  extern void wake_up_klogd(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
  extern int oops_in_progress;		/* If set, an oops, panic(), BUG() or die() is in progress */
aa7271076   Adrian Bunk   [PATCH] the sched...
322
  extern int panic_timeout;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
323
  extern int panic_on_oops;
8da5adda9   Don Zickus   [PATCH] x86: Allo...
324
  extern int panic_on_unrecovered_nmi;
5211a242d   Kurt Garloff   x86: Add sysctl t...
325
  extern int panic_on_io_nmi;
55af77969   Mitsuo Hayasaka   x86: Panic on det...
326
  extern int sysctl_panic_on_stackoverflow;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
  extern const char *print_tainted(void);
25ddbb18a   Andi Kleen   Make the taint fl...
328
329
330
  extern void add_taint(unsigned flag);
  extern int test_taint(unsigned flag);
  extern unsigned long get_taint(void);
b920de1b7   David Howells   mn10300: add the ...
331
  extern int root_mountflags;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332

2ce802f62   Tejun Heo   lockdep: Move ear...
333
  extern bool early_boot_irqs_disabled;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
334
335
336
337
338
339
340
  /* Values used for system_state */
  extern enum system_states {
  	SYSTEM_BOOTING,
  	SYSTEM_RUNNING,
  	SYSTEM_HALT,
  	SYSTEM_POWER_OFF,
  	SYSTEM_RESTART,
729b4d4ce   Alexey Starikovskiy   [ACPI] fix reboot...
341
  	SYSTEM_SUSPEND_DISK,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
342
  } system_state;
25ddbb18a   Andi Kleen   Make the taint fl...
343
344
345
346
347
348
349
350
351
352
  #define TAINT_PROPRIETARY_MODULE	0
  #define TAINT_FORCED_MODULE		1
  #define TAINT_UNSAFE_SMP		2
  #define TAINT_FORCED_RMMOD		3
  #define TAINT_MACHINE_CHECK		4
  #define TAINT_BAD_PAGE			5
  #define TAINT_USER			6
  #define TAINT_DIE			7
  #define TAINT_OVERRIDDEN_ACPI_TABLE	8
  #define TAINT_WARN			9
26e9a3977   Linus Torvalds   Merge git://git.k...
353
  #define TAINT_CRAP			10
92946bc72   Ben Hutchings   panic: Add taint ...
354
  #define TAINT_FIRMWARE_WORKAROUND	11
2449b8ba0   Ben Hutchings   module,bug: Add T...
355
  #define TAINT_OOT_MODULE		12
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
356

3fc957721   Harvey Harrison   lib: create commo...
357
358
359
  extern const char hex_asc[];
  #define hex_asc_lo(x)	hex_asc[((x) & 0x0f)]
  #define hex_asc_hi(x)	hex_asc[((x) & 0xf0) >> 4]
55036ba76   Andy Shevchenko   lib: rename pack_...
360
  static inline char *hex_byte_pack(char *buf, u8 byte)
3fc957721   Harvey Harrison   lib: create commo...
361
362
363
364
365
  {
  	*buf++ = hex_asc_hi(byte);
  	*buf++ = hex_asc_lo(byte);
  	return buf;
  }
99eaf3c45   Randy Dunlap   lib/hexdump
366

55036ba76   Andy Shevchenko   lib: rename pack_...
367
368
369
370
  static inline char * __deprecated pack_hex_byte(char *buf, u8 byte)
  {
  	return hex_byte_pack(buf, byte);
  }
903788892   Andy Shevchenko   lib: introduce co...
371
  extern int hex_to_bin(char ch);
b78049831   Mimi Zohar   lib: add error ch...
372
  extern int __must_check hex2bin(u8 *dst, const char *src, size_t count);
903788892   Andy Shevchenko   lib: introduce co...
373

8a64f336b   Joe Perches   kernel.h: add pri...
374
  /*
526211bc5   Ingo Molnar   tracing: move uti...
375
   * General tracing related utility functions - trace_printk(),
2002c258f   Steven Rostedt   tracing: add trac...
376
377
378
379
   * tracing_on/tracing_off and tracing_start()/tracing_stop
   *
   * Use tracing_on/tracing_off when you want to quickly turn on or off
   * tracing. It simply enables or disables the recording of the trace events.
156f5a780   GeunSik Lim   debugfs: Fix term...
380
   * This also corresponds to the user space /sys/kernel/debug/tracing/tracing_on
2002c258f   Steven Rostedt   tracing: add trac...
381
382
383
384
385
386
387
388
389
390
391
   * file, which gives a means for the kernel and userspace to interact.
   * Place a tracing_off() in the kernel where you want tracing to end.
   * From user space, examine the trace, and then echo 1 > tracing_on
   * to continue tracing.
   *
   * tracing_stop/tracing_start has slightly more overhead. It is used
   * by things like suspend to ram where disabling the recording of the
   * trace is not enough, but tracing must actually stop because things
   * like calling smp_processor_id() may crash the system.
   *
   * Most likely, you want to use tracing_on/tracing_off.
526211bc5   Ingo Molnar   tracing: move uti...
392
   */
2002c258f   Steven Rostedt   tracing: add trac...
393
394
395
396
397
398
399
400
401
402
403
404
  #ifdef CONFIG_RING_BUFFER
  void tracing_on(void);
  void tracing_off(void);
  /* trace_off_permanent stops recording with no way to bring it back */
  void tracing_off_permanent(void);
  int tracing_is_on(void);
  #else
  static inline void tracing_on(void) { }
  static inline void tracing_off(void) { }
  static inline void tracing_off_permanent(void) { }
  static inline int tracing_is_on(void) { return 0; }
  #endif
cecbca96d   Frederic Weisbecker   tracing: Dump eit...
405
406
407
408
409
410
  
  enum ftrace_dump_mode {
  	DUMP_NONE,
  	DUMP_ALL,
  	DUMP_ORIG,
  };
526211bc5   Ingo Molnar   tracing: move uti...
411
412
413
414
  #ifdef CONFIG_TRACING
  extern void tracing_start(void);
  extern void tracing_stop(void);
  extern void ftrace_off_permanent(void);
b9075fa96   Joe Perches   treewide: use __p...
415
416
  static inline __printf(1, 2)
  void ____trace_printk_check_format(const char *fmt, ...)
769b0441f   Frederic Weisbecker   tracing/core: dro...
417
418
419
420
421
422
423
  {
  }
  #define __trace_printk_check_format(fmt, args...)			\
  do {									\
  	if (0)								\
  		____trace_printk_check_format(fmt, ##args);		\
  } while (0)
526211bc5   Ingo Molnar   tracing: move uti...
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
  /**
   * trace_printk - printf formatting in the ftrace buffer
   * @fmt: the printf format for printing
   *
   * Note: __trace_printk is an internal function for trace_printk and
   *       the @ip is passed in via the trace_printk macro.
   *
   * This function allows a kernel developer to debug fast path sections
   * that printk is not appropriate for. By scattering in various
   * printk like tracing in the code, a developer can quickly see
   * where problems are occurring.
   *
   * This is intended as a debugging tool for the developer only.
   * Please refrain from leaving trace_printks scattered around in
   * your code.
   */
769b0441f   Frederic Weisbecker   tracing/core: dro...
440
441
442
  
  #define trace_printk(fmt, args...)					\
  do {									\
769b0441f   Frederic Weisbecker   tracing/core: dro...
443
  	__trace_printk_check_format(fmt, ##args);			\
48ead0203   Frederic Weisbecker   tracing/core: bri...
444
445
446
447
448
449
450
451
  	if (__builtin_constant_p(fmt)) {				\
  		static const char *trace_printk_fmt			\
  		  __attribute__((section("__trace_printk_fmt"))) =	\
  			__builtin_constant_p(fmt) ? fmt : NULL;		\
  									\
  		__trace_bprintk(_THIS_IP_, trace_printk_fmt, ##args);	\
  	} else								\
  		__trace_printk(_THIS_IP_, fmt, ##args);		\
769b0441f   Frederic Weisbecker   tracing/core: dro...
452
  } while (0)
b9075fa96   Joe Perches   treewide: use __p...
453
454
  extern __printf(2, 3)
  int __trace_bprintk(unsigned long ip, const char *fmt, ...);
48ead0203   Frederic Weisbecker   tracing/core: bri...
455

b9075fa96   Joe Perches   treewide: use __p...
456
457
  extern __printf(2, 3)
  int __trace_printk(unsigned long ip, const char *fmt, ...);
769b0441f   Frederic Weisbecker   tracing/core: dro...
458

03889384c   Steven Rostedt   tracing: Add trac...
459
  extern void trace_dump_stack(void);
48ead0203   Frederic Weisbecker   tracing/core: bri...
460
461
462
463
464
  /*
   * The double __builtin_constant_p is because gcc will give us an error
   * if we try to allocate the static variable to fmt if it is not a
   * constant. Even with the outer if statement.
   */
769b0441f   Frederic Weisbecker   tracing/core: dro...
465
466
  #define ftrace_vprintk(fmt, vargs)					\
  do {									\
48ead0203   Frederic Weisbecker   tracing/core: bri...
467
468
469
470
  	if (__builtin_constant_p(fmt)) {				\
  		static const char *trace_printk_fmt			\
  		  __attribute__((section("__trace_printk_fmt"))) =	\
  			__builtin_constant_p(fmt) ? fmt : NULL;		\
7bffc23e5   Ingo Molnar   tracing: optimize...
471
  									\
48ead0203   Frederic Weisbecker   tracing/core: bri...
472
473
474
  		__ftrace_vbprintk(_THIS_IP_, trace_printk_fmt, vargs);	\
  	} else								\
  		__ftrace_vprintk(_THIS_IP_, fmt, vargs);		\
769b0441f   Frederic Weisbecker   tracing/core: dro...
475
  } while (0)
526211bc5   Ingo Molnar   tracing: move uti...
476
  extern int
48ead0203   Frederic Weisbecker   tracing/core: bri...
477
478
479
  __ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap);
  
  extern int
526211bc5   Ingo Molnar   tracing: move uti...
480
  __ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap);
769b0441f   Frederic Weisbecker   tracing/core: dro...
481

cecbca96d   Frederic Weisbecker   tracing: Dump eit...
482
  extern void ftrace_dump(enum ftrace_dump_mode oops_dump_mode);
526211bc5   Ingo Molnar   tracing: move uti...
483
  #else
b9075fa96   Joe Perches   treewide: use __p...
484
485
  static inline __printf(1, 2)
  int trace_printk(const char *fmt, ...);
526211bc5   Ingo Molnar   tracing: move uti...
486
487
488
489
  
  static inline void tracing_start(void) { }
  static inline void tracing_stop(void) { }
  static inline void ftrace_off_permanent(void) { }
e36c54582   Steven Rostedt   tracing: Fix retu...
490
  static inline void trace_dump_stack(void) { }
526211bc5   Ingo Molnar   tracing: move uti...
491
492
493
494
495
496
497
498
499
500
  static inline int
  trace_printk(const char *fmt, ...)
  {
  	return 0;
  }
  static inline int
  ftrace_vprintk(const char *fmt, va_list ap)
  {
  	return 0;
  }
cecbca96d   Frederic Weisbecker   tracing: Dump eit...
501
  static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
769b0441f   Frederic Weisbecker   tracing/core: dro...
502
  #endif /* CONFIG_TRACING */
526211bc5   Ingo Molnar   tracing: move uti...
503
504
  
  /*
bdf4bbaae   Harvey Harrison   Add macros simila...
505
   * min()/max()/clamp() macros that also do
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506
507
508
   * strict type-checking.. See the
   * "unnecessary" pointer comparison.
   */
bdf4bbaae   Harvey Harrison   Add macros simila...
509
510
511
512
513
514
515
516
517
518
519
  #define min(x, y) ({				\
  	typeof(x) _min1 = (x);			\
  	typeof(y) _min2 = (y);			\
  	(void) (&_min1 == &_min2);		\
  	_min1 < _min2 ? _min1 : _min2; })
  
  #define max(x, y) ({				\
  	typeof(x) _max1 = (x);			\
  	typeof(y) _max2 = (y);			\
  	(void) (&_max1 == &_max2);		\
  	_max1 > _max2 ? _max1 : _max2; })
f27c85c56   Hagen Paul Pfeifer   kernel.h: add {mi...
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
  #define min3(x, y, z) ({			\
  	typeof(x) _min1 = (x);			\
  	typeof(y) _min2 = (y);			\
  	typeof(z) _min3 = (z);			\
  	(void) (&_min1 == &_min2);		\
  	(void) (&_min1 == &_min3);		\
  	_min1 < _min2 ? (_min1 < _min3 ? _min1 : _min3) : \
  		(_min2 < _min3 ? _min2 : _min3); })
  
  #define max3(x, y, z) ({			\
  	typeof(x) _max1 = (x);			\
  	typeof(y) _max2 = (y);			\
  	typeof(z) _max3 = (z);			\
  	(void) (&_max1 == &_max2);		\
  	(void) (&_max1 == &_max3);		\
  	_max1 > _max2 ? (_max1 > _max3 ? _max1 : _max3) : \
  		(_max2 > _max3 ? _max2 : _max3); })
bdf4bbaae   Harvey Harrison   Add macros simila...
537
  /**
c8bf13368   Martin K. Petersen   Consolidate min_n...
538
539
540
541
542
543
544
545
546
547
   * min_not_zero - return the minimum that is _not_ zero, unless both are zero
   * @x: value1
   * @y: value2
   */
  #define min_not_zero(x, y) ({			\
  	typeof(x) __x = (x);			\
  	typeof(y) __y = (y);			\
  	__x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })
  
  /**
bdf4bbaae   Harvey Harrison   Add macros simila...
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
   * clamp - return a value clamped to a given range with strict typechecking
   * @val: current value
   * @min: minimum allowable value
   * @max: maximum allowable value
   *
   * This macro does strict typechecking of min/max to make sure they are of the
   * same type as val.  See the unnecessary pointer comparisons.
   */
  #define clamp(val, min, max) ({			\
  	typeof(val) __val = (val);		\
  	typeof(min) __min = (min);		\
  	typeof(max) __max = (max);		\
  	(void) (&__val == &__min);		\
  	(void) (&__val == &__max);		\
  	__val = __val < __min ? __min: __val;	\
  	__val > __max ? __max: __val; })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
564
565
566
567
568
  
  /*
   * ..and if you can't take the strict
   * types, you can specify one yourself.
   *
bdf4bbaae   Harvey Harrison   Add macros simila...
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
   * Or not use min/max/clamp at all, of course.
   */
  #define min_t(type, x, y) ({			\
  	type __min1 = (x);			\
  	type __min2 = (y);			\
  	__min1 < __min2 ? __min1: __min2; })
  
  #define max_t(type, x, y) ({			\
  	type __max1 = (x);			\
  	type __max2 = (y);			\
  	__max1 > __max2 ? __max1: __max2; })
  
  /**
   * clamp_t - return a value clamped to a given range using a given type
   * @type: the type of variable to use
   * @val: current value
   * @min: minimum allowable value
   * @max: maximum allowable value
   *
   * This macro does no typechecking and uses temporary variables of type
   * 'type' to make all the comparisons.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
590
   */
bdf4bbaae   Harvey Harrison   Add macros simila...
591
592
593
594
595
596
  #define clamp_t(type, val, min, max) ({		\
  	type __val = (val);			\
  	type __min = (min);			\
  	type __max = (max);			\
  	__val = __val < __min ? __min: __val;	\
  	__val > __max ? __max: __val; })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
597

bdf4bbaae   Harvey Harrison   Add macros simila...
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
  /**
   * clamp_val - return a value clamped to a given range using val's type
   * @val: current value
   * @min: minimum allowable value
   * @max: maximum allowable value
   *
   * This macro does no typechecking and uses temporary variables of whatever
   * type the input argument 'val' is.  This is useful when val is an unsigned
   * type and min and max are literals that will otherwise be assigned a signed
   * integer type.
   */
  #define clamp_val(val, min, max) ({		\
  	typeof(val) __val = (val);		\
  	typeof(val) __min = (min);		\
  	typeof(val) __max = (max);		\
  	__val = __val < __min ? __min: __val;	\
  	__val > __max ? __max: __val; })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
615

91f68b735   Wu Fengguang   generic swap(): i...
616
617
618
619
  
  /*
   * swap - swap value of @a and @b
   */
ac7b90049   Peter Zijlstra   generic swap(): d...
620
621
  #define swap(a, b) \
  	do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
91f68b735   Wu Fengguang   generic swap(): i...
622

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
623
624
  /**
   * container_of - cast a member of a structure out to the containing structure
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
625
626
627
628
629
630
   * @ptr:	the pointer to the member.
   * @type:	the type of the container struct this is embedded in.
   * @member:	the name of the member within the struct.
   *
   */
  #define container_of(ptr, type, member) ({			\
78db2ad6f   Daniel Walker   include/linux: tr...
631
632
  	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
  	(type *)( (char *)__mptr - offsetof(type,member) );})
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
633

903c0c7cd   KOSAKI Motohiro   sparse: define du...
634
635
  #ifdef __CHECKER__
  #define BUILD_BUG_ON_NOT_POWER_OF_2(n)
ca39599c6   Dr. David Alan Gilbert   BUILD_BUG_ON_ZERO...
636
637
  #define BUILD_BUG_ON_ZERO(e) (0)
  #define BUILD_BUG_ON_NULL(e) ((void*)0)
903c0c7cd   KOSAKI Motohiro   sparse: define du...
638
  #define BUILD_BUG_ON(condition)
1399ff86f   David Daney   kernel.h: add BUI...
639
  #define BUILD_BUG() (0)
903c0c7cd   KOSAKI Motohiro   sparse: define du...
640
  #else /* __CHECKER__ */
cc8ef6eb2   Roland Dreier   kernel.h: add BUI...
641
642
643
  /* Force a compilation error if a constant expression is not a power of 2 */
  #define BUILD_BUG_ON_NOT_POWER_OF_2(n)			\
  	BUILD_BUG_ON((n) == 0 || (((n) & ((n) - 1)) != 0))
4552d5dc0   Jan Beulich   [PATCH] x86_64: r...
644
645
646
647
  /* Force a compilation error if condition is true, but also produce a
     result (of value 0 and type size_t), so the expression can be used
     e.g. in a structure initializer (or where-ever else comma expressions
     aren't permitted). */
8c87df457   Jan Beulich   BUILD_BUG_ON(): f...
648
649
  #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
  #define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
4552d5dc0   Jan Beulich   [PATCH] x86_64: r...
650

7ef88ad56   Rusty Russell   BUILD_BUG_ON: mak...
651
652
  /**
   * BUILD_BUG_ON - break compile if a condition is true.
ffbbf2da9   Randy Dunlap   kernel.h: fix ker...
653
   * @condition: the condition which the compiler should know is false.
7ef88ad56   Rusty Russell   BUILD_BUG_ON: mak...
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
   *
   * If you have some code which relies on certain constants being equal, or
   * other compile-time-evaluated condition, you should use BUILD_BUG_ON to
   * detect if someone changes it.
   *
   * The implementation uses gcc's reluctance to create a negative array, but
   * gcc (as of 4.4) only emits that error for obvious cases (eg. not arguments
   * to inline functions).  So as a fallback we use the optimizer; if it can't
   * prove the condition is false, it will cause a link error on the undefined
   * "__build_bug_on_failed".  This error message can be harder to track down
   * though, hence the two different methods.
   */
  #ifndef __OPTIMIZE__
  #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
  #else
  extern int __build_bug_on_failed;
  #define BUILD_BUG_ON(condition)					\
  	do {							\
  		((void)sizeof(char[1 - 2*!!(condition)]));	\
  		if (condition) __build_bug_on_failed = 1;	\
  	} while(0)
  #endif
1399ff86f   David Daney   kernel.h: add BUI...
676
677
678
679
680
681
682
683
684
685
686
687
688
689
  
  /**
   * BUILD_BUG - break compile if used.
   *
   * If you have some code that you expect the compiler to eliminate at
   * build time, you should use BUILD_BUG to detect if it is
   * unexpectedly used.
   */
  #define BUILD_BUG()						\
  	do {							\
  		extern void __build_bug_failed(void)		\
  			__linktime_error("BUILD_BUG failed");	\
  		__build_bug_failed();				\
  	} while (0)
903c0c7cd   KOSAKI Motohiro   sparse: define du...
690
  #endif	/* __CHECKER__ */
7ef88ad56   Rusty Russell   BUILD_BUG_ON: mak...
691

b9d4f4266   Arnaud Lacombe   include/linux/ker...
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
  /* Trap pasters of __FUNCTION__ at compile-time */
  #define __FUNCTION__ (__func__)
  
  /* This helps us to avoid #ifdef CONFIG_NUMA */
  #ifdef CONFIG_NUMA
  #define NUMA_BUILD 1
  #else
  #define NUMA_BUILD 0
  #endif
  
  /* This helps us avoid #ifdef CONFIG_COMPACTION */
  #ifdef CONFIG_COMPACTION
  #define COMPACTION_BUILD 1
  #else
  #define COMPACTION_BUILD 0
  #endif
  
  /* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */
  #ifdef CONFIG_FTRACE_MCOUNT_RECORD
  # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD
  #endif
9d00f92f4   WANG Cong   include/linux/ker...
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
  
  struct sysinfo;
  extern int do_sysinfo(struct sysinfo *info);
  
  #endif /* __KERNEL__ */
  
  #define SI_LOAD_SHIFT	16
  struct sysinfo {
  	long uptime;			/* Seconds since boot */
  	unsigned long loads[3];		/* 1, 5, and 15 minute load averages */
  	unsigned long totalram;		/* Total usable main memory size */
  	unsigned long freeram;		/* Available memory size */
  	unsigned long sharedram;	/* Amount of shared memory */
  	unsigned long bufferram;	/* Memory used by buffers */
  	unsigned long totalswap;	/* Total swap space size */
  	unsigned long freeswap;		/* swap space still available */
  	unsigned short procs;		/* Number of current processes */
  	unsigned short pad;		/* explicit padding for m68k */
  	unsigned long totalhigh;	/* Total high memory size */
  	unsigned long freehigh;		/* Available high memory size */
  	unsigned int mem_unit;		/* Memory unit size in bytes */
  	char _f[20-2*sizeof(long)-sizeof(int)];	/* Padding: libc5 uses this.. */
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
736
  #endif