GNU Linux-libre 6.8.9-gnu
[releases.git] / arch / nios2 / include / asm / syscall.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright Altera Corporation (C) <2014>. All rights reserved
4  */
5
6 #ifndef __ASM_NIOS2_SYSCALL_H__
7 #define __ASM_NIOS2_SYSCALL_H__
8
9 #include <uapi/linux/audit.h>
10 #include <linux/err.h>
11 #include <linux/sched.h>
12
13 static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
14 {
15         return regs->r2;
16 }
17
18 static inline void syscall_rollback(struct task_struct *task,
19                                 struct pt_regs *regs)
20 {
21         regs->r2 = regs->orig_r2;
22         regs->r7 = regs->orig_r7;
23 }
24
25 static inline long syscall_get_error(struct task_struct *task,
26                                 struct pt_regs *regs)
27 {
28         return regs->r7 ? regs->r2 : 0;
29 }
30
31 static inline long syscall_get_return_value(struct task_struct *task,
32         struct pt_regs *regs)
33 {
34         return regs->r2;
35 }
36
37 static inline void syscall_set_return_value(struct task_struct *task,
38         struct pt_regs *regs, int error, long val)
39 {
40         if (error) {
41                 /* error < 0, but nios2 uses > 0 return value */
42                 regs->r2 = -error;
43                 regs->r7 = 1;
44         } else {
45                 regs->r2 = val;
46                 regs->r7 = 0;
47         }
48 }
49
50 static inline void syscall_get_arguments(struct task_struct *task,
51         struct pt_regs *regs, unsigned long *args)
52 {
53         *args++ = regs->r4;
54         *args++ = regs->r5;
55         *args++ = regs->r6;
56         *args++ = regs->r7;
57         *args++ = regs->r8;
58         *args   = regs->r9;
59 }
60
61 static inline int syscall_get_arch(struct task_struct *task)
62 {
63         return AUDIT_ARCH_NIOS2;
64 }
65
66 #endif