1
2
3
4
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/percpu.h>
13#include <asm/types.h>
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#ifdef CONFIG_X86_32
36# ifdef CONFIG_VM86
37# define TOP_OF_KERNEL_STACK_PADDING 16
38# else
39# define TOP_OF_KERNEL_STACK_PADDING 8
40# endif
41#else
42# define TOP_OF_KERNEL_STACK_PADDING 0
43#endif
44
45
46
47
48
49
50#ifndef __ASSEMBLY__
51struct task_struct;
52#include <asm/processor.h>
53#include <linux/atomic.h>
54
55struct thread_info {
56 struct task_struct *task;
57 __u32 flags;
58 __u32 status;
59 __u32 cpu;
60 mm_segment_t addr_limit;
61 unsigned int sig_on_uaccess_error:1;
62 unsigned int uaccess_err:1;
63};
64
65#define INIT_THREAD_INFO(tsk) \
66{ \
67 .task = &tsk, \
68 .flags = 0, \
69 .cpu = 0, \
70 .addr_limit = KERNEL_DS, \
71}
72
73#define init_thread_info (init_thread_union.thread_info)
74#define init_stack (init_thread_union.stack)
75
76#else
77
78#include <asm/asm-offsets.h>
79
80#endif
81
82
83
84
85
86
87
88
89
90#define TIF_SYSCALL_TRACE 0
91#define TIF_NOTIFY_RESUME 1
92#define TIF_SIGPENDING 2
93#define TIF_NEED_RESCHED 3
94#define TIF_SINGLESTEP 4
95#define TIF_SYSCALL_EMU 6
96#define TIF_SYSCALL_AUDIT 7
97#define TIF_SECCOMP 8
98#define TIF_USER_RETURN_NOTIFY 11
99#define TIF_UPROBE 12
100#define TIF_NOTSC 16
101#define TIF_IA32 17
102#define TIF_FORK 18
103#define TIF_NOHZ 19
104#define TIF_MEMDIE 20
105#define TIF_POLLING_NRFLAG 21
106#define TIF_IO_BITMAP 22
107#define TIF_FORCED_TF 24
108#define TIF_BLOCKSTEP 25
109#define TIF_LAZY_MMU_UPDATES 27
110#define TIF_SYSCALL_TRACEPOINT 28
111#define TIF_ADDR32 29
112#define TIF_X32 30
113
114#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
115#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
116#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
117#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
118#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
119#define _TIF_SYSCALL_EMU (1 << TIF_SYSCALL_EMU)
120#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
121#define _TIF_SECCOMP (1 << TIF_SECCOMP)
122#define _TIF_USER_RETURN_NOTIFY (1 << TIF_USER_RETURN_NOTIFY)
123#define _TIF_UPROBE (1 << TIF_UPROBE)
124#define _TIF_NOTSC (1 << TIF_NOTSC)
125#define _TIF_IA32 (1 << TIF_IA32)
126#define _TIF_FORK (1 << TIF_FORK)
127#define _TIF_NOHZ (1 << TIF_NOHZ)
128#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
129#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP)
130#define _TIF_FORCED_TF (1 << TIF_FORCED_TF)
131#define _TIF_BLOCKSTEP (1 << TIF_BLOCKSTEP)
132#define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES)
133#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
134#define _TIF_ADDR32 (1 << TIF_ADDR32)
135#define _TIF_X32 (1 << TIF_X32)
136
137
138#define _TIF_WORK_SYSCALL_ENTRY \
139 (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_EMU | _TIF_SYSCALL_AUDIT | \
140 _TIF_SECCOMP | _TIF_SINGLESTEP | _TIF_SYSCALL_TRACEPOINT | \
141 _TIF_NOHZ)
142
143
144#define _TIF_ALLWORK_MASK \
145 ((0x0000FFFF & ~_TIF_SECCOMP) | _TIF_SYSCALL_TRACEPOINT | \
146 _TIF_NOHZ)
147
148
149#define _TIF_WORK_CTXSW \
150 (_TIF_IO_BITMAP|_TIF_NOTSC|_TIF_BLOCKSTEP)
151
152#define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY)
153#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW)
154
155#define STACK_WARN (THREAD_SIZE/8)
156
157
158
159
160
161
162#ifndef __ASSEMBLY__
163
164static inline struct thread_info *current_thread_info(void)
165{
166 return (struct thread_info *)(current_top_of_stack() - THREAD_SIZE);
167}
168
169static inline unsigned long current_stack_pointer(void)
170{
171 unsigned long sp;
172#ifdef CONFIG_X86_64
173 asm("mov %%rsp,%0" : "=g" (sp));
174#else
175 asm("mov %%esp,%0" : "=g" (sp));
176#endif
177 return sp;
178}
179
180#else
181
182#ifdef CONFIG_X86_64
183# define cpu_current_top_of_stack (cpu_tss + TSS_sp0)
184#endif
185
186
187#define GET_THREAD_INFO(reg) \
188 _ASM_MOV PER_CPU_VAR(cpu_current_top_of_stack),reg ; \
189 _ASM_SUB $(THREAD_SIZE),reg ;
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#define ASM_THREAD_INFO(field, reg, off) ((field)+(off)-THREAD_SIZE)(reg)
217
218#endif
219
220
221
222
223
224
225
226
227#define TS_COMPAT 0x0002
228#define TS_RESTORE_SIGMASK 0x0008
229
230#ifndef __ASSEMBLY__
231#define HAVE_SET_RESTORE_SIGMASK 1
232static inline void set_restore_sigmask(void)
233{
234 struct thread_info *ti = current_thread_info();
235 ti->status |= TS_RESTORE_SIGMASK;
236 WARN_ON(!test_bit(TIF_SIGPENDING, (unsigned long *)&ti->flags));
237}
238static inline void clear_restore_sigmask(void)
239{
240 current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
241}
242static inline bool test_restore_sigmask(void)
243{
244 return current_thread_info()->status & TS_RESTORE_SIGMASK;
245}
246static inline bool test_and_clear_restore_sigmask(void)
247{
248 struct thread_info *ti = current_thread_info();
249 if (!(ti->status & TS_RESTORE_SIGMASK))
250 return false;
251 ti->status &= ~TS_RESTORE_SIGMASK;
252 return true;
253}
254
255static inline bool is_ia32_task(void)
256{
257#ifdef CONFIG_X86_32
258 return true;
259#endif
260#ifdef CONFIG_IA32_EMULATION
261 if (current_thread_info()->status & TS_COMPAT)
262 return true;
263#endif
264 return false;
265}
266
267
268
269
270
271
272
273
274#define force_iret() set_thread_flag(TIF_NOTIFY_RESUME)
275
276#endif
277
278#ifndef __ASSEMBLY__
279extern void arch_task_cache_init(void);
280extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
281extern void arch_release_task_struct(struct task_struct *tsk);
282#endif
283#endif
284