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