162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Access to user system call parameters and results 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * See asm-generic/syscall.h for descriptions of what we must do here. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _ASM_ARM_SYSCALL_H 962306a36Sopenharmony_ci#define _ASM_ARM_SYSCALL_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <uapi/linux/audit.h> /* for AUDIT_ARCH_* */ 1262306a36Sopenharmony_ci#include <linux/elf.h> /* for ELF_EM */ 1362306a36Sopenharmony_ci#include <linux/err.h> 1462306a36Sopenharmony_ci#include <linux/sched.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <asm/unistd.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define NR_syscalls (__NR_syscalls) 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciextern const unsigned long sys_call_table[]; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic inline int syscall_get_nr(struct task_struct *task, 2362306a36Sopenharmony_ci struct pt_regs *regs) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci if (IS_ENABLED(CONFIG_AEABI) && !IS_ENABLED(CONFIG_OABI_COMPAT)) 2662306a36Sopenharmony_ci return task_thread_info(task)->abi_syscall; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci if (task_thread_info(task)->abi_syscall == -1) 2962306a36Sopenharmony_ci return -1; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci return task_thread_info(task)->abi_syscall & __NR_SYSCALL_MASK; 3262306a36Sopenharmony_ci} 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic inline bool __in_oabi_syscall(struct task_struct *task) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci return IS_ENABLED(CONFIG_OABI_COMPAT) && 3762306a36Sopenharmony_ci (task_thread_info(task)->abi_syscall & __NR_OABI_SYSCALL_BASE); 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic inline bool in_oabi_syscall(void) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci return __in_oabi_syscall(current); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic inline void syscall_rollback(struct task_struct *task, 4662306a36Sopenharmony_ci struct pt_regs *regs) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci regs->ARM_r0 = regs->ARM_ORIG_r0; 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic inline long syscall_get_error(struct task_struct *task, 5262306a36Sopenharmony_ci struct pt_regs *regs) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci unsigned long error = regs->ARM_r0; 5562306a36Sopenharmony_ci return IS_ERR_VALUE(error) ? error : 0; 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic inline long syscall_get_return_value(struct task_struct *task, 5962306a36Sopenharmony_ci struct pt_regs *regs) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci return regs->ARM_r0; 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic inline void syscall_set_return_value(struct task_struct *task, 6562306a36Sopenharmony_ci struct pt_regs *regs, 6662306a36Sopenharmony_ci int error, long val) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci regs->ARM_r0 = (long) error ? error : val; 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci#define SYSCALL_MAX_ARGS 7 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistatic inline void syscall_get_arguments(struct task_struct *task, 7462306a36Sopenharmony_ci struct pt_regs *regs, 7562306a36Sopenharmony_ci unsigned long *args) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci args[0] = regs->ARM_ORIG_r0; 7862306a36Sopenharmony_ci args++; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci memcpy(args, ®s->ARM_r0 + 1, 5 * sizeof(args[0])); 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic inline int syscall_get_arch(struct task_struct *task) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci /* ARM tasks don't change audit architectures on the fly. */ 8662306a36Sopenharmony_ci return AUDIT_ARCH_ARM; 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#endif /* _ASM_ARM_SYSCALL_H */ 90