root/arch/arc/include/asm/syscall.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. syscall_get_nr
  2. syscall_rollback
  3. syscall_get_error
  4. syscall_get_return_value
  5. syscall_set_return_value
  6. syscall_get_arguments
  7. syscall_get_arch

   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 
  15 static inline long
  16 syscall_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 
  24 static inline void
  25 syscall_rollback(struct task_struct *task, struct pt_regs *regs)
  26 {
  27         regs->r0 = regs->orig_r0;
  28 }
  29 
  30 static inline long
  31 syscall_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 
  37 static inline long
  38 syscall_get_return_value(struct task_struct *task, struct pt_regs *regs)
  39 {
  40         return regs->r0;
  41 }
  42 
  43 static inline void
  44 syscall_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  */
  54 static inline void
  55 syscall_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 
  68 static inline int
  69 syscall_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

/* [<][>][^][v][top][bottom][index][help] */