2 * arch/sh/kernel/ptrace_64.c
4 * Copyright (C) 2000, 2001 Paolo Alberelli
5 * Copyright (C) 2003 - 2007 Paul Mundt
7 * Started from SH3/4 version:
8 * SuperH version: Copyright (C) 1999, 2000 Kaz Kojima & Niibe Yutaka
10 * Original x86 implementation:
11 * By Ross Biro 1/23/92
12 * edited by Linus Torvalds
14 * This file is subject to the terms and conditions of the GNU General Public
15 * License. See the file "COPYING" in the main directory of this archive
18 #include <linux/kernel.h>
19 #include <linux/rwsem.h>
20 #include <linux/sched.h>
22 #include <linux/smp.h>
23 #include <linux/smp_lock.h>
24 #include <linux/errno.h>
25 #include <linux/ptrace.h>
26 #include <linux/user.h>
27 #include <linux/signal.h>
28 #include <linux/syscalls.h>
29 #include <linux/audit.h>
30 #include <linux/seccomp.h>
31 #include <linux/tracehook.h>
33 #include <asm/uaccess.h>
34 #include <asm/pgtable.h>
35 #include <asm/system.h>
36 #include <asm/processor.h>
37 #include <asm/mmu_context.h>
38 #include <asm/syscalls.h>
41 /* This mask defines the bits of the SR which the user is not allowed to
42 change, which are everything except S, Q, M, PR, SZ, FR. */
43 #define SR_MASK (0xffff8cfd)
46 * does not yet catch signals sent when the child dies.
47 * in exit.c or in signal.c.
51 * This routine will get a word from the user area in the process kernel stack.
53 static inline int get_stack_long(struct task_struct
*task
, int offset
)
57 stack
= (unsigned char *)(task
->thread
.uregs
);
59 return (*((int *)stack
));
62 static inline unsigned long
63 get_fpu_long(struct task_struct
*task
, unsigned long addr
)
67 regs
= (struct pt_regs
*)((unsigned char *)task
+ THREAD_SIZE
) - 1;
69 if (!tsk_used_math(task
)) {
70 if (addr
== offsetof(struct user_fpu_struct
, fpscr
)) {
73 tmp
= 0xffffffffUL
; /* matches initial value in fpu.c */
78 if (last_task_used_math
== task
) {
82 last_task_used_math
= 0;
86 tmp
= ((long *)&task
->thread
.fpu
)[addr
/ sizeof(unsigned long)];
91 * This routine will put a word into the user area in the process kernel stack.
93 static inline int put_stack_long(struct task_struct
*task
, int offset
,
98 stack
= (unsigned char *)(task
->thread
.uregs
);
100 *(unsigned long *) stack
= data
;
105 put_fpu_long(struct task_struct
*task
, unsigned long addr
, unsigned long data
)
107 struct pt_regs
*regs
;
109 regs
= (struct pt_regs
*)((unsigned char *)task
+ THREAD_SIZE
) - 1;
111 if (!tsk_used_math(task
)) {
112 fpinit(&task
->thread
.fpu
.hard
);
113 set_stopped_child_used_math(task
);
114 } else if (last_task_used_math
== task
) {
116 save_fpu(task
, regs
);
118 last_task_used_math
= 0;
122 ((long *)&task
->thread
.fpu
)[addr
/ sizeof(unsigned long)] = data
;
126 void user_enable_single_step(struct task_struct
*child
)
128 struct pt_regs
*regs
= child
->thread
.uregs
;
130 regs
->sr
|= SR_SSTEP
; /* auto-resetting upon exception */
133 void user_disable_single_step(struct task_struct
*child
)
135 struct pt_regs
*regs
= child
->thread
.uregs
;
137 regs
->sr
&= ~SR_SSTEP
;
140 long arch_ptrace(struct task_struct
*child
, long request
, long addr
, long data
)
145 /* read the word at location addr in the USER area. */
146 case PTRACE_PEEKUSR
: {
150 if ((addr
& 3) || addr
< 0)
153 if (addr
< sizeof(struct pt_regs
))
154 tmp
= get_stack_long(child
, addr
);
155 else if ((addr
>= offsetof(struct user
, fpu
)) &&
156 (addr
< offsetof(struct user
, u_fpvalid
))) {
157 tmp
= get_fpu_long(child
, addr
- offsetof(struct user
, fpu
));
158 } else if (addr
== offsetof(struct user
, u_fpvalid
)) {
159 tmp
= !!tsk_used_math(child
);
163 ret
= put_user(tmp
, (unsigned long *)data
);
168 /* write the word at location addr in the USER area. We must
169 disallow any changes to certain SR bits or u_fpvalid, since
170 this could crash the kernel or result in a security
173 if ((addr
& 3) || addr
< 0)
176 if (addr
< sizeof(struct pt_regs
)) {
177 /* Ignore change of top 32 bits of SR */
178 if (addr
== offsetof (struct pt_regs
, sr
)+4)
183 /* If lower 32 bits of SR, ignore non-user bits */
184 if (addr
== offsetof (struct pt_regs
, sr
))
186 long cursr
= get_stack_long(child
, addr
);
188 data
|= (cursr
& SR_MASK
);
190 ret
= put_stack_long(child
, addr
, data
);
192 else if ((addr
>= offsetof(struct user
, fpu
)) &&
193 (addr
< offsetof(struct user
, u_fpvalid
))) {
194 ret
= put_fpu_long(child
, addr
- offsetof(struct user
, fpu
), data
);
199 ret
= ptrace_request(child
, request
, addr
, data
);
205 asmlinkage
int sh64_ptrace(long request
, long pid
, long addr
, long data
)
207 #define WPC_DBRMODE 0x0d104008
208 static int first_call
= 1;
212 /* Set WPC.DBRMODE to 0. This makes all debug events get
213 * delivered through RESVEC, i.e. into the handlers in entry.S.
214 * (If the kernel was downloaded using a remote gdb, WPC.DBRMODE
215 * would normally be left set to 1, which makes debug events get
216 * delivered through DBRVEC, i.e. into the remote gdb's
217 * handlers. This prevents ptrace getting them, and confuses
218 * the remote gdb.) */
219 printk("DBRMODE set to 0 to permit native debugging\n");
220 poke_real_address_q(WPC_DBRMODE
, 0);
225 return sys_ptrace(request
, pid
, addr
, data
);
228 static inline int audit_arch(void)
233 arch
|= __AUDIT_ARCH_64BIT
;
235 #ifdef CONFIG_CPU_LITTLE_ENDIAN
236 arch
|= __AUDIT_ARCH_LE
;
242 asmlinkage
long long do_syscall_trace_enter(struct pt_regs
*regs
)
246 secure_computing(regs
->regs
[9]);
248 if (test_thread_flag(TIF_SYSCALL_TRACE
) &&
249 tracehook_report_syscall_entry(regs
))
251 * Tracing decided this syscall should not happen.
252 * We'll return a bogus call number to get an ENOSYS
253 * error, but leave the original number in regs->regs[0].
257 if (unlikely(current
->audit_context
))
258 audit_syscall_entry(audit_arch(), regs
->regs
[1],
259 regs
->regs
[2], regs
->regs
[3],
260 regs
->regs
[4], regs
->regs
[5]);
262 return ret
?: regs
->regs
[9];
265 asmlinkage
void do_syscall_trace_leave(struct pt_regs
*regs
)
267 if (unlikely(current
->audit_context
))
268 audit_syscall_exit(AUDITSC_RESULT(regs
->regs
[9]),
271 if (test_thread_flag(TIF_SYSCALL_TRACE
))
272 tracehook_report_syscall_exit(regs
, 0);
275 /* Called with interrupts disabled */
276 asmlinkage
void do_single_step(unsigned long long vec
, struct pt_regs
*regs
)
278 /* This is called after a single step exception (DEBUGSS).
279 There is no need to change the PC, as it is a post-execution
280 exception, as entry.S does not do anything to the PC for DEBUGSS.
281 We need to clear the Single Step setting in SR to avoid
282 continually stepping. */
284 regs
->sr
&= ~SR_SSTEP
;
285 force_sig(SIGTRAP
, current
);
288 /* Called with interrupts disabled */
289 asmlinkage
void do_software_break_point(unsigned long long vec
,
290 struct pt_regs
*regs
)
292 /* We need to forward step the PC, to counteract the backstep done
295 force_sig(SIGTRAP
, current
);
300 * Called by kernel/ptrace.c when detaching..
302 * Make sure single step bits etc are not set.
304 void ptrace_disable(struct task_struct
*child
)
306 user_disable_single_step(child
);