linux/arch/sh/include/asm/syscall_32.h
<<
>>
Prefs
   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 */
  12static 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
  18static 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
  27static 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
  33static inline long syscall_get_return_value(struct task_struct *task,
  34                                            struct pt_regs *regs)
  35{
  36        return regs->regs[0];
  37}
  38
  39static 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
  49static 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
  63static 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
  75static 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 */
  85