1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 4 */ 5 6 #ifndef _ASM_ARC_SYSCALL_H 7 #define _ASM_ARC_SYSCALL_H 1 8 9 #include <uapi/linux/audit.h> 10 #include <linux/err.h> 11 #include <linux/sched.h> 12 #include <asm/unistd.h> 13 #include <asm/ptrace.h> /* in_syscall() */ 14 15 static inline long 16 syscall_get_nr(struct task_struct *task, struct pt_regs *regs) 17 { 18 if (user_mode(regs) && in_syscall(regs)) 19 return regs->r8; 20 else 21 return -1; 22 } 23 24 static inline void 25 syscall_rollback(struct task_struct *task, struct pt_regs *regs) 26 { 27 regs->r0 = regs->orig_r0; 28 } 29 30 static inline long 31 syscall_get_error(struct task_struct *task, struct pt_regs *regs) 32 { 33 /* 0 if syscall succeeded, otherwise -Errorcode */ 34 return IS_ERR_VALUE(regs->r0) ? regs->r0 : 0; 35 } 36 37 static inline long 38 syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) 39 { 40 return regs->r0; 41 } 42 43 static inline void 44 syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, 45 int error, long val) 46 { 47 regs->r0 = (long) error ?: val; 48 } 49 50 /* 51 * @i: argument index [0,5] 52 * @n: number of arguments; n+i must be [1,6]. 53 */ 54 static inline void 55 syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, 56 unsigned long *args) 57 { 58 unsigned long *inside_ptregs = &(regs->r0); 59 unsigned int n = 6; 60 unsigned int i = 0; 61 62 while (n--) { 63 args[i++] = (*inside_ptregs); 64 inside_ptregs--; 65 } 66 } 67 68 static inline int 69 syscall_get_arch(struct task_struct *task) 70 { 71 return IS_ENABLED(CONFIG_ISA_ARCOMPACT) 72 ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) 73 ? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT) 74 : (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) 75 ? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2); 76 } 77 78 #endif 79