Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v3.12-rc4 285 lines 8.9 kB view raw
1/* thread_info.h: low-level thread information 2 * 3 * Copyright (C) 2002 David Howells (dhowells@redhat.com) 4 * - Incorporating suggestions made by Linus Torvalds and Dave Miller 5 */ 6 7#ifndef _ASM_X86_THREAD_INFO_H 8#define _ASM_X86_THREAD_INFO_H 9 10#include <linux/compiler.h> 11#include <asm/page.h> 12#include <asm/types.h> 13 14/* 15 * low level task data that entry.S needs immediate access to 16 * - this struct should fit entirely inside of one cache line 17 * - this struct shares the supervisor stack pages 18 */ 19#ifndef __ASSEMBLY__ 20struct task_struct; 21struct exec_domain; 22#include <asm/processor.h> 23#include <linux/atomic.h> 24 25struct thread_info { 26 struct task_struct *task; /* main task structure */ 27 struct exec_domain *exec_domain; /* execution domain */ 28 __u32 flags; /* low level flags */ 29 __u32 status; /* thread synchronous flags */ 30 __u32 cpu; /* current CPU */ 31 int preempt_count; /* 0 => preemptable, 32 <0 => BUG */ 33 mm_segment_t addr_limit; 34 struct restart_block restart_block; 35 void __user *sysenter_return; 36#ifdef CONFIG_X86_32 37 unsigned long previous_esp; /* ESP of the previous stack in 38 case of nested (IRQ) stacks 39 */ 40 __u8 supervisor_stack[0]; 41#endif 42 unsigned int sig_on_uaccess_error:1; 43 unsigned int uaccess_err:1; /* uaccess failed */ 44}; 45 46#define INIT_THREAD_INFO(tsk) \ 47{ \ 48 .task = &tsk, \ 49 .exec_domain = &default_exec_domain, \ 50 .flags = 0, \ 51 .cpu = 0, \ 52 .preempt_count = INIT_PREEMPT_COUNT, \ 53 .addr_limit = KERNEL_DS, \ 54 .restart_block = { \ 55 .fn = do_no_restart_syscall, \ 56 }, \ 57} 58 59#define init_thread_info (init_thread_union.thread_info) 60#define init_stack (init_thread_union.stack) 61 62#else /* !__ASSEMBLY__ */ 63 64#include <asm/asm-offsets.h> 65 66#endif 67 68/* 69 * thread information flags 70 * - these are process state flags that various assembly files 71 * may need to access 72 * - pending work-to-be-done flags are in LSW 73 * - other flags in MSW 74 * Warning: layout of LSW is hardcoded in entry.S 75 */ 76#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ 77#define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ 78#define TIF_SIGPENDING 2 /* signal pending */ 79#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ 80#define TIF_SINGLESTEP 4 /* reenable singlestep on user return*/ 81#define TIF_SYSCALL_EMU 6 /* syscall emulation active */ 82#define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ 83#define TIF_SECCOMP 8 /* secure computing */ 84#define TIF_MCE_NOTIFY 10 /* notify userspace of an MCE */ 85#define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */ 86#define TIF_UPROBE 12 /* breakpointed or singlestepping */ 87#define TIF_NOTSC 16 /* TSC is not accessible in userland */ 88#define TIF_IA32 17 /* IA32 compatibility process */ 89#define TIF_FORK 18 /* ret_from_fork */ 90#define TIF_NOHZ 19 /* in adaptive nohz mode */ 91#define TIF_MEMDIE 20 /* is terminating due to OOM killer */ 92#define TIF_IO_BITMAP 22 /* uses I/O bitmap */ 93#define TIF_FORCED_TF 24 /* true if TF in eflags artificially */ 94#define TIF_BLOCKSTEP 25 /* set when we want DEBUGCTLMSR_BTF */ 95#define TIF_LAZY_MMU_UPDATES 27 /* task is updating the mmu lazily */ 96#define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */ 97#define TIF_ADDR32 29 /* 32-bit address space on 64 bits */ 98#define TIF_X32 30 /* 32-bit native x86-64 binary */ 99 100#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) 101#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) 102#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 103#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) 104#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 105#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU) 106#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) 107#define _TIF_SECCOMP (1 << TIF_SECCOMP) 108#define _TIF_MCE_NOTIFY (1 << TIF_MCE_NOTIFY) 109#define _TIF_USER_RETURN_NOTIFY (1 << TIF_USER_RETURN_NOTIFY) 110#define _TIF_UPROBE (1 << TIF_UPROBE) 111#define _TIF_NOTSC (1 << TIF_NOTSC) 112#define _TIF_IA32 (1 << TIF_IA32) 113#define _TIF_FORK (1 << TIF_FORK) 114#define _TIF_NOHZ (1 << TIF_NOHZ) 115#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) 116#define _TIF_FORCED_TF (1 << TIF_FORCED_TF) 117#define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP) 118#define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES) 119#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) 120#define _TIF_ADDR32 (1 << TIF_ADDR32) 121#define _TIF_X32 (1 << TIF_X32) 122 123/* work to do in syscall_trace_enter() */ 124#define _TIF_WORK_SYSCALL_ENTRY \ 125 (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_EMU | _TIF_SYSCALL_AUDIT | \ 126 _TIF_SECCOMP | _TIF_SINGLESTEP | _TIF_SYSCALL_TRACEPOINT | \ 127 _TIF_NOHZ) 128 129/* work to do in syscall_trace_leave() */ 130#define _TIF_WORK_SYSCALL_EXIT \ 131 (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SINGLESTEP | \ 132 _TIF_SYSCALL_TRACEPOINT | _TIF_NOHZ) 133 134/* work to do on interrupt/exception return */ 135#define _TIF_WORK_MASK \ 136 (0x0000FFFF & \ 137 ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT| \ 138 _TIF_SINGLESTEP|_TIF_SECCOMP|_TIF_SYSCALL_EMU)) 139 140/* work to do on any return to user space */ 141#define _TIF_ALLWORK_MASK \ 142 ((0x0000FFFF & ~_TIF_SECCOMP) | _TIF_SYSCALL_TRACEPOINT | \ 143 _TIF_NOHZ) 144 145/* Only used for 64 bit */ 146#define _TIF_DO_NOTIFY_MASK \ 147 (_TIF_SIGPENDING | _TIF_MCE_NOTIFY | _TIF_NOTIFY_RESUME | \ 148 _TIF_USER_RETURN_NOTIFY) 149 150/* flags to check in __switch_to() */ 151#define _TIF_WORK_CTXSW \ 152 (_TIF_IO_BITMAP|_TIF_NOTSC|_TIF_BLOCKSTEP) 153 154#define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY) 155#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) 156 157#define PREEMPT_ACTIVE 0x10000000 158 159#ifdef CONFIG_X86_32 160 161#define STACK_WARN (THREAD_SIZE/8) 162/* 163 * macros/functions for gaining access to the thread information structure 164 * 165 * preempt_count needs to be 1 initially, until the scheduler is functional. 166 */ 167#ifndef __ASSEMBLY__ 168 169 170/* how to get the current stack pointer from C */ 171register unsigned long current_stack_pointer asm("esp") __used; 172 173/* how to get the thread information struct from C */ 174static inline struct thread_info *current_thread_info(void) 175{ 176 return (struct thread_info *) 177 (current_stack_pointer & ~(THREAD_SIZE - 1)); 178} 179 180#else /* !__ASSEMBLY__ */ 181 182/* how to get the thread information struct from ASM */ 183#define GET_THREAD_INFO(reg) \ 184 movl $-THREAD_SIZE, reg; \ 185 andl %esp, reg 186 187/* use this one if reg already contains %esp */ 188#define GET_THREAD_INFO_WITH_ESP(reg) \ 189 andl $-THREAD_SIZE, reg 190 191#endif 192 193#else /* X86_32 */ 194 195#include <asm/percpu.h> 196#define KERNEL_STACK_OFFSET (5*8) 197 198/* 199 * macros/functions for gaining access to the thread information structure 200 * preempt_count needs to be 1 initially, until the scheduler is functional. 201 */ 202#ifndef __ASSEMBLY__ 203DECLARE_PER_CPU(unsigned long, kernel_stack); 204 205static inline struct thread_info *current_thread_info(void) 206{ 207 struct thread_info *ti; 208 ti = (void *)(this_cpu_read_stable(kernel_stack) + 209 KERNEL_STACK_OFFSET - THREAD_SIZE); 210 return ti; 211} 212 213#else /* !__ASSEMBLY__ */ 214 215/* how to get the thread information struct from ASM */ 216#define GET_THREAD_INFO(reg) \ 217 movq PER_CPU_VAR(kernel_stack),reg ; \ 218 subq $(THREAD_SIZE-KERNEL_STACK_OFFSET),reg 219 220/* 221 * Same if PER_CPU_VAR(kernel_stack) is, perhaps with some offset, already in 222 * a certain register (to be used in assembler memory operands). 223 */ 224#define THREAD_INFO(reg, off) KERNEL_STACK_OFFSET+(off)-THREAD_SIZE(reg) 225 226#endif 227 228#endif /* !X86_32 */ 229 230/* 231 * Thread-synchronous status. 232 * 233 * This is different from the flags in that nobody else 234 * ever touches our thread-synchronous status, so we don't 235 * have to worry about atomic accesses. 236 */ 237#define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/ 238#define TS_POLLING 0x0004 /* idle task polling need_resched, 239 skip sending interrupt */ 240#define TS_RESTORE_SIGMASK 0x0008 /* restore signal mask in do_signal() */ 241 242#ifndef __ASSEMBLY__ 243#define HAVE_SET_RESTORE_SIGMASK 1 244static inline void set_restore_sigmask(void) 245{ 246 struct thread_info *ti = current_thread_info(); 247 ti->status |= TS_RESTORE_SIGMASK; 248 WARN_ON(!test_bit(TIF_SIGPENDING, (unsigned long *)&ti->flags)); 249} 250static inline void clear_restore_sigmask(void) 251{ 252 current_thread_info()->status &= ~TS_RESTORE_SIGMASK; 253} 254static inline bool test_restore_sigmask(void) 255{ 256 return current_thread_info()->status & TS_RESTORE_SIGMASK; 257} 258static inline bool test_and_clear_restore_sigmask(void) 259{ 260 struct thread_info *ti = current_thread_info(); 261 if (!(ti->status & TS_RESTORE_SIGMASK)) 262 return false; 263 ti->status &= ~TS_RESTORE_SIGMASK; 264 return true; 265} 266 267static inline bool is_ia32_task(void) 268{ 269#ifdef CONFIG_X86_32 270 return true; 271#endif 272#ifdef CONFIG_IA32_EMULATION 273 if (current_thread_info()->status & TS_COMPAT) 274 return true; 275#endif 276 return false; 277} 278#endif /* !__ASSEMBLY__ */ 279 280#ifndef __ASSEMBLY__ 281extern void arch_task_cache_init(void); 282extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); 283extern void arch_release_task_struct(struct task_struct *tsk); 284#endif 285#endif /* _ASM_X86_THREAD_INFO_H */