Home | History | Annotate | Download | only in asm-x86
      1 /* thread_info.h: i386 low-level thread information
      2  *
      3  * Copyright (C) 2002  David Howells (dhowells (at) redhat.com)
      4  * - Incorporating suggestions made by Linus Torvalds and Dave Miller
      5  */
      6 
      7 #ifndef _ASM_THREAD_INFO_H
      8 #define _ASM_THREAD_INFO_H
      9 
     10 #ifdef __KERNEL__
     11 
     12 #include <linux/compiler.h>
     13 #include <asm/page.h>
     14 
     15 #ifndef __ASSEMBLY__
     16 #include <asm/processor.h>
     17 #endif
     18 
     19 /*
     20  * low level task data that entry.S needs immediate access to
     21  * - this struct should fit entirely inside of one cache line
     22  * - this struct shares the supervisor stack pages
     23  * - if the contents of this structure are changed, the assembly constants must also be changed
     24  */
     25 #ifndef __ASSEMBLY__
     26 
     27 struct thread_info {
     28 	struct task_struct	*task;		/* main task structure */
     29 	struct exec_domain	*exec_domain;	/* execution domain */
     30 	unsigned long		flags;		/* low level flags */
     31 	unsigned long		status;		/* thread-synchronous flags */
     32 	__u32			cpu;		/* current CPU */
     33 	int			preempt_count;	/* 0 => preemptable, <0 => BUG */
     34 
     35 
     36 	mm_segment_t		addr_limit;	/* thread address space:
     37 					 	   0-0xBFFFFFFF for user-thead
     38 						   0-0xFFFFFFFF for kernel-thread
     39 						*/
     40 	void			*sysenter_return;
     41 	struct restart_block    restart_block;
     42 
     43 	unsigned long           previous_esp;   /* ESP of the previous stack in case
     44 						   of nested (IRQ) stacks
     45 						*/
     46 	__u8			supervisor_stack[0];
     47 };
     48 
     49 #else /* !__ASSEMBLY__ */
     50 
     51 #include <asm/asm-offsets.h>
     52 
     53 #endif
     54 
     55 #define PREEMPT_ACTIVE		0x10000000
     56 #ifdef CONFIG_4KSTACKS
     57 #define THREAD_SIZE            (4096)
     58 #else
     59 #define THREAD_SIZE		(8192)
     60 #endif
     61 
     62 #define STACK_WARN             (THREAD_SIZE/8)
     63 /*
     64  * macros/functions for gaining access to the thread information structure
     65  *
     66  * preempt_count needs to be 1 initially, until the scheduler is functional.
     67  */
     68 #ifndef __ASSEMBLY__
     69 
     70 #define INIT_THREAD_INFO(tsk)			\
     71 {						\
     72 	.task		= &tsk,			\
     73 	.exec_domain	= &default_exec_domain,	\
     74 	.flags		= 0,			\
     75 	.cpu		= 0,			\
     76 	.preempt_count	= 1,			\
     77 	.addr_limit	= KERNEL_DS,		\
     78 	.restart_block = {			\
     79 		.fn = do_no_restart_syscall,	\
     80 	},					\
     81 }
     82 
     83 #define init_thread_info	(init_thread_union.thread_info)
     84 #define init_stack		(init_thread_union.stack)
     85 
     86 
     87 /* how to get the current stack pointer from C */
     88 register unsigned long current_stack_pointer asm("esp") __attribute_used__;
     89 
     90 /* how to get the thread information struct from C */
     91 static inline struct thread_info *current_thread_info(void)
     92 {
     93 	return (struct thread_info *)(current_stack_pointer & ~(THREAD_SIZE - 1));
     94 }
     95 
     96 /* thread information allocation */
     97 #ifdef CONFIG_DEBUG_STACK_USAGE
     98 #define alloc_thread_info(tsk) ((struct thread_info *) \
     99 	__get_free_pages(GFP_KERNEL| __GFP_ZERO, get_order(THREAD_SIZE)))
    100 #else
    101 #define alloc_thread_info(tsk) ((struct thread_info *) \
    102 	__get_free_pages(GFP_KERNEL, get_order(THREAD_SIZE)))
    103 #endif
    104 
    105 #define free_thread_info(info)	free_pages((unsigned long)(info), get_order(THREAD_SIZE))
    106 
    107 #else /* !__ASSEMBLY__ */
    108 
    109 /* how to get the thread information struct from ASM */
    110 #define GET_THREAD_INFO(reg) \
    111 	movl $-THREAD_SIZE, reg; \
    112 	andl %esp, reg
    113 
    114 /* use this one if reg already contains %esp */
    115 #define GET_THREAD_INFO_WITH_ESP(reg) \
    116 	andl $-THREAD_SIZE, reg
    117 
    118 #endif
    119 
    120 /*
    121  * thread information flags
    122  * - these are process state flags that various assembly files may need to access
    123  * - pending work-to-be-done flags are in LSW
    124  * - other flags in MSW
    125  */
    126 #define TIF_SYSCALL_TRACE	0	/* syscall trace active */
    127 #define TIF_SIGPENDING		1	/* signal pending */
    128 #define TIF_NEED_RESCHED	2	/* rescheduling necessary */
    129 #define TIF_SINGLESTEP		3	/* restore singlestep on return to user mode */
    130 #define TIF_IRET		4	/* return with iret */
    131 #define TIF_SYSCALL_EMU		5	/* syscall emulation active */
    132 #define TIF_SYSCALL_AUDIT	6	/* syscall auditing active */
    133 #define TIF_SECCOMP		7	/* secure computing */
    134 #define TIF_RESTORE_SIGMASK	8	/* restore signal mask in do_signal() */
    135 #define TIF_MEMDIE		16
    136 #define TIF_DEBUG		17	/* uses debug registers */
    137 #define TIF_IO_BITMAP		18	/* uses I/O bitmap */
    138 #define TIF_FREEZE		19	/* is freezing for suspend */
    139 #define TIF_NOTSC		20	/* TSC is not accessible in userland */
    140 
    141 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
    142 #define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)
    143 #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
    144 #define _TIF_SINGLESTEP		(1<<TIF_SINGLESTEP)
    145 #define _TIF_IRET		(1<<TIF_IRET)
    146 #define _TIF_SYSCALL_EMU	(1<<TIF_SYSCALL_EMU)
    147 #define _TIF_SYSCALL_AUDIT	(1<<TIF_SYSCALL_AUDIT)
    148 #define _TIF_SECCOMP		(1<<TIF_SECCOMP)
    149 #define _TIF_RESTORE_SIGMASK	(1<<TIF_RESTORE_SIGMASK)
    150 #define _TIF_DEBUG		(1<<TIF_DEBUG)
    151 #define _TIF_IO_BITMAP		(1<<TIF_IO_BITMAP)
    152 #define _TIF_FREEZE		(1<<TIF_FREEZE)
    153 #define _TIF_NOTSC		(1<<TIF_NOTSC)
    154 
    155 /* work to do on interrupt/exception return */
    156 #define _TIF_WORK_MASK \
    157   (0x0000FFFF & ~(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
    158 		  _TIF_SECCOMP | _TIF_SYSCALL_EMU))
    159 /* work to do on any return to u-space */
    160 #define _TIF_ALLWORK_MASK	(0x0000FFFF & ~_TIF_SECCOMP)
    161 
    162 /* flags to check in __switch_to() */
    163 #define _TIF_WORK_CTXSW_NEXT (_TIF_IO_BITMAP | _TIF_NOTSC | _TIF_DEBUG)
    164 #define _TIF_WORK_CTXSW_PREV (_TIF_IO_BITMAP | _TIF_NOTSC)
    165 
    166 /*
    167  * Thread-synchronous status.
    168  *
    169  * This is different from the flags in that nobody else
    170  * ever touches our thread-synchronous status, so we don't
    171  * have to worry about atomic accesses.
    172  */
    173 #define TS_USEDFPU		0x0001	/* FPU was used by this task this quantum (SMP) */
    174 #define TS_POLLING		0x0002	/* True if in idle loop and not sleeping */
    175 
    176 #define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING)
    177 
    178 #endif /* __KERNEL__ */
    179 
    180 #endif /* _ASM_THREAD_INFO_H */
    181