cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

syscall.h (2057B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Access to user system call parameters and results
      4 *
      5 * See asm-generic/syscall.h for descriptions of what we must do here.
      6 */
      7
      8#ifndef _ASM_ARM_SYSCALL_H
      9#define _ASM_ARM_SYSCALL_H
     10
     11#include <uapi/linux/audit.h> /* for AUDIT_ARCH_* */
     12#include <linux/elf.h> /* for ELF_EM */
     13#include <linux/err.h>
     14#include <linux/sched.h>
     15
     16#include <asm/unistd.h>
     17
     18#define NR_syscalls (__NR_syscalls)
     19
     20extern const unsigned long sys_call_table[];
     21
     22static inline int syscall_get_nr(struct task_struct *task,
     23				 struct pt_regs *regs)
     24{
     25	if (IS_ENABLED(CONFIG_AEABI) && !IS_ENABLED(CONFIG_OABI_COMPAT))
     26		return task_thread_info(task)->abi_syscall;
     27
     28	return task_thread_info(task)->abi_syscall & __NR_SYSCALL_MASK;
     29}
     30
     31static inline bool __in_oabi_syscall(struct task_struct *task)
     32{
     33	return IS_ENABLED(CONFIG_OABI_COMPAT) &&
     34		(task_thread_info(task)->abi_syscall & __NR_OABI_SYSCALL_BASE);
     35}
     36
     37static inline bool in_oabi_syscall(void)
     38{
     39	return __in_oabi_syscall(current);
     40}
     41
     42static inline void syscall_rollback(struct task_struct *task,
     43				    struct pt_regs *regs)
     44{
     45	regs->ARM_r0 = regs->ARM_ORIG_r0;
     46}
     47
     48static inline long syscall_get_error(struct task_struct *task,
     49				     struct pt_regs *regs)
     50{
     51	unsigned long error = regs->ARM_r0;
     52	return IS_ERR_VALUE(error) ? error : 0;
     53}
     54
     55static inline long syscall_get_return_value(struct task_struct *task,
     56					    struct pt_regs *regs)
     57{
     58	return regs->ARM_r0;
     59}
     60
     61static inline void syscall_set_return_value(struct task_struct *task,
     62					    struct pt_regs *regs,
     63					    int error, long val)
     64{
     65	regs->ARM_r0 = (long) error ? error : val;
     66}
     67
     68#define SYSCALL_MAX_ARGS 7
     69
     70static inline void syscall_get_arguments(struct task_struct *task,
     71					 struct pt_regs *regs,
     72					 unsigned long *args)
     73{
     74	args[0] = regs->ARM_ORIG_r0;
     75	args++;
     76
     77	memcpy(args, &regs->ARM_r0 + 1, 5 * sizeof(args[0]));
     78}
     79
     80static inline int syscall_get_arch(struct task_struct *task)
     81{
     82	/* ARM tasks don't change audit architectures on the fly. */
     83	return AUDIT_ARCH_ARM;
     84}
     85
     86#endif /* _ASM_ARM_SYSCALL_H */