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 <linux/err.h> 13 #include <linux/sched.h> 14 #include <asm/unistd.h> 15 #include <asm/ptrace.h> /* in_syscall() */ 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 int i, unsigned int n, unsigned long *args) 59 { 60 unsigned long *inside_ptregs = &(regs->r0); 61 inside_ptregs -= i; 62 63 BUG_ON((i + n) > 6); 64 65 while (n--) { 66 args[i++] = (*inside_ptregs); 67 inside_ptregs--; 68 } 69 } 70 71 #endif 72