| .. | .. |
|---|
| 1 | 1 | /* |
|---|
| 2 | | - * include/asm-xtensa/syscall.h |
|---|
| 3 | | - * |
|---|
| 4 | 2 | * This file is subject to the terms and conditions of the GNU General Public |
|---|
| 5 | 3 | * License. See the file "COPYING" in the main directory of this archive |
|---|
| 6 | 4 | * for more details. |
|---|
| 7 | 5 | * |
|---|
| 8 | 6 | * Copyright (C) 2001 - 2007 Tensilica Inc. |
|---|
| 7 | + * Copyright (C) 2018 Cadence Design Systems Inc. |
|---|
| 9 | 8 | */ |
|---|
| 10 | 9 | |
|---|
| 11 | | -struct pt_regs; |
|---|
| 12 | | -asmlinkage long xtensa_ptrace(long, long, long, long); |
|---|
| 13 | | -asmlinkage long xtensa_sigreturn(struct pt_regs*); |
|---|
| 14 | | -asmlinkage long xtensa_rt_sigreturn(struct pt_regs*); |
|---|
| 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 | + |
|---|
| 17 | +static inline int syscall_get_arch(struct task_struct *task) |
|---|
| 18 | +{ |
|---|
| 19 | + return AUDIT_ARCH_XTENSA; |
|---|
| 20 | +} |
|---|
| 21 | + |
|---|
| 22 | +typedef void (*syscall_t)(void); |
|---|
| 23 | +extern syscall_t sys_call_table[]; |
|---|
| 24 | + |
|---|
| 25 | +static inline long syscall_get_nr(struct task_struct *task, |
|---|
| 26 | + struct pt_regs *regs) |
|---|
| 27 | +{ |
|---|
| 28 | + return regs->syscall; |
|---|
| 29 | +} |
|---|
| 30 | + |
|---|
| 31 | +static inline void syscall_rollback(struct task_struct *task, |
|---|
| 32 | + struct pt_regs *regs) |
|---|
| 33 | +{ |
|---|
| 34 | + /* Do nothing. */ |
|---|
| 35 | +} |
|---|
| 36 | + |
|---|
| 37 | +static 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 | + |
|---|
| 44 | +static inline long syscall_get_return_value(struct task_struct *task, |
|---|
| 45 | + struct pt_regs *regs) |
|---|
| 46 | +{ |
|---|
| 47 | + return regs->areg[2]; |
|---|
| 48 | +} |
|---|
| 49 | + |
|---|
| 50 | +static 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 | + |
|---|
| 60 | +static 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 | + |
|---|
| 71 | +static 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 | + |
|---|
| 82 | +asmlinkage long xtensa_rt_sigreturn(void); |
|---|
| 15 | 83 | asmlinkage long xtensa_shmat(int, char __user *, int); |
|---|
| 16 | 84 | asmlinkage long xtensa_fadvise64_64(int, int, |
|---|
| 17 | 85 | unsigned long long, unsigned long long); |
|---|
| 18 | 86 | |
|---|
| 19 | | -/* Should probably move to linux/syscalls.h */ |
|---|
| 20 | | -struct pollfd; |
|---|
| 21 | | -asmlinkage long sys_pselect6(int n, fd_set __user *inp, fd_set __user *outp, |
|---|
| 22 | | - fd_set __user *exp, struct timespec __user *tsp, |
|---|
| 23 | | - void __user *sig); |
|---|
| 24 | | -asmlinkage long sys_ppoll(struct pollfd __user *ufds, unsigned int nfds, |
|---|
| 25 | | - struct timespec __user *tsp, |
|---|
| 26 | | - const sigset_t __user *sigmask, |
|---|
| 27 | | - size_t sigsetsize); |
|---|
| 87 | +#endif |
|---|