GNU Linux-libre 5.4.274-gnu1
[releases.git] / arch / um / include / asm / syscall-generic.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Access to user system call parameters and results
4  *
5  * See asm-generic/syscall.h for function descriptions.
6  *
7  * Copyright (C) 2015 Mickaël Salaün <mic@digikod.net>
8  */
9
10 #ifndef __UM_SYSCALL_GENERIC_H
11 #define __UM_SYSCALL_GENERIC_H
12
13 #include <asm/ptrace.h>
14 #include <linux/err.h>
15 #include <linux/sched.h>
16 #include <sysdep/ptrace.h>
17
18 static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
19 {
20
21         return PT_REGS_SYSCALL_NR(regs);
22 }
23
24 static inline void syscall_rollback(struct task_struct *task,
25                                     struct pt_regs *regs)
26 {
27         /* do nothing */
28 }
29
30 static inline long syscall_get_error(struct task_struct *task,
31                                      struct pt_regs *regs)
32 {
33         const long error = regs_return_value(regs);
34
35         return IS_ERR_VALUE(error) ? error : 0;
36 }
37
38 static inline long syscall_get_return_value(struct task_struct *task,
39                                             struct pt_regs *regs)
40 {
41         return regs_return_value(regs);
42 }
43
44 static inline void syscall_set_return_value(struct task_struct *task,
45                                             struct pt_regs *regs,
46                                             int error, long val)
47 {
48         PT_REGS_SET_SYSCALL_RETURN(regs, (long) error ?: val);
49 }
50
51 static inline void syscall_get_arguments(struct task_struct *task,
52                                          struct pt_regs *regs,
53                                          unsigned long *args)
54 {
55         const struct uml_pt_regs *r = &regs->regs;
56
57         *args++ = UPT_SYSCALL_ARG1(r);
58         *args++ = UPT_SYSCALL_ARG2(r);
59         *args++ = UPT_SYSCALL_ARG3(r);
60         *args++ = UPT_SYSCALL_ARG4(r);
61         *args++ = UPT_SYSCALL_ARG5(r);
62         *args   = UPT_SYSCALL_ARG6(r);
63 }
64
65 static inline void syscall_set_arguments(struct task_struct *task,
66                                          struct pt_regs *regs,
67                                          const unsigned long *args)
68 {
69         struct uml_pt_regs *r = &regs->regs;
70
71         UPT_SYSCALL_ARG1(r) = *args++;
72         UPT_SYSCALL_ARG2(r) = *args++;
73         UPT_SYSCALL_ARG3(r) = *args++;
74         UPT_SYSCALL_ARG4(r) = *args++;
75         UPT_SYSCALL_ARG5(r) = *args++;
76         UPT_SYSCALL_ARG6(r) = *args;
77 }
78
79 /* See arch/x86/um/asm/syscall.h for syscall_get_arch() definition. */
80
81 #endif  /* __UM_SYSCALL_GENERIC_H */