linux/arch/arc/include/asm/syscall.h
<<
>>
Prefs
   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->r8;
  22        else
  23                return -1;
  24}
  25
  26static inline void
  27syscall_rollback(struct task_struct *task, struct pt_regs *regs)
  28{
  29        regs->r0 = regs->orig_r0;
  30}
  31
  32static inline long
  33syscall_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
  39static inline long
  40syscall_get_return_value(struct task_struct *task, struct pt_regs *regs)
  41{
  42        return regs->r0;
  43}
  44
  45static inline void
  46syscall_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 */
  56static inline void
  57syscall_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