]>
Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
4adeefe1 VG |
2 | /* |
3 | * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) | |
4adeefe1 VG |
4 | */ |
5 | ||
6 | #ifndef _ASM_ARC_SYSCALL_H | |
7 | #define _ASM_ARC_SYSCALL_H 1 | |
8 | ||
67f2a8a2 | 9 | #include <uapi/linux/audit.h> |
4adeefe1 VG |
10 | #include <linux/err.h> |
11 | #include <linux/sched.h> | |
12 | #include <asm/unistd.h> | |
13 | #include <asm/ptrace.h> /* in_syscall() */ | |
14 | ||
15 | static inline long | |
16 | syscall_get_nr(struct task_struct *task, struct pt_regs *regs) | |
17 | { | |
18 | if (user_mode(regs) && in_syscall(regs)) | |
352c1d95 | 19 | return regs->r8; |
4adeefe1 VG |
20 | else |
21 | return -1; | |
22 | } | |
23 | ||
24 | static inline void | |
25 | syscall_rollback(struct task_struct *task, struct pt_regs *regs) | |
26 | { | |
352c1d95 | 27 | regs->r0 = regs->orig_r0; |
4adeefe1 VG |
28 | } |
29 | ||
30 | static inline long | |
31 | syscall_get_error(struct task_struct *task, struct pt_regs *regs) | |
32 | { | |
33 | /* 0 if syscall succeeded, otherwise -Errorcode */ | |
34 | return IS_ERR_VALUE(regs->r0) ? regs->r0 : 0; | |
35 | } | |
36 | ||
37 | static inline long | |
38 | syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) | |
39 | { | |
40 | return regs->r0; | |
41 | } | |
42 | ||
43 | static inline void | |
44 | syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, | |
45 | int error, long val) | |
46 | { | |
47 | regs->r0 = (long) error ?: val; | |
48 | } | |
49 | ||
50 | /* | |
51 | * @i: argument index [0,5] | |
52 | * @n: number of arguments; n+i must be [1,6]. | |
53 | */ | |
54 | static inline void | |
55 | syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, | |
b35f549d | 56 | unsigned long *args) |
4adeefe1 VG |
57 | { |
58 | unsigned long *inside_ptregs = &(regs->r0); | |
b35f549d SRRH |
59 | unsigned int n = 6; |
60 | unsigned int i = 0; | |
4adeefe1 VG |
61 | |
62 | while (n--) { | |
63 | args[i++] = (*inside_ptregs); | |
64 | inside_ptregs--; | |
65 | } | |
66 | } | |
67 | ||
67f2a8a2 | 68 | static inline int |
16add411 | 69 | syscall_get_arch(struct task_struct *task) |
67f2a8a2 DL |
70 | { |
71 | return IS_ENABLED(CONFIG_ISA_ARCOMPACT) | |
72 | ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) | |
73 | ? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT) | |
74 | : (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) | |
75 | ? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2); | |
76 | } | |
77 | ||
4adeefe1 | 78 | #endif |