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