xref: /OK3568_Linux_fs/kernel/arch/parisc/include/asm/ptrace.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* written by Philipp Rumpf, Copyright (C) 1999 SuSE GmbH Nuernberg
3*4882a593Smuzhiyun ** Copyright (C) 2000 Grant Grundler, Hewlett-Packard
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun #ifndef _PARISC_PTRACE_H
6*4882a593Smuzhiyun #define _PARISC_PTRACE_H
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <uapi/asm/ptrace.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS))
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define arch_has_single_step()	1
14*4882a593Smuzhiyun #define arch_has_block_step()	1
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* XXX should we use iaoq[1] or iaoq[0] ? */
17*4882a593Smuzhiyun #define user_mode(regs)			(((regs)->iaoq[0] & 3) ? 1 : 0)
18*4882a593Smuzhiyun #define user_space(regs)		(((regs)->iasq[1] != 0) ? 1 : 0)
19*4882a593Smuzhiyun #define instruction_pointer(regs)	((regs)->iaoq[0] & ~3)
20*4882a593Smuzhiyun #define user_stack_pointer(regs)	((regs)->gr[30])
21*4882a593Smuzhiyun unsigned long profile_pc(struct pt_regs *);
22*4882a593Smuzhiyun 
regs_return_value(struct pt_regs * regs)23*4882a593Smuzhiyun static inline unsigned long regs_return_value(struct pt_regs *regs)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun 	return regs->gr[28];
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun 
instruction_pointer_set(struct pt_regs * regs,unsigned long val)28*4882a593Smuzhiyun static inline void instruction_pointer_set(struct pt_regs *regs,
29*4882a593Smuzhiyun 						unsigned long val)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun 	regs->iaoq[0] = val;
32*4882a593Smuzhiyun 	regs->iaoq[1] = val + 4;
33*4882a593Smuzhiyun }
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /* Query offset/name of register from its name/offset */
36*4882a593Smuzhiyun extern int regs_query_register_offset(const char *name);
37*4882a593Smuzhiyun extern const char *regs_query_register_name(unsigned int offset);
38*4882a593Smuzhiyun #define MAX_REG_OFFSET (offsetof(struct pt_regs, ipsw))
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define kernel_stack_pointer(regs) ((regs)->gr[30])
41*4882a593Smuzhiyun 
regs_get_register(struct pt_regs * regs,unsigned int offset)42*4882a593Smuzhiyun static inline unsigned long regs_get_register(struct pt_regs *regs,
43*4882a593Smuzhiyun 					      unsigned int offset)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	if (unlikely(offset > MAX_REG_OFFSET))
46*4882a593Smuzhiyun 		return 0;
47*4882a593Smuzhiyun 	return *(unsigned long *)((unsigned long)regs + offset);
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n);
51*4882a593Smuzhiyun int regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #endif
54