linux/arch/xtensa/include/asm/syscall.h
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 2001 - 2007 Tensilica Inc.
   7 * Copyright (C) 2018 Cadence Design Systems Inc.
   8 */
   9
  10#ifndef _ASM_SYSCALL_H
  11#define _ASM_SYSCALL_H
  12
  13#include <linux/err.h>
  14#include <asm/ptrace.h>
  15#include <uapi/linux/audit.h>
  16
  17static inline int syscall_get_arch(struct task_struct *task)
  18{
  19        return AUDIT_ARCH_XTENSA;
  20}
  21
  22typedef void (*syscall_t)(void);
  23extern syscall_t sys_call_table[];
  24
  25static inline long syscall_get_nr(struct task_struct *task,
  26                                  struct pt_regs *regs)
  27{
  28        return regs->syscall;
  29}
  30
  31static inline void syscall_rollback(struct task_struct *task,
  32                                    struct pt_regs *regs)
  33{
  34        /* Do nothing. */
  35}
  36
  37static inline long syscall_get_error(struct task_struct *task,
  38                                     struct pt_regs *regs)
  39{
  40        /* 0 if syscall succeeded, otherwise -Errorcode */
  41        return IS_ERR_VALUE(regs->areg[2]) ? regs->areg[2] : 0;
  42}
  43
  44static inline long syscall_get_return_value(struct task_struct *task,
  45                                            struct pt_regs *regs)
  46{
  47        return regs->areg[2];
  48}
  49
  50static inline void syscall_set_return_value(struct task_struct *task,
  51                                            struct pt_regs *regs,
  52                                            int error, long val)
  53{
  54        regs->areg[2] = (long) error ? error : val;
  55}
  56
  57#define SYSCALL_MAX_ARGS 6
  58#define XTENSA_SYSCALL_ARGUMENT_REGS {6, 3, 4, 5, 8, 9}
  59
  60static inline void syscall_get_arguments(struct task_struct *task,
  61                                         struct pt_regs *regs,
  62                                         unsigned long *args)
  63{
  64        static const unsigned int reg[] = XTENSA_SYSCALL_ARGUMENT_REGS;
  65        unsigned int i;
  66
  67        for (i = 0; i < 6; ++i)
  68                args[i] = regs->areg[reg[i]];
  69}
  70
  71static inline void syscall_set_arguments(struct task_struct *task,
  72                                         struct pt_regs *regs,
  73                                         const unsigned long *args)
  74{
  75        static const unsigned int reg[] = XTENSA_SYSCALL_ARGUMENT_REGS;
  76        unsigned int i;
  77
  78        for (i = 0; i < 6; ++i)
  79                regs->areg[reg[i]] = args[i];
  80}
  81
  82asmlinkage long xtensa_rt_sigreturn(void);
  83asmlinkage long xtensa_shmat(int, char __user *, int);
  84asmlinkage long xtensa_fadvise64_64(int, int,
  85                                    unsigned long long, unsigned long long);
  86
  87#endif
  88