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 in_syscall(struct pt_regs const * regs)52static inline bool in_syscall(struct pt_regs const *regs) 53 { 54 return regs->syscallno != NO_SYSCALL; 55 } 56 forget_syscall(struct pt_regs * regs)57static inline void forget_syscall(struct pt_regs *regs) 58 { 59 regs->syscallno = NO_SYSCALL; 60 } regs_return_value(struct pt_regs * regs)61static 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 78