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 extern void *sys_call_table[]; 16 17 static inline long 18 syscall_get_nr(struct task_struct *task, struct pt_regs *regs) 19 { 20 if (user_mode(regs) && in_syscall(regs)) 21 return regs->r8; 22 else 23 return -1; 24 } 25 26 static inline void 27 syscall_rollback(struct task_struct *task, struct pt_regs *regs) 28 { 29 regs->r0 = regs->orig_r0; 30 } 31 32 static inline long 33 syscall_get_error(struct task_struct *task, struct pt_regs *regs) 34 { 35 /* 0 if syscall succeeded, otherwise -Errorcode */ 36 return IS_ERR_VALUE(regs->r0) ? regs->r0 : 0; 37 } 38 39 static inline long 40 syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) 41 { 42 return regs->r0; 43 } 44 45 static inline void 46 syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, 47 int error, long val) 48 { 49 regs->r0 = (long) error ?: val; 50 } 51 52 /* 53 * @i: argument index [0,5] 54 * @n: number of arguments; n+i must be [1,6]. 55 */ 56 static inline void 57 syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, 58 unsigned long *args) 59 { 60 unsigned long *inside_ptregs = &(regs->r0); 61 unsigned int n = 6; 62 unsigned int i = 0; 63 64 while (n--) { 65 args[i++] = (*inside_ptregs); 66 inside_ptregs--; 67 } 68 } 69 70 static inline int 71 syscall_get_arch(struct task_struct *task) 72 { 73 return IS_ENABLED(CONFIG_ISA_ARCOMPACT) 74 ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) 75 ? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT) 76 : (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) 77 ? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2); 78 } 79 80 #endif 81