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