aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/ptrace.c
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2009-09-23 17:08:43 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2009-09-23 17:08:43 -0400
commitd7a4b414eed51f1653bb05ebe84122bf9a7ae18b (patch)
treebd6603a0c27de4c138a1767871897e9cd3e1a1d2 /arch/x86/kernel/ptrace.c
parent1f0ab40976460bc4673fa204ce917a725185d8f2 (diff)
parenta724eada8c2a7b62463b73ccf73fd0bb6e928aeb (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.c21
1 files changed, 8 insertions, 13 deletions
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index caffb680945..c4f76d275ee 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):