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