kernel.h 12.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#ifndef _LINUX_KERNEL_H
#define _LINUX_KERNEL_H

/*
 * 'kernel.h' contains some often-used function prototypes etc
 */

#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>
16
#include <linux/log2.h>
L
Linus Torvalds 已提交
17 18 19
#include <asm/byteorder.h>
#include <asm/bug.h>

20 21 22
extern const char linux_banner[];
extern const char linux_proc_banner[];

L
Linus Torvalds 已提交
23 24 25 26 27 28
#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)
29 30 31
#define LLONG_MAX	((long long)(~0ULL>>1))
#define LLONG_MIN	(-LLONG_MAX - 1)
#define ULLONG_MAX	(~0ULL)
L
Linus Torvalds 已提交
32 33 34

#define STACK_MAGIC	0xdeadbeef

L
Linus Torvalds 已提交
35 36
#define ALIGN(x,a)		__ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask)	(((x)+(mask))&~(mask))
M
Matthew Wilcox 已提交
37
#define PTR_ALIGN(p, a)		((typeof(p))ALIGN((unsigned long)(p), (a)))
H
Herbert Xu 已提交
38
#define IS_ALIGNED(x, a)		(((x) & ((typeof(x))(a) - 1)) == 0)
L
Linus Torvalds 已提交
39

R
Rusty Russell 已提交
40 41
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))

42
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
S
Steven Whitehouse 已提交
43
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
44
#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
L
Linus Torvalds 已提交
45

46 47 48 49 50 51 52 53 54 55 56 57 58 59
#ifdef CONFIG_LBD
# 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

A
Andrew Morton 已提交
60 61 62 63 64 65 66 67 68 69
/**
 * 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))

L
Linus Torvalds 已提交
70 71 72 73 74 75 76 77 78
#define	KERN_EMERG	"<0>"	/* system is unusable			*/
#define	KERN_ALERT	"<1>"	/* action must be taken immediately	*/
#define	KERN_CRIT	"<2>"	/* critical conditions			*/
#define	KERN_ERR	"<3>"	/* error conditions			*/
#define	KERN_WARNING	"<4>"	/* warning conditions			*/
#define	KERN_NOTICE	"<5>"	/* normal but significant condition	*/
#define	KERN_INFO	"<6>"	/* informational			*/
#define	KERN_DEBUG	"<7>"	/* debug-level messages			*/

I
Ingo Molnar 已提交
79 80 81 82 83 84 85
/*
 * Annotation for a "continued" line of log printout (only done after a
 * line that had no enclosing \n). Only to be used by core/arch code
 * during early bootup (a continued line is not SMP-safe otherwise).
 */
#define	KERN_CONT	""

L
Linus Torvalds 已提交
86 87 88 89 90 91 92 93
extern int console_printk[];

#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])

struct completion;
A
akpm@osdl.org 已提交
94 95
struct pt_regs;
struct user;
L
Linus Torvalds 已提交
96 97 98 99 100 101 102 103

/**
 * 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
104
 * be bitten later when the calling function happens to sleep when it is not
L
Linus Torvalds 已提交
105 106
 * supposed to.
 */
107
#ifdef CONFIG_PREEMPT_VOLUNTARY
108 109
extern int _cond_resched(void);
# define might_resched() _cond_resched()
110 111 112 113
#else
# define might_resched() do { } while (0)
#endif

L
Linus Torvalds 已提交
114
#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
115 116 117
  void __might_sleep(char *file, int line);
# define might_sleep() \
	do { __might_sleep(__FILE__, __LINE__); might_resched(); } while (0)
L
Linus Torvalds 已提交
118
#else
119
# define might_sleep() do { might_resched(); } while (0)
L
Linus Torvalds 已提交
120 121
#endif

122
#define might_sleep_if(cond) do { if (cond) might_sleep(); } while (0)
123

L
Linus Torvalds 已提交
124 125 126 127 128
#define abs(x) ({				\
		int __x = (x);			\
		(__x < 0) ? -__x : __x;		\
	})

129
extern struct atomic_notifier_head panic_notifier_list;
L
Linus Torvalds 已提交
130 131
extern long (*panic_blink)(long time);
NORET_TYPE void panic(const char * fmt, ...)
132
	__attribute__ ((NORET_AND format (printf, 1, 2))) __cold;
133 134 135
extern void oops_enter(void);
extern void oops_exit(void);
extern int oops_may_print(void);
L
Linus Torvalds 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
fastcall NORET_TYPE void do_exit(long error_code)
	ATTRIB_NORET;
NORET_TYPE void complete_and_exit(struct completion *, long)
	ATTRIB_NORET;
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);
extern int sprintf(char * buf, const char * fmt, ...)
	__attribute__ ((format (printf, 2, 3)));
extern int vsprintf(char *buf, const char *, va_list)
	__attribute__ ((format (printf, 2, 0)));
extern int snprintf(char * buf, size_t size, const char * fmt, ...)
	__attribute__ ((format (printf, 3, 4)));
extern int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
	__attribute__ ((format (printf, 3, 0)));
extern int scnprintf(char * buf, size_t size, const char * fmt, ...)
	__attribute__ ((format (printf, 3, 4)));
extern int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
	__attribute__ ((format (printf, 3, 0)));
156 157
extern char *kasprintf(gfp_t gfp, const char *fmt, ...)
	__attribute__ ((format (printf, 2, 3)));
J
Jeremy Fitzhardinge 已提交
158
extern char *kvasprintf(gfp_t gfp, const char *fmt, va_list args);
L
Linus Torvalds 已提交
159 160 161 162 163 164 165 166 167 168

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);
extern unsigned long long memparse(char *ptr, char **retptr);

169
extern int core_kernel_text(unsigned long addr);
L
Linus Torvalds 已提交
170 171
extern int __kernel_text_address(unsigned long addr);
extern int kernel_text_address(unsigned long addr);
172 173
struct pid;
extern struct pid *session_of_pgrp(struct pid *pgrp);
L
Linus Torvalds 已提交
174

M
Matt Mackall 已提交
175
#ifdef CONFIG_PRINTK
L
Linus Torvalds 已提交
176 177 178
asmlinkage int vprintk(const char *fmt, va_list args)
	__attribute__ ((format (printf, 1, 0)));
asmlinkage int printk(const char * fmt, ...)
179
	__attribute__ ((format (printf, 1, 2))) __cold;
180 181 182
extern int log_buf_get_len(void);
extern int log_buf_read(int idx);
extern int log_buf_copy(char *dest, int idx, int len);
M
Matt Mackall 已提交
183 184 185 186 187 188
#else
static inline int vprintk(const char *s, va_list args)
	__attribute__ ((format (printf, 1, 0)));
static inline int vprintk(const char *s, va_list args) { return 0; }
static inline int printk(const char *s, ...)
	__attribute__ ((format (printf, 1, 2)));
189
static inline int __cold printk(const char *s, ...) { return 0; }
190 191 192
static inline int log_buf_get_len(void) { return 0; }
static inline int log_buf_read(int idx) { return 0; }
static inline int log_buf_copy(char *dest, int idx, int len) { return 0; }
M
Matt Mackall 已提交
193
#endif
L
Linus Torvalds 已提交
194

195 196 197
extern void __attribute__((format(printf, 1, 2)))
	early_printk(const char *fmt, ...);

L
Linus Torvalds 已提交
198 199 200 201
unsigned long int_sqrt(unsigned long);

extern int printk_ratelimit(void);
extern int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst);
202 203
extern bool printk_timed_ratelimit(unsigned long *caller_jiffies,
				unsigned int interval_msec);
L
Linus Torvalds 已提交
204 205 206 207 208 209 210 211 212 213 214 215 216

static inline void console_silent(void)
{
	console_loglevel = 0;
}

static inline void console_verbose(void)
{
	if (console_loglevel)
		console_loglevel = 15;
}

extern void bust_spinlocks(int yes);
217
extern void wake_up_klogd(void);
L
Linus Torvalds 已提交
218
extern int oops_in_progress;		/* If set, an oops, panic(), BUG() or die() is in progress */
219
extern int panic_timeout;
L
Linus Torvalds 已提交
220
extern int panic_on_oops;
221
extern int panic_on_unrecovered_nmi;
L
Linus Torvalds 已提交
222 223 224
extern int tainted;
extern const char *print_tainted(void);
extern void add_taint(unsigned);
225
extern int root_mountflags;
L
Linus Torvalds 已提交
226 227 228 229 230 231 232 233

/* Values used for system_state */
extern enum system_states {
	SYSTEM_BOOTING,
	SYSTEM_RUNNING,
	SYSTEM_HALT,
	SYSTEM_POWER_OFF,
	SYSTEM_RESTART,
234
	SYSTEM_SUSPEND_DISK,
L
Linus Torvalds 已提交
235 236 237 238 239 240 241 242
} system_state;

#define TAINT_PROPRIETARY_MODULE	(1<<0)
#define TAINT_FORCED_MODULE		(1<<1)
#define TAINT_UNSAFE_SMP		(1<<2)
#define TAINT_FORCED_RMMOD		(1<<3)
#define TAINT_MACHINE_CHECK		(1<<4)
#define TAINT_BAD_PAGE			(1<<5)
243
#define TAINT_USER			(1<<6)
244
#define TAINT_DIE			(1<<7)
245
#define TAINT_OVERRIDDEN_ACPI_TABLE	(1<<8)
L
Linus Torvalds 已提交
246

247
extern void dump_stack(void) __cold;
L
Linus Torvalds 已提交
248

R
Randy Dunlap 已提交
249 250 251 252 253
enum {
	DUMP_PREFIX_NONE,
	DUMP_PREFIX_ADDRESS,
	DUMP_PREFIX_OFFSET
};
R
Randy Dunlap 已提交
254 255 256 257 258
extern void hex_dump_to_buffer(const void *buf, size_t len,
				int rowsize, int groupsize,
				char *linebuf, size_t linebuflen, bool ascii);
extern void print_hex_dump(const char *level, const char *prefix_str,
				int prefix_type, int rowsize, int groupsize,
A
Artem Bityutskiy 已提交
259
				const void *buf, size_t len, bool ascii);
R
Randy Dunlap 已提交
260
extern void print_hex_dump_bytes(const char *prefix_str, int prefix_type,
261
			const void *buf, size_t len);
R
Randy Dunlap 已提交
262 263
#define hex_asc(x)	"0123456789abcdef"[x]

264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
#define pr_emerg(fmt, arg...) \
	printk(KERN_EMERG fmt, ##arg)
#define pr_alert(fmt, arg...) \
	printk(KERN_ALERT fmt, ##arg)
#define pr_crit(fmt, arg...) \
	printk(KERN_CRIT fmt, ##arg)
#define pr_err(fmt, arg...) \
	printk(KERN_ERR fmt, ##arg)
#define pr_warning(fmt, arg...) \
	printk(KERN_WARNING fmt, ##arg)
#define pr_notice(fmt, arg...) \
	printk(KERN_NOTICE fmt, ##arg)
#define pr_info(fmt, arg...) \
	printk(KERN_INFO fmt, ##arg)

L
Linus Torvalds 已提交
279
#ifdef DEBUG
280
/* If you are writing a driver, please use dev_dbg instead */
281 282
#define pr_debug(fmt, arg...) \
	printk(KERN_DEBUG fmt, ##arg)
L
Linus Torvalds 已提交
283
#else
284 285 286 287
static inline int __attribute__ ((format (printf, 1, 2))) pr_debug(const char * fmt, ...)
{
	return 0;
}
L
Linus Torvalds 已提交
288 289 290 291 292 293 294 295 296 297 298
#endif

/*
 *      Display an IP address in readable format.
 */

#define NIPQUAD(addr) \
	((unsigned char *)&addr)[0], \
	((unsigned char *)&addr)[1], \
	((unsigned char *)&addr)[2], \
	((unsigned char *)&addr)[3]
J
Joe Perches 已提交
299
#define NIPQUAD_FMT "%u.%u.%u.%u"
L
Linus Torvalds 已提交
300 301 302 303 304 305 306 307 308 309

#define NIP6(addr) \
	ntohs((addr).s6_addr16[0]), \
	ntohs((addr).s6_addr16[1]), \
	ntohs((addr).s6_addr16[2]), \
	ntohs((addr).s6_addr16[3]), \
	ntohs((addr).s6_addr16[4]), \
	ntohs((addr).s6_addr16[5]), \
	ntohs((addr).s6_addr16[6]), \
	ntohs((addr).s6_addr16[7])
J
Joe Perches 已提交
310
#define NIP6_FMT "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x"
311
#define NIP6_SEQFMT "%04x%04x%04x%04x%04x%04x%04x%04x"
L
Linus Torvalds 已提交
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361

#if defined(__LITTLE_ENDIAN)
#define HIPQUAD(addr) \
	((unsigned char *)&addr)[3], \
	((unsigned char *)&addr)[2], \
	((unsigned char *)&addr)[1], \
	((unsigned char *)&addr)[0]
#elif defined(__BIG_ENDIAN)
#define HIPQUAD	NIPQUAD
#else
#error "Please fix asm/byteorder.h"
#endif /* __LITTLE_ENDIAN */

/*
 * min()/max() macros that also do
 * strict type-checking.. See the
 * "unnecessary" pointer comparison.
 */
#define min(x,y) ({ \
	typeof(x) _x = (x);	\
	typeof(y) _y = (y);	\
	(void) (&_x == &_y);		\
	_x < _y ? _x : _y; })

#define max(x,y) ({ \
	typeof(x) _x = (x);	\
	typeof(y) _y = (y);	\
	(void) (&_x == &_y);		\
	_x > _y ? _x : _y; })

/*
 * ..and if you can't take the strict
 * types, you can specify one yourself.
 *
 * Or not use min/max at all, of course.
 */
#define min_t(type,x,y) \
	({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
#define max_t(type,x,y) \
	({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })


/**
 * container_of - cast a member of a structure out to the containing structure
 * @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) ({			\
362 363
	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
	(type *)( (char *)__mptr - offsetof(type,member) );})
L
Linus Torvalds 已提交
364 365 366 367 368 369 370 371 372 373 374 375

/*
 * Check at compile time that something is of a particular type.
 * Always evaluates to 1 so you may use it easily in comparisons.
 */
#define typecheck(type,x) \
({	type __dummy; \
	typeof(x) __dummy2; \
	(void)(&__dummy == &__dummy2); \
	1; \
})

376 377 378 379 380 381 382 383 384
/*
 * Check at compile time that 'function' is a certain type, or is a pointer
 * to that type (needs to use typedef for the function type.)
 */
#define typecheck_fn(type,function) \
({	typeof(type) __tmp = function; \
	(void)__tmp; \
})

385 386 387
struct sysinfo;
extern int do_sysinfo(struct sysinfo *info);

L
Linus Torvalds 已提交
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
#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.. */
};

408
/* Force a compilation error if condition is true */
409
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
L
Linus Torvalds 已提交
410

411 412 413 414 415 416
/* 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). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1)

L
Linus Torvalds 已提交
417 418 419
/* Trap pasters of __FUNCTION__ at compile-time */
#define __FUNCTION__ (__func__)

420 421 422 423 424 425 426
/* This helps us to avoid #ifdef CONFIG_NUMA */
#ifdef CONFIG_NUMA
#define NUMA_BUILD 1
#else
#define NUMA_BUILD 0
#endif

L
Linus Torvalds 已提交
427
#endif