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        regs->regs[0] = (long) error ?: val;
  44}
  45
  46static inline void syscall_get_arguments(struct task_struct *task,
  47                                         struct pt_regs *regs,
  48                                         unsigned long *args)
  49{
  50
  51        /* Argument pattern is: R4, R5, R6, R7, R0, R1 */
  52        args[5] = regs->regs[1];
  53        args[4] = regs->regs[0];
  54        args[3] = regs->regs[7];
  55        args[2] = regs->regs[6];
  56        args[1] = regs->regs[5];
  57        args[0] = regs->regs[4];
  58}
  59
  60static inline void syscall_set_arguments(struct task_struct *task,
  61                                         struct pt_regs *regs,
  62                                         const unsigned long *args)
  63{
  64        regs->regs[1] = args[5];
  65        regs->regs[0] = args[4];
  66        regs->regs[7] = args[3];
  67        regs->regs[6] = args[2];
  68        regs->regs[5] = args[1];
  69        regs->regs[4] = args[0];
  70}
  71
  72static inline int syscall_get_arch(struct task_struct *task)
  73{
  74        int arch = AUDIT_ARCH_SH;
  75
  76#ifdef CONFIG_CPU_LITTLE_ENDIAN
  77        arch |= __AUDIT_ARCH_LE;
  78#endif
  79        return arch;
  80}
  81#endif /* __ASM_SH_SYSCALL_32_H */
  82