f4625ee0e4
We could use regs->sr 16-24 bits to detect syscall: VEC_TRAP0 and r11_sig is no necessary for current implementation. In this patch, we implement the in_syscall and forget_syscall which are inspired from arm & nds32, but csky pt_regs has no syscall_num element and we just set zero to regs->sr's vector-bits-field instead. For ret_from_fork, current task was forked from parent which is in syscall progress and its regs->sr has been already setted with VEC_TRAP0. See: arch/csky/kernel/process.c: copy_thread() Signed-off-by: Guo Ren <ren_guo@c-sky.com>
42 lines
986 B
C
42 lines
986 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
|
|
|
|
#ifndef __ASM_CSKY_PTRACE_H
|
|
#define __ASM_CSKY_PTRACE_H
|
|
|
|
#include <uapi/asm/ptrace.h>
|
|
#include <asm/traps.h>
|
|
#include <linux/types.h>
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#define PS_S 0x80000000 /* Supervisor Mode */
|
|
|
|
#define arch_has_single_step() (1)
|
|
#define current_pt_regs() \
|
|
({ (struct pt_regs *)((char *)current_thread_info() + THREAD_SIZE) - 1; })
|
|
|
|
#define user_stack_pointer(regs) ((regs)->usp)
|
|
|
|
#define user_mode(regs) (!((regs)->sr & PS_S))
|
|
#define instruction_pointer(regs) ((regs)->pc)
|
|
#define profile_pc(regs) instruction_pointer(regs)
|
|
|
|
static inline bool in_syscall(struct pt_regs const *regs)
|
|
{
|
|
return ((regs->sr >> 16) & 0xff) == VEC_TRAP0;
|
|
}
|
|
|
|
static inline void forget_syscall(struct pt_regs *regs)
|
|
{
|
|
regs->sr &= ~(0xff << 16);
|
|
}
|
|
|
|
static inline unsigned long regs_return_value(struct pt_regs *regs)
|
|
{
|
|
return regs->a0;
|
|
}
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* __ASM_CSKY_PTRACE_H */
|