| Viewing file:  syscall.h (1.57 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
/** Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
 
 #ifndef _ASM_ARC_SYSCALL_H
 #define _ASM_ARC_SYSCALL_H  1
 
 #include <linux/err.h>
 #include <linux/sched.h>
 #include <asm/unistd.h>
 #include <asm/ptrace.h>        /* in_syscall() */
 
 static inline long
 syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
 {
 if (user_mode(regs) && in_syscall(regs))
 return regs->r8;
 else
 return -1;
 }
 
 static inline void
 syscall_rollback(struct task_struct *task, struct pt_regs *regs)
 {
 regs->r0 = regs->orig_r0;
 }
 
 static inline long
 syscall_get_error(struct task_struct *task, struct pt_regs *regs)
 {
 /* 0 if syscall succeeded, otherwise -Errorcode */
 return IS_ERR_VALUE(regs->r0) ? regs->r0 : 0;
 }
 
 static inline long
 syscall_get_return_value(struct task_struct *task, struct pt_regs *regs)
 {
 return regs->r0;
 }
 
 static inline void
 syscall_set_return_value(struct task_struct *task, struct pt_regs *regs,
 int error, long val)
 {
 regs->r0 = (long) error ?: val;
 }
 
 /*
 * @i:      argument index [0,5]
 * @n:      number of arguments; n+i must be [1,6].
 */
 static inline void
 syscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
 unsigned int i, unsigned int n, unsigned long *args)
 {
 unsigned long *inside_ptregs = &(regs->r0);
 inside_ptregs -= i;
 
 BUG_ON((i + n) > 6);
 
 while (n--) {
 args[i++] = (*inside_ptregs);
 inside_ptregs--;
 }
 }
 
 #endif
 
 |