diff options
Diffstat (limited to 'arch/sh/kernel/ptrace_64.c')
-rw-r--r-- | arch/sh/kernel/ptrace_64.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/arch/sh/kernel/ptrace_64.c b/arch/sh/kernel/ptrace_64.c index 873ebdc4f98e..5fd644da7f02 100644 --- a/arch/sh/kernel/ptrace_64.c +++ b/arch/sh/kernel/ptrace_64.c | |||
@@ -88,7 +88,7 @@ get_fpu_long(struct task_struct *task, unsigned long addr) | |||
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,8 +114,7 @@ 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); | 120 | save_fpu(task); |
@@ -124,7 +123,7 @@ put_fpu_long(struct task_struct *task, unsigned long addr, unsigned long data) | |||
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(); |