xref: /OK3568_Linux_fs/kernel/arch/riscv/include/asm/ptrace.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2012 Regents of the University of California
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef _ASM_RISCV_PTRACE_H
7*4882a593Smuzhiyun #define _ASM_RISCV_PTRACE_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <uapi/asm/ptrace.h>
10*4882a593Smuzhiyun #include <asm/csr.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef __ASSEMBLY__
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun struct pt_regs {
15*4882a593Smuzhiyun 	unsigned long epc;
16*4882a593Smuzhiyun 	unsigned long ra;
17*4882a593Smuzhiyun 	unsigned long sp;
18*4882a593Smuzhiyun 	unsigned long gp;
19*4882a593Smuzhiyun 	unsigned long tp;
20*4882a593Smuzhiyun 	unsigned long t0;
21*4882a593Smuzhiyun 	unsigned long t1;
22*4882a593Smuzhiyun 	unsigned long t2;
23*4882a593Smuzhiyun 	unsigned long s0;
24*4882a593Smuzhiyun 	unsigned long s1;
25*4882a593Smuzhiyun 	unsigned long a0;
26*4882a593Smuzhiyun 	unsigned long a1;
27*4882a593Smuzhiyun 	unsigned long a2;
28*4882a593Smuzhiyun 	unsigned long a3;
29*4882a593Smuzhiyun 	unsigned long a4;
30*4882a593Smuzhiyun 	unsigned long a5;
31*4882a593Smuzhiyun 	unsigned long a6;
32*4882a593Smuzhiyun 	unsigned long a7;
33*4882a593Smuzhiyun 	unsigned long s2;
34*4882a593Smuzhiyun 	unsigned long s3;
35*4882a593Smuzhiyun 	unsigned long s4;
36*4882a593Smuzhiyun 	unsigned long s5;
37*4882a593Smuzhiyun 	unsigned long s6;
38*4882a593Smuzhiyun 	unsigned long s7;
39*4882a593Smuzhiyun 	unsigned long s8;
40*4882a593Smuzhiyun 	unsigned long s9;
41*4882a593Smuzhiyun 	unsigned long s10;
42*4882a593Smuzhiyun 	unsigned long s11;
43*4882a593Smuzhiyun 	unsigned long t3;
44*4882a593Smuzhiyun 	unsigned long t4;
45*4882a593Smuzhiyun 	unsigned long t5;
46*4882a593Smuzhiyun 	unsigned long t6;
47*4882a593Smuzhiyun 	/* Supervisor/Machine CSRs */
48*4882a593Smuzhiyun 	unsigned long status;
49*4882a593Smuzhiyun 	unsigned long badaddr;
50*4882a593Smuzhiyun 	unsigned long cause;
51*4882a593Smuzhiyun 	/* a0 value before the syscall */
52*4882a593Smuzhiyun 	unsigned long orig_a0;
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #ifdef CONFIG_64BIT
56*4882a593Smuzhiyun #define REG_FMT "%016lx"
57*4882a593Smuzhiyun #else
58*4882a593Smuzhiyun #define REG_FMT "%08lx"
59*4882a593Smuzhiyun #endif
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define user_mode(regs) (((regs)->status & SR_PP) == 0)
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /* Helpers for working with the instruction pointer */
instruction_pointer(struct pt_regs * regs)65*4882a593Smuzhiyun static inline unsigned long instruction_pointer(struct pt_regs *regs)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun 	return regs->epc;
68*4882a593Smuzhiyun }
instruction_pointer_set(struct pt_regs * regs,unsigned long val)69*4882a593Smuzhiyun static inline void instruction_pointer_set(struct pt_regs *regs,
70*4882a593Smuzhiyun 					   unsigned long val)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	regs->epc = val;
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define profile_pc(regs) instruction_pointer(regs)
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun /* Helpers for working with the user stack pointer */
user_stack_pointer(struct pt_regs * regs)78*4882a593Smuzhiyun static inline unsigned long user_stack_pointer(struct pt_regs *regs)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun 	return regs->sp;
81*4882a593Smuzhiyun }
user_stack_pointer_set(struct pt_regs * regs,unsigned long val)82*4882a593Smuzhiyun static inline void user_stack_pointer_set(struct pt_regs *regs,
83*4882a593Smuzhiyun 					  unsigned long val)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	regs->sp =  val;
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /* Helpers for working with the frame pointer */
frame_pointer(struct pt_regs * regs)89*4882a593Smuzhiyun static inline unsigned long frame_pointer(struct pt_regs *regs)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	return regs->s0;
92*4882a593Smuzhiyun }
frame_pointer_set(struct pt_regs * regs,unsigned long val)93*4882a593Smuzhiyun static inline void frame_pointer_set(struct pt_regs *regs,
94*4882a593Smuzhiyun 				     unsigned long val)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	regs->s0 = val;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
regs_return_value(struct pt_regs * regs)99*4882a593Smuzhiyun static inline unsigned long regs_return_value(struct pt_regs *regs)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	return regs->a0;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun #endif /* _ASM_RISCV_PTRACE_H */
107