1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Access to user system call parameters and results 4 * 5 * Copyright IBM Corp. 2008 6 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) 7 */ 8 9 #ifndef _ASM_SYSCALL_H 10 #define _ASM_SYSCALL_H 1 11 12 #include <uapi/linux/audit.h> 13 #include <linux/sched.h> 14 #include <linux/err.h> 15 #include <asm/ptrace.h> 16 17 extern const unsigned long sys_call_table[]; 18 extern const unsigned long sys_call_table_emu[]; 19 20 static inline long syscall_get_nr(struct task_struct *task, 21 struct pt_regs *regs) 22 { 23 return test_pt_regs_flag(regs, PIF_SYSCALL) ? 24 (regs->int_code & 0xffff) : -1; 25 } 26 27 static inline void syscall_rollback(struct task_struct *task, 28 struct pt_regs *regs) 29 { 30 regs->gprs[2] = regs->orig_gpr2; 31 } 32 33 static inline long syscall_get_error(struct task_struct *task, 34 struct pt_regs *regs) 35 { 36 return IS_ERR_VALUE(regs->gprs[2]) ? regs->gprs[2] : 0; 37 } 38 39 static inline long syscall_get_return_value(struct task_struct *task, 40 struct pt_regs *regs) 41 { 42 return regs->gprs[2]; 43 } 44 45 static inline void syscall_set_return_value(struct task_struct *task, 46 struct pt_regs *regs, 47 int error, long val) 48 { 49 regs->gprs[2] = error ? error : val; 50 } 51 52 static inline void syscall_get_arguments(struct task_struct *task, 53 struct pt_regs *regs, 54 unsigned long *args) 55 { 56 unsigned long mask = -1UL; 57 unsigned int n = 6; 58 59 #ifdef CONFIG_COMPAT 60 if (test_tsk_thread_flag(task, TIF_31BIT)) 61 mask = 0xffffffff; 62 #endif 63 while (n-- > 0) 64 if (n > 0) 65 args[n] = regs->gprs[2 + n] & mask; 66 67 args[0] = regs->orig_gpr2 & mask; 68 } 69 70 static inline void syscall_set_arguments(struct task_struct *task, 71 struct pt_regs *regs, 72 const unsigned long *args) 73 { 74 unsigned int n = 6; 75 76 while (n-- > 0) 77 if (n > 0) 78 regs->gprs[2 + n] = args[n]; 79 regs->orig_gpr2 = args[0]; 80 } 81 82 static inline int syscall_get_arch(struct task_struct *task) 83 { 84 #ifdef CONFIG_COMPAT 85 if (test_tsk_thread_flag(task, TIF_31BIT)) 86 return AUDIT_ARCH_S390; 87 #endif 88 return AUDIT_ARCH_S390X; 89 } 90 #endif /* _ASM_SYSCALL_H */ 91