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
21struct 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
52static inline bool in_syscall(struct pt_regs const *regs)
53{
54	return regs->syscallno != NO_SYSCALL;
55}
56
57static inline void forget_syscall(struct pt_regs *regs)
58{
59	regs->syscallno = NO_SYSCALL;
60}
61static inline unsigned long regs_return_value(struct pt_regs *regs)
62{
63	return regs->uregs[0];
64}
65extern void show_regs(struct pt_regs *);
66/* Avoid circular header include via sched.h */
67struct 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
78