Line data Source code
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 0 : 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 = ®s->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 : /* See arch/x86/um/asm/syscall.h for syscall_get_arch() definition. */ 66 : 67 : #endif /* __UM_SYSCALL_GENERIC_H */