at v3.9-rc2 72 lines 1.7 kB view raw
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 17static inline long 18syscall_get_nr(struct task_struct *task, struct pt_regs *regs) 19{ 20 if (user_mode(regs) && in_syscall(regs)) 21 return regs->orig_r8; 22 else 23 return -1; 24} 25 26static inline void 27syscall_rollback(struct task_struct *task, struct pt_regs *regs) 28{ 29 /* XXX: I can't fathom how pt_regs->r8 will be clobbered ? */ 30 regs->r8 = regs->orig_r8; 31} 32 33static inline long 34syscall_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 40static inline long 41syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) 42{ 43 return regs->r0; 44} 45 46static inline void 47syscall_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 */ 57static inline void 58syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, 59 unsigned int i, unsigned int n, unsigned long *args) 60{ 61 unsigned long *inside_ptregs = &(regs->r0); 62 inside_ptregs -= i; 63 64 BUG_ON((i + n) > 6); 65 66 while (n--) { 67 args[i++] = (*inside_ptregs); 68 inside_ptregs--; 69 } 70} 71 72#endif