| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /*  | 
 | 2 |  * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) | 
 | 3 |  * Licensed under the GPL | 
 | 4 |  */ | 
 | 5 |  | 
 | 6 | #ifndef __UM_THREAD_INFO_H | 
 | 7 | #define __UM_THREAD_INFO_H | 
 | 8 |  | 
 | 9 | #ifndef __ASSEMBLY__ | 
 | 10 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 11 | #include <asm/processor.h> | 
 | 12 | #include <asm/types.h> | 
 | 13 |  | 
 | 14 | struct thread_info { | 
 | 15 | 	struct task_struct	*task;		/* main task structure */ | 
 | 16 | 	struct exec_domain	*exec_domain;	/* execution domain */ | 
 | 17 | 	unsigned long		flags;		/* low level flags */ | 
 | 18 | 	__u32			cpu;		/* current CPU */ | 
| Jesper Juhl | dcd497f | 2005-06-23 00:09:07 -0700 | [diff] [blame] | 19 | 	int			preempt_count;  /* 0 => preemptable, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 20 | 						   <0 => BUG */ | 
 | 21 | 	mm_segment_t		addr_limit;	/* thread address space: | 
 | 22 | 					 	   0-0xBFFFFFFF for user | 
 | 23 | 						   0-0xFFFFFFFF for kernel */ | 
 | 24 | 	struct restart_block    restart_block; | 
| Jeff Dike | c14b849 | 2007-05-10 22:22:34 -0700 | [diff] [blame] | 25 | 	struct thread_info	*real_thread;    /* Points to non-IRQ stack */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 26 | }; | 
 | 27 |  | 
 | 28 | #define INIT_THREAD_INFO(tsk)			\ | 
 | 29 | {						\ | 
| Al Viro | 4d338e1 | 2006-03-31 02:30:15 -0800 | [diff] [blame] | 30 | 	.task =		&tsk,			\ | 
 | 31 | 	.exec_domain =	&default_exec_domain,	\ | 
 | 32 | 	.flags =		0,		\ | 
 | 33 | 	.cpu =		0,			\ | 
 | 34 | 	.preempt_count =	1,		\ | 
 | 35 | 	.addr_limit =	KERNEL_DS,		\ | 
 | 36 | 	.restart_block =  {			\ | 
 | 37 | 		.fn =  do_no_restart_syscall,	\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 38 | 	},					\ | 
| Jeff Dike | c14b849 | 2007-05-10 22:22:34 -0700 | [diff] [blame] | 39 | 	.real_thread = NULL,			\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 40 | } | 
 | 41 |  | 
 | 42 | #define init_thread_info	(init_thread_union.thread_info) | 
 | 43 | #define init_stack		(init_thread_union.stack) | 
 | 44 |  | 
| Paolo 'Blaisorblade' Giarrusso | b346103 | 2005-05-28 15:52:00 -0700 | [diff] [blame] | 45 | #define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 46 | /* how to get the thread information struct from C */ | 
 | 47 | static inline struct thread_info *current_thread_info(void) | 
 | 48 | { | 
 | 49 | 	struct thread_info *ti; | 
| Paolo 'Blaisorblade' Giarrusso | b346103 | 2005-05-28 15:52:00 -0700 | [diff] [blame] | 50 | 	unsigned long mask = THREAD_SIZE - 1; | 
 | 51 | 	ti = (struct thread_info *) (((unsigned long) &ti) & ~mask); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 52 | 	return ti; | 
 | 53 | } | 
 | 54 |  | 
| Jeff Dike | e18eecb | 2007-07-15 23:38:48 -0700 | [diff] [blame] | 55 | #ifdef CONFIG_DEBUG_STACK_USAGE | 
 | 56 |  | 
 | 57 | #define alloc_thread_info(tsk) \ | 
 | 58 | 	((struct thread_info *) __get_free_pages(GFP_KERNEL | __GFP_ZERO, \ | 
 | 59 | 						 CONFIG_KERNEL_STACK_ORDER)) | 
 | 60 | #else | 
 | 61 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 62 | /* thread information allocation */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 63 | #define alloc_thread_info(tsk) \ | 
| Jeff Dike | 84812217 | 2007-07-15 23:38:48 -0700 | [diff] [blame] | 64 | 	((struct thread_info *) __get_free_pages(GFP_KERNEL, \ | 
 | 65 | 						 CONFIG_KERNEL_STACK_ORDER)) | 
| Jeff Dike | e18eecb | 2007-07-15 23:38:48 -0700 | [diff] [blame] | 66 | #endif | 
 | 67 |  | 
| Jeff Dike | 84812217 | 2007-07-15 23:38:48 -0700 | [diff] [blame] | 68 | #define free_thread_info(ti) \ | 
 | 69 | 	free_pages((unsigned long)(ti),CONFIG_KERNEL_STACK_ORDER) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 70 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 71 | #endif | 
 | 72 |  | 
| Paolo 'Blaisorblade' Giarrusso | affac4b | 2005-05-28 15:52:00 -0700 | [diff] [blame] | 73 | #define PREEMPT_ACTIVE		0x10000000 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 74 |  | 
 | 75 | #define TIF_SYSCALL_TRACE	0	/* syscall trace active */ | 
 | 76 | #define TIF_SIGPENDING		1	/* signal pending */ | 
 | 77 | #define TIF_NEED_RESCHED	2	/* rescheduling necessary */ | 
 | 78 | #define TIF_POLLING_NRFLAG      3       /* true if poll_idle() is polling  | 
 | 79 | 					 * TIF_NEED_RESCHED  | 
 | 80 | 					 */ | 
 | 81 | #define TIF_RESTART_BLOCK 	4 | 
 | 82 | #define TIF_MEMDIE	 	5 | 
| Jeff Dike | 79d20b1 | 2005-05-03 07:54:51 +0100 | [diff] [blame] | 83 | #define TIF_SYSCALL_AUDIT	6 | 
| Jeff Dike | 2fc1062 | 2006-01-18 17:44:02 -0800 | [diff] [blame] | 84 | #define TIF_RESTORE_SIGMASK	7 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 85 |  | 
 | 86 | #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE) | 
 | 87 | #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING) | 
 | 88 | #define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED) | 
 | 89 | #define _TIF_POLLING_NRFLAG     (1 << TIF_POLLING_NRFLAG) | 
| Jeff Dike | 79d20b1 | 2005-05-03 07:54:51 +0100 | [diff] [blame] | 90 | #define _TIF_MEMDIE		(1 << TIF_MEMDIE) | 
 | 91 | #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT) | 
| Jeff Dike | 2fc1062 | 2006-01-18 17:44:02 -0800 | [diff] [blame] | 92 | #define _TIF_RESTORE_SIGMASK	(1 << TIF_RESTORE_SIGMASK) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 93 |  | 
 | 94 | #endif |