diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /arch/sh/kernel/ptrace_64.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'arch/sh/kernel/ptrace_64.c')
-rw-r--r-- | arch/sh/kernel/ptrace_64.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/arch/sh/kernel/ptrace_64.c b/arch/sh/kernel/ptrace_64.c index 952da83903da..5fd644da7f02 100644 --- a/arch/sh/kernel/ptrace_64.c +++ b/arch/sh/kernel/ptrace_64.c | |||
@@ -82,13 +82,13 @@ get_fpu_long(struct task_struct *task, unsigned long addr) | |||
82 | 82 | ||
83 | if (last_task_used_math == task) { | 83 | if (last_task_used_math == task) { |
84 | enable_fpu(); | 84 | enable_fpu(); |
85 | save_fpu(task, regs); | 85 | save_fpu(task); |
86 | disable_fpu(); | 86 | disable_fpu(); |
87 | last_task_used_math = 0; | 87 | last_task_used_math = 0; |
88 | regs->sr |= SR_FD; | 88 | regs->sr |= SR_FD; |
89 | } | 89 | } |
90 | 90 | ||
91 | tmp = ((long *)&task->thread.fpu)[addr / sizeof(unsigned long)]; | 91 | tmp = ((long *)task->thread.xstate)[addr / sizeof(unsigned long)]; |
92 | return tmp; | 92 | return tmp; |
93 | } | 93 | } |
94 | 94 | ||
@@ -114,17 +114,16 @@ put_fpu_long(struct task_struct *task, unsigned long addr, unsigned long data) | |||
114 | regs = (struct pt_regs*)((unsigned char *)task + THREAD_SIZE) - 1; | 114 | regs = (struct pt_regs*)((unsigned char *)task + THREAD_SIZE) - 1; |
115 | 115 | ||
116 | if (!tsk_used_math(task)) { | 116 | if (!tsk_used_math(task)) { |
117 | fpinit(&task->thread.fpu.hard); | 117 | init_fpu(task); |
118 | set_stopped_child_used_math(task); | ||
119 | } else if (last_task_used_math == task) { | 118 | } else if (last_task_used_math == task) { |
120 | enable_fpu(); | 119 | enable_fpu(); |
121 | save_fpu(task, regs); | 120 | save_fpu(task); |
122 | disable_fpu(); | 121 | disable_fpu(); |
123 | last_task_used_math = 0; | 122 | last_task_used_math = 0; |
124 | regs->sr |= SR_FD; | 123 | regs->sr |= SR_FD; |
125 | } | 124 | } |
126 | 125 | ||
127 | ((long *)&task->thread.fpu)[addr / sizeof(unsigned long)] = data; | 126 | ((long *)task->thread.xstate)[addr / sizeof(unsigned long)] = data; |
128 | return 0; | 127 | return 0; |
129 | } | 128 | } |
130 | 129 | ||
@@ -133,6 +132,8 @@ void user_enable_single_step(struct task_struct *child) | |||
133 | struct pt_regs *regs = child->thread.uregs; | 132 | struct pt_regs *regs = child->thread.uregs; |
134 | 133 | ||
135 | regs->sr |= SR_SSTEP; /* auto-resetting upon exception */ | 134 | regs->sr |= SR_SSTEP; /* auto-resetting upon exception */ |
135 | |||
136 | set_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
136 | } | 137 | } |
137 | 138 | ||
138 | void user_disable_single_step(struct task_struct *child) | 139 | void user_disable_single_step(struct task_struct *child) |
@@ -140,6 +141,8 @@ void user_disable_single_step(struct task_struct *child) | |||
140 | struct pt_regs *regs = child->thread.uregs; | 141 | struct pt_regs *regs = child->thread.uregs; |
141 | 142 | ||
142 | regs->sr &= ~SR_SSTEP; | 143 | regs->sr &= ~SR_SSTEP; |
144 | |||
145 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
143 | } | 146 | } |
144 | 147 | ||
145 | static int genregs_get(struct task_struct *target, | 148 | static int genregs_get(struct task_struct *target, |
@@ -222,7 +225,7 @@ int fpregs_get(struct task_struct *target, | |||
222 | return ret; | 225 | return ret; |
223 | 226 | ||
224 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, | 227 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, |
225 | &target->thread.fpu.hard, 0, -1); | 228 | &target->thread.xstate->hardfpu, 0, -1); |
226 | } | 229 | } |
227 | 230 | ||
228 | static int fpregs_set(struct task_struct *target, | 231 | static int fpregs_set(struct task_struct *target, |
@@ -239,7 +242,7 @@ static int fpregs_set(struct task_struct *target, | |||
239 | set_stopped_child_used_math(target); | 242 | set_stopped_child_used_math(target); |
240 | 243 | ||
241 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, | 244 | return user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
242 | &target->thread.fpu.hard, 0, -1); | 245 | &target->thread.xstate->hardfpu, 0, -1); |
243 | } | 246 | } |
244 | 247 | ||
245 | static int fpregs_active(struct task_struct *target, | 248 | static int fpregs_active(struct task_struct *target, |
@@ -454,6 +457,8 @@ asmlinkage long long do_syscall_trace_enter(struct pt_regs *regs) | |||
454 | 457 | ||
455 | asmlinkage void do_syscall_trace_leave(struct pt_regs *regs) | 458 | asmlinkage void do_syscall_trace_leave(struct pt_regs *regs) |
456 | { | 459 | { |
460 | int step; | ||
461 | |||
457 | if (unlikely(current->audit_context)) | 462 | if (unlikely(current->audit_context)) |
458 | audit_syscall_exit(AUDITSC_RESULT(regs->regs[9]), | 463 | audit_syscall_exit(AUDITSC_RESULT(regs->regs[9]), |
459 | regs->regs[9]); | 464 | regs->regs[9]); |
@@ -461,8 +466,9 @@ asmlinkage void do_syscall_trace_leave(struct pt_regs *regs) | |||
461 | if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) | 466 | if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) |
462 | trace_sys_exit(regs, regs->regs[9]); | 467 | trace_sys_exit(regs, regs->regs[9]); |
463 | 468 | ||
464 | if (test_thread_flag(TIF_SYSCALL_TRACE)) | 469 | step = test_thread_flag(TIF_SINGLESTEP); |
465 | tracehook_report_syscall_exit(regs, 0); | 470 | if (step || test_thread_flag(TIF_SYSCALL_TRACE)) |
471 | tracehook_report_syscall_exit(regs, step); | ||
466 | } | 472 | } |
467 | 473 | ||
468 | /* Called with interrupts disabled */ | 474 | /* Called with interrupts disabled */ |
@@ -479,9 +485,10 @@ asmlinkage void do_single_step(unsigned long long vec, struct pt_regs *regs) | |||
479 | } | 485 | } |
480 | 486 | ||
481 | /* Called with interrupts disabled */ | 487 | /* Called with interrupts disabled */ |
482 | asmlinkage void do_software_break_point(unsigned long long vec, | 488 | BUILD_TRAP_HANDLER(breakpoint) |
483 | struct pt_regs *regs) | ||
484 | { | 489 | { |
490 | TRAP_HANDLER_DECL; | ||
491 | |||
485 | /* We need to forward step the PC, to counteract the backstep done | 492 | /* We need to forward step the PC, to counteract the backstep done |
486 | in signal.c. */ | 493 | in signal.c. */ |
487 | local_irq_enable(); | 494 | local_irq_enable(); |