Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / arch / nds32 / include / asm / ptrace.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 // Copyright (C) 2005-2017 Andes Technology Corporation
3
4 #ifndef __ASM_NDS32_PTRACE_H
5 #define __ASM_NDS32_PTRACE_H
6
7 #include <uapi/asm/ptrace.h>
8
9 /*
10  * If pt_regs.syscallno == NO_SYSCALL, then the thread is not executing
11  * a syscall -- i.e., its most recent entry into the kernel from
12  * userspace was not via syscall, or otherwise a tracer cancelled the
13  * syscall.
14  *
15  * This must have the value -1, for ABI compatibility with ptrace etc.
16  */
17 #define NO_SYSCALL (-1)
18 #ifndef __ASSEMBLY__
19 #include <linux/types.h>
20
21 struct pt_regs {
22         union {
23                 struct user_pt_regs user_regs;
24                 struct {
25                         long uregs[26];
26                         long fp;
27                         long gp;
28                         long lp;
29                         long sp;
30                         long ipc;
31 #if defined(CONFIG_HWZOL)
32                         long lb;
33                         long le;
34                         long lc;
35 #else
36                         long dummy[3];
37 #endif
38                         long syscallno;
39                 };
40         };
41         long orig_r0;
42         long ir0;
43         long ipsw;
44         long pipsw;
45         long pipc;
46         long pp0;
47         long pp1;
48         long fucop_ctl;
49         long osp;
50 };
51
52 static inline bool in_syscall(struct pt_regs const *regs)
53 {
54         return regs->syscallno != NO_SYSCALL;
55 }
56
57 static inline void forget_syscall(struct pt_regs *regs)
58 {
59         regs->syscallno = NO_SYSCALL;
60 }
61 static inline unsigned long regs_return_value(struct pt_regs *regs)
62 {
63         return regs->uregs[0];
64 }
65 extern void show_regs(struct pt_regs *);
66 /* Avoid circular header include via sched.h */
67 struct task_struct;
68
69 #define arch_has_single_step()          (1)
70 #define user_mode(regs)                 (((regs)->ipsw & PSW_mskPOM) == 0)
71 #define interrupts_enabled(regs)        (!!((regs)->ipsw & PSW_mskGIE))
72 #define user_stack_pointer(regs)        ((regs)->sp)
73 #define instruction_pointer(regs)       ((regs)->ipc)
74 #define profile_pc(regs)                instruction_pointer(regs)
75
76 #endif /* __ASSEMBLY__ */
77 #endif