root/arch/arm64/include/asm/syscall.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. syscall_get_nr
  2. syscall_rollback
  3. syscall_get_error
  4. syscall_get_return_value
  5. syscall_set_return_value
  6. syscall_get_arguments
  7. syscall_set_arguments
  8. syscall_get_arch

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Copyright (C) 2012 ARM Ltd.
   4  */
   5 #ifndef __ASM_SYSCALL_H
   6 #define __ASM_SYSCALL_H
   7 
   8 #include <uapi/linux/audit.h>
   9 #include <linux/compat.h>
  10 #include <linux/err.h>
  11 
  12 typedef long (*syscall_fn_t)(const struct pt_regs *regs);
  13 
  14 extern const syscall_fn_t sys_call_table[];
  15 
  16 #ifdef CONFIG_COMPAT
  17 extern const syscall_fn_t compat_sys_call_table[];
  18 #endif
  19 
  20 static inline int syscall_get_nr(struct task_struct *task,
  21                                  struct pt_regs *regs)
  22 {
  23         return regs->syscallno;
  24 }
  25 
  26 static inline void syscall_rollback(struct task_struct *task,
  27                                     struct pt_regs *regs)
  28 {
  29         regs->regs[0] = regs->orig_x0;
  30 }
  31 
  32 
  33 static inline long syscall_get_error(struct task_struct *task,
  34                                      struct pt_regs *regs)
  35 {
  36         unsigned long error = regs->regs[0];
  37         return IS_ERR_VALUE(error) ? error : 0;
  38 }
  39 
  40 static inline long syscall_get_return_value(struct task_struct *task,
  41                                             struct pt_regs *regs)
  42 {
  43         return regs->regs[0];
  44 }
  45 
  46 static inline void syscall_set_return_value(struct task_struct *task,
  47                                             struct pt_regs *regs,
  48                                             int error, long val)
  49 {
  50         regs->regs[0] = (long) error ? error : val;
  51 }
  52 
  53 #define SYSCALL_MAX_ARGS 6
  54 
  55 static inline void syscall_get_arguments(struct task_struct *task,
  56                                          struct pt_regs *regs,
  57                                          unsigned long *args)
  58 {
  59         args[0] = regs->orig_x0;
  60         args++;
  61 
  62         memcpy(args, &regs->regs[1], 5 * sizeof(args[0]));
  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         regs->orig_x0 = args[0];
  70         args++;
  71 
  72         memcpy(&regs->regs[1], args, 5 * sizeof(args[0]));
  73 }
  74 
  75 /*
  76  * We don't care about endianness (__AUDIT_ARCH_LE bit) here because
  77  * AArch64 has the same system calls both on little- and big- endian.
  78  */
  79 static inline int syscall_get_arch(struct task_struct *task)
  80 {
  81         if (is_compat_thread(task_thread_info(task)))
  82                 return AUDIT_ARCH_ARM;
  83 
  84         return AUDIT_ARCH_AARCH64;
  85 }
  86 
  87 #endif  /* __ASM_SYSCALL_H */

/* [<][>][^][v][top][bottom][index][help] */