diff options
| author | Andi Kleen <ak@suse.de> | 2006-01-11 16:44:06 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-11 22:04:53 -0500 |
| commit | bf2fcc6fdfe4f4e92bb74f062c0a1be189f3a561 (patch) | |
| tree | 0bcc33f681c7e8ce6596c9323d4a1026ede84994 | |
| parent | 2966387b481a11a90a7bed6600fc17b4253f6980 (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.S | 5 | ||||
| -rw-r--r-- | arch/x86_64/kernel/asm-offsets.c | 1 | ||||
| -rw-r--r-- | arch/x86_64/kernel/entry.S | 1 | ||||
| -rw-r--r-- | drivers/input/evdev.c | 4 | ||||
| -rw-r--r-- | include/asm-x86_64/compat.h | 5 | ||||
| -rw-r--r-- | include/asm-x86_64/thread_info.h | 1 |
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 |
| 293 | ia32_do_syscall: | 298 | ia32_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 | ||
| 205 | static 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 | ||
