1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2fb4f87a2SPaul Mundt #ifndef __ASM_SH_SYSCALL_32_H
3fb4f87a2SPaul Mundt #define __ASM_SH_SYSCALL_32_H
4fb4f87a2SPaul Mundt
537d181bbSEric Paris #include <uapi/linux/audit.h>
6fb4f87a2SPaul Mundt #include <linux/kernel.h>
7fb4f87a2SPaul Mundt #include <linux/sched.h>
834e19adaSMatt Fleming #include <linux/err.h>
9fb4f87a2SPaul Mundt #include <asm/ptrace.h>
10fb4f87a2SPaul Mundt
11f15b2dc0SPaul Mundt /* The system call number is given by the user in R3 */
syscall_get_nr(struct task_struct * task,struct pt_regs * regs)12fb4f87a2SPaul Mundt static inline long syscall_get_nr(struct task_struct *task,
13fb4f87a2SPaul Mundt struct pt_regs *regs)
14fb4f87a2SPaul Mundt {
15fb4f87a2SPaul Mundt return (regs->tra >= 0) ? regs->regs[3] : -1L;
16fb4f87a2SPaul Mundt }
17fb4f87a2SPaul Mundt
syscall_rollback(struct task_struct * task,struct pt_regs * regs)18fb4f87a2SPaul Mundt static inline void syscall_rollback(struct task_struct *task,
19fb4f87a2SPaul Mundt struct pt_regs *regs)
20fb4f87a2SPaul Mundt {
21fb4f87a2SPaul Mundt /*
22fb4f87a2SPaul Mundt * XXX: This needs some thought. On SH we don't
23fb4f87a2SPaul Mundt * save away the original r0 value anywhere.
24fb4f87a2SPaul Mundt */
25fb4f87a2SPaul Mundt }
26fb4f87a2SPaul Mundt
syscall_get_error(struct task_struct * task,struct pt_regs * regs)27fb4f87a2SPaul Mundt static inline long syscall_get_error(struct task_struct *task,
28fb4f87a2SPaul Mundt struct pt_regs *regs)
29fb4f87a2SPaul Mundt {
3003f07876SPaul Mundt return IS_ERR_VALUE(regs->regs[0]) ? regs->regs[0] : 0;
31fb4f87a2SPaul Mundt }
32fb4f87a2SPaul Mundt
syscall_get_return_value(struct task_struct * task,struct pt_regs * regs)33fb4f87a2SPaul Mundt static inline long syscall_get_return_value(struct task_struct *task,
34fb4f87a2SPaul Mundt struct pt_regs *regs)
35fb4f87a2SPaul Mundt {
36fb4f87a2SPaul Mundt return regs->regs[0];
37fb4f87a2SPaul Mundt }
38fb4f87a2SPaul Mundt
syscall_set_return_value(struct task_struct * task,struct pt_regs * regs,int error,long val)39fb4f87a2SPaul Mundt static inline void syscall_set_return_value(struct task_struct *task,
40fb4f87a2SPaul Mundt struct pt_regs *regs,
41fb4f87a2SPaul Mundt int error, long val)
42fb4f87a2SPaul Mundt {
43*03dd061fSMichael Karcher regs->regs[0] = (long) error ?: val;
44fb4f87a2SPaul Mundt }
45fb4f87a2SPaul Mundt
syscall_get_arguments(struct task_struct * task,struct pt_regs * regs,unsigned long * args)46fb4f87a2SPaul Mundt static inline void syscall_get_arguments(struct task_struct *task,
47fb4f87a2SPaul Mundt struct pt_regs *regs,
48fb4f87a2SPaul Mundt unsigned long *args)
49fb4f87a2SPaul Mundt {
50fb4f87a2SPaul Mundt
51fb4f87a2SPaul Mundt /* Argument pattern is: R4, R5, R6, R7, R0, R1 */
52b35f549dSSteven Rostedt (Red Hat) args[5] = regs->regs[1];
53b35f549dSSteven Rostedt (Red Hat) args[4] = regs->regs[0];
54b35f549dSSteven Rostedt (Red Hat) args[3] = regs->regs[7];
55b35f549dSSteven Rostedt (Red Hat) args[2] = regs->regs[6];
56b35f549dSSteven Rostedt (Red Hat) args[1] = regs->regs[5];
57b35f549dSSteven Rostedt (Red Hat) args[0] = regs->regs[4];
58fb4f87a2SPaul Mundt }
59fb4f87a2SPaul Mundt
syscall_get_arch(struct task_struct * task)6016add411SDmitry V. Levin static inline int syscall_get_arch(struct task_struct *task)
6137d181bbSEric Paris {
6237d181bbSEric Paris int arch = AUDIT_ARCH_SH;
6337d181bbSEric Paris
6437d181bbSEric Paris #ifdef CONFIG_CPU_LITTLE_ENDIAN
6537d181bbSEric Paris arch |= __AUDIT_ARCH_LE;
6637d181bbSEric Paris #endif
6737d181bbSEric Paris return arch;
6837d181bbSEric Paris }
69fb4f87a2SPaul Mundt #endif /* __ASM_SH_SYSCALL_32_H */
70