diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2009-09-23 17:08:43 -0400 |
---|---|---|
committer | Frederic Weisbecker <fweisbec@gmail.com> | 2009-09-23 17:08:43 -0400 |
commit | d7a4b414eed51f1653bb05ebe84122bf9a7ae18b (patch) | |
tree | bd6603a0c27de4c138a1767871897e9cd3e1a1d2 /arch/x86/kernel/ptrace.c | |
parent | 1f0ab40976460bc4673fa204ce917a725185d8f2 (diff) | |
parent | a724eada8c2a7b62463b73ccf73fd0bb6e928aeb (diff) |
Merge commit 'linus/master' into tracing/kprobes
Conflicts:
kernel/trace/Makefile
kernel/trace/trace.h
kernel/trace/trace_event_types.h
kernel/trace/trace_export.c
Merge reason:
Sync with latest significant tracing core changes.
Diffstat (limited to 'arch/x86/kernel/ptrace.c')
-rw-r--r-- | arch/x86/kernel/ptrace.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index caffb6809452..c4f76d275ee4 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
@@ -437,16 +437,6 @@ static int putreg(struct task_struct *child, | |||
437 | return set_flags(child, value); | 437 | return set_flags(child, value); |
438 | 438 | ||
439 | #ifdef CONFIG_X86_64 | 439 | #ifdef CONFIG_X86_64 |
440 | /* | ||
441 | * Orig_ax is really just a flag with small positive and | ||
442 | * negative values, so make sure to always sign-extend it | ||
443 | * from 32 bits so that it works correctly regardless of | ||
444 | * whether we come from a 32-bit environment or not. | ||
445 | */ | ||
446 | case offsetof(struct user_regs_struct, orig_ax): | ||
447 | value = (long) (s32) value; | ||
448 | break; | ||
449 | |||
450 | case offsetof(struct user_regs_struct,fs_base): | 440 | case offsetof(struct user_regs_struct,fs_base): |
451 | if (value >= TASK_SIZE_OF(child)) | 441 | if (value >= TASK_SIZE_OF(child)) |
452 | return -EIO; | 442 | return -EIO; |
@@ -1238,10 +1228,15 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 value) | |||
1238 | 1228 | ||
1239 | case offsetof(struct user32, regs.orig_eax): | 1229 | case offsetof(struct user32, regs.orig_eax): |
1240 | /* | 1230 | /* |
1241 | * Sign-extend the value so that orig_eax = -1 | 1231 | * A 32-bit debugger setting orig_eax means to restore |
1242 | * causes (long)orig_ax < 0 tests to fire correctly. | 1232 | * the state of the task restarting a 32-bit syscall. |
1233 | * Make sure we interpret the -ERESTART* codes correctly | ||
1234 | * in case the task is not actually still sitting at the | ||
1235 | * exit from a 32-bit syscall with TS_COMPAT still set. | ||
1243 | */ | 1236 | */ |
1244 | regs->orig_ax = (long) (s32) value; | 1237 | regs->orig_ax = value; |
1238 | if (syscall_get_nr(child, regs) >= 0) | ||
1239 | task_thread_info(child)->status |= TS_COMPAT; | ||
1245 | break; | 1240 | break; |
1246 | 1241 | ||
1247 | case offsetof(struct user32, regs.eflags): | 1242 | case offsetof(struct user32, regs.eflags): |