root/arch/sh/include/asm/syscall_32.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_set_arguments
  8. syscall_get_arch

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef __ASM_SH_SYSCALL_32_H
   3 #define __ASM_SH_SYSCALL_32_H
   4 
   5 #include <uapi/linux/audit.h>
   6 #include <linux/kernel.h>
   7 #include <linux/sched.h>
   8 #include <linux/err.h>
   9 #include <asm/ptrace.h>
  10 
  11 /* The system call number is given by the user in R3 */
  12 static inline long syscall_get_nr(struct task_struct *task,
  13                                   struct pt_regs *regs)
  14 {
  15         return (regs->tra >= 0) ? regs->regs[3] : -1L;
  16 }
  17 
  18 static inline void syscall_rollback(struct task_struct *task,
  19                                     struct pt_regs *regs)
  20 {
  21         /*
  22          * XXX: This needs some thought. On SH we don't
  23          * save away the original r0 value anywhere.
  24          */
  25 }
  26 
  27 static inline long syscall_get_error(struct task_struct *task,
  28                                      struct pt_regs *regs)
  29 {
  30         return IS_ERR_VALUE(regs->regs[0]) ? regs->regs[0] : 0;
  31 }
  32 
  33 static inline long syscall_get_return_value(struct task_struct *task,
  34                                             struct pt_regs *regs)
  35 {
  36         return regs->regs[0];
  37 }
  38 
  39 static inline void syscall_set_return_value(struct task_struct *task,
  40                                             struct pt_regs *regs,
  41                                             int error, long val)
  42 {
  43         if (error)
  44                 regs->regs[0] = -error;
  45         else
  46                 regs->regs[0] = val;
  47 }
  48 
  49 static inline void syscall_get_arguments(struct task_struct *task,
  50                                          struct pt_regs *regs,
  51                                          unsigned long *args)
  52 {
  53 
  54         /* Argument pattern is: R4, R5, R6, R7, R0, R1 */
  55         args[5] = regs->regs[1];
  56         args[4] = regs->regs[0];
  57         args[3] = regs->regs[7];
  58         args[2] = regs->regs[6];
  59         args[1] = regs->regs[5];
  60         args[0] = regs->regs[4];
  61 }
  62 
  63 static inline void syscall_set_arguments(struct task_struct *task,
  64                                          struct pt_regs *regs,
  65                                          const unsigned long *args)
  66 {
  67         regs->regs[1] = args[5];
  68         regs->regs[0] = args[4];
  69         regs->regs[7] = args[3];
  70         regs->regs[6] = args[2];
  71         regs->regs[5] = args[1];
  72         regs->regs[4] = args[0];
  73 }
  74 
  75 static inline int syscall_get_arch(struct task_struct *task)
  76 {
  77         int arch = AUDIT_ARCH_SH;
  78 
  79 #ifdef CONFIG_CPU_LITTLE_ENDIAN
  80         arch |= __AUDIT_ARCH_LE;
  81 #endif
  82         return arch;
  83 }
  84 #endif /* __ASM_SH_SYSCALL_32_H */

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