aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2006-01-11 16:44:06 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-11 22:04:53 -0500
commitbf2fcc6fdfe4f4e92bb74f062c0a1be189f3a561 (patch)
tree0bcc33f681c7e8ce6596c9323d4a1026ede84994
parent2966387b481a11a90a7bed6600fc17b4253f6980 (diff)
[PATCH] x86_64: Implement is_compat_task the right way
By setting a flag during a 32bit system call only Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/x86_64/ia32/ia32entry.S5
-rw-r--r--arch/x86_64/kernel/asm-offsets.c1
-rw-r--r--arch/x86_64/kernel/entry.S1
-rw-r--r--drivers/input/evdev.c4
-rw-r--r--include/asm-x86_64/compat.h5
-rw-r--r--include/asm-x86_64/thread_info.h1
6 files changed, 16 insertions, 1 deletions
diff --git a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S
index 8172e61c3f6f..58f5bfb52c63 100644
--- a/arch/x86_64/ia32/ia32entry.S
+++ b/arch/x86_64/ia32/ia32entry.S
@@ -104,6 +104,7 @@ ENTRY(ia32_sysenter_target)
104 .quad 1b,ia32_badarg 104 .quad 1b,ia32_badarg
105 .previous 105 .previous
106 GET_THREAD_INFO(%r10) 106 GET_THREAD_INFO(%r10)
107 orl $TS_COMPAT,threadinfo_status(%r10)
107 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10) 108 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)
108 CFI_REMEMBER_STATE 109 CFI_REMEMBER_STATE
109 jnz sysenter_tracesys 110 jnz sysenter_tracesys
@@ -117,6 +118,7 @@ sysenter_do_call:
117 cli 118 cli
118 testl $_TIF_ALLWORK_MASK,threadinfo_flags(%r10) 119 testl $_TIF_ALLWORK_MASK,threadinfo_flags(%r10)
119 jnz int_ret_from_sys_call 120 jnz int_ret_from_sys_call
121 andl $~TS_COMPAT,threadinfo_status(%r10)
120 /* clear IF, that popfq doesn't enable interrupts early */ 122 /* clear IF, that popfq doesn't enable interrupts early */
121 andl $~0x200,EFLAGS-R11(%rsp) 123 andl $~0x200,EFLAGS-R11(%rsp)
122 RESTORE_ARGS 1,24,1,1,1,1 124 RESTORE_ARGS 1,24,1,1,1,1
@@ -203,6 +205,7 @@ ENTRY(ia32_cstar_target)
203 .quad 1b,ia32_badarg 205 .quad 1b,ia32_badarg
204 .previous 206 .previous
205 GET_THREAD_INFO(%r10) 207 GET_THREAD_INFO(%r10)
208 orl $TS_COMPAT,threadinfo_status(%r10)
206 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10) 209 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)
207 CFI_REMEMBER_STATE 210 CFI_REMEMBER_STATE
208 jnz cstar_tracesys 211 jnz cstar_tracesys
@@ -216,6 +219,7 @@ cstar_do_call:
216 cli 219 cli
217 testl $_TIF_ALLWORK_MASK,threadinfo_flags(%r10) 220 testl $_TIF_ALLWORK_MASK,threadinfo_flags(%r10)
218 jnz int_ret_from_sys_call 221 jnz int_ret_from_sys_call
222 andl $~TS_COMPAT,threadinfo_status(%r10)
219 RESTORE_ARGS 1,-ARG_SKIP,1,1,1 223 RESTORE_ARGS 1,-ARG_SKIP,1,1,1
220 movl RIP-ARGOFFSET(%rsp),%ecx 224 movl RIP-ARGOFFSET(%rsp),%ecx
221 CFI_REGISTER rip,rcx 225 CFI_REGISTER rip,rcx
@@ -288,6 +292,7 @@ ENTRY(ia32_syscall)
288 this could be a problem. */ 292 this could be a problem. */
289 SAVE_ARGS 0,0,1 293 SAVE_ARGS 0,0,1
290 GET_THREAD_INFO(%r10) 294 GET_THREAD_INFO(%r10)
295 orl $TS_COMPAT,threadinfo_status(%r10)
291 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10) 296 testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)
292 jnz ia32_tracesys 297 jnz ia32_tracesys
293ia32_do_syscall: 298ia32_do_syscall:
diff --git a/arch/x86_64/kernel/asm-offsets.c b/arch/x86_64/kernel/asm-offsets.c
index 00a08d13230a..cfb4f9cebea4 100644
--- a/arch/x86_64/kernel/asm-offsets.c
+++ b/arch/x86_64/kernel/asm-offsets.c
@@ -33,6 +33,7 @@ int main(void)
33 ENTRY(flags); 33 ENTRY(flags);
34 ENTRY(addr_limit); 34 ENTRY(addr_limit);
35 ENTRY(preempt_count); 35 ENTRY(preempt_count);
36 ENTRY(status);
36 BLANK(); 37 BLANK();
37#undef ENTRY 38#undef ENTRY
38#define ENTRY(entry) DEFINE(pda_ ## entry, offsetof(struct x8664_pda, entry)) 39#define ENTRY(entry) DEFINE(pda_ ## entry, offsetof(struct x8664_pda, entry))
diff --git a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S
index 45e0ab8a1fca..300555bc56b3 100644
--- a/arch/x86_64/kernel/entry.S
+++ b/arch/x86_64/kernel/entry.S
@@ -313,6 +313,7 @@ int_with_check:
313 movl threadinfo_flags(%rcx),%edx 313 movl threadinfo_flags(%rcx),%edx
314 andl %edi,%edx 314 andl %edi,%edx
315 jnz int_careful 315 jnz int_careful
316 andl $~TS_COMPAT,threadinfo_status(%rcx)
316 jmp retint_swapgs 317 jmp retint_swapgs
317 318
318 /* Either reschedule or signal or syscall exit tracking needed. */ 319 /* Either reschedule or signal or syscall exit tracking needed. */
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index f7490a015d18..362b33556b1a 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -154,8 +154,10 @@ struct input_event_compat {
154 __s32 value; 154 __s32 value;
155}; 155};
156 156
157/* Note to the author of this code: did it ever occur to
158 you why the ifdefs are needed? Think about it again. -AK */
157#ifdef CONFIG_X86_64 159#ifdef CONFIG_X86_64
158# define COMPAT_TEST test_thread_flag(TIF_IA32) 160# define COMPAT_TEST is_compat_task()
159#elif defined(CONFIG_IA64) 161#elif defined(CONFIG_IA64)
160# define COMPAT_TEST IS_IA32_PROCESS(ia64_task_regs(current)) 162# define COMPAT_TEST IS_IA32_PROCESS(ia64_task_regs(current))
161#elif defined(CONFIG_S390) 163#elif defined(CONFIG_S390)
diff --git a/include/asm-x86_64/compat.h b/include/asm-x86_64/compat.h
index f0155c38f639..3863a7da372b 100644
--- a/include/asm-x86_64/compat.h
+++ b/include/asm-x86_64/compat.h
@@ -202,4 +202,9 @@ static __inline__ void __user *compat_alloc_user_space(long len)
202 return (void __user *)regs->rsp - len; 202 return (void __user *)regs->rsp - len;
203} 203}
204 204
205static inline int is_compat_task(void)
206{
207 return current_thread_info()->status & TS_COMPAT;
208}
209
205#endif /* _ASM_X86_64_COMPAT_H */ 210#endif /* _ASM_X86_64_COMPAT_H */
diff --git a/include/asm-x86_64/thread_info.h b/include/asm-x86_64/thread_info.h
index 08eb6e4f3737..eb7c5fda1870 100644
--- a/include/asm-x86_64/thread_info.h
+++ b/include/asm-x86_64/thread_info.h
@@ -138,6 +138,7 @@ static inline struct thread_info *stack_thread_info(void)
138 * have to worry about atomic accesses. 138 * have to worry about atomic accesses.
139 */ 139 */
140#define TS_USEDFPU 0x0001 /* FPU was used by this task this quantum (SMP) */ 140#define TS_USEDFPU 0x0001 /* FPU was used by this task this quantum (SMP) */
141#define TS_COMPAT 0x0002 /* 32bit syscall active */
141 142
142#endif /* __KERNEL__ */ 143#endif /* __KERNEL__ */
143 144