linux/arch/arm64/include/asm/syscall.h
<<
>>
Prefs
   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
  12typedef long (*syscall_fn_t)(const struct pt_regs *regs);
  13
  14extern const syscall_fn_t sys_call_table[];
  15
  16#ifdef CONFIG_COMPAT
  17extern const syscall_fn_t compat_sys_call_table[];
  18#endif
  19
  20static inline int syscall_get_nr(struct task_struct *task,
  21                                 struct pt_regs *regs)
  22{
  23        return regs->syscallno;
  24}
  25
  26static inline void syscall_rollback(struct task_struct *task,
  27                                    struct pt_regs *regs)
  28{
  29        regs->regs[0] = regs->orig_x0;
  30}
  31
  32
  33static 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
  40static inline long syscall_get_return_value(struct task_struct *task,
  41                                            struct pt_regs *regs)
  42{
  43        return regs->regs[0];
  44}
  45
  46static 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
  55static 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
  65static 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 */
  79static 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 */
  88