linux/arch/um/include/asm/syscall-generic.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Access to user system call parameters and results
   4 *
   5 * See asm-generic/syscall.h for function descriptions.
   6 *
   7 * Copyright (C) 2015 Micka\xC3\xABl Sala\xC3\xBCn <mic@digikod.net>
   8 */
   9
  10#ifndef __UM_SYSCALL_GENERIC_H
  11#define __UM_SYSCALL_GENERIC_H
  12
  13#include <asm/ptrace.h>
  14#include <linux/err.h>
  15#include <linux/sched.h>
  16#include <sysdep/ptrace.h>
  17
  18static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
  19{
  20
  21        return PT_REGS_SYSCALL_NR(regs);
  22}
  23
  24static inline void syscall_rollback(struct task_struct *task,
  25                                    struct pt_regs *regs)
  26{
  27        /* do nothing */
  28}
  29
  30static inline long syscall_get_error(struct task_struct *task,
  31                                     struct pt_regs *regs)
  32{
  33        const long error = regs_return_value(regs);
  34
  35        return IS_ERR_VALUE(error) ? error : 0;
  36}
  37
  38static inline long syscall_get_return_value(struct task_struct *task,
  39                                            struct pt_regs *regs)
  40{
  41        return regs_return_value(regs);
  42}
  43
  44static inline void syscall_set_return_value(struct task_struct *task,
  45                                            struct pt_regs *regs,
  46                                            int error, long val)
  47{
  48        PT_REGS_SET_SYSCALL_RETURN(regs, (long) error ?: val);
  49}
  50
  51static inline void syscall_get_arguments(struct task_struct *task,
  52                                         struct pt_regs *regs,
  53                                         unsigned long *args)
  54{
  55        const struct uml_pt_regs *r = &regs->regs;
  56
  57        *args++ = UPT_SYSCALL_ARG1(r);
  58        *args++ = UPT_SYSCALL_ARG2(r);
  59        *args++ = UPT_SYSCALL_ARG3(r);
  60        *args++ = UPT_SYSCALL_ARG4(r);
  61        *args++ = UPT_SYSCALL_ARG5(r);
  62        *args   = UPT_SYSCALL_ARG6(r);
  63}
  64
  65static inline void syscall_set_arguments(struct task_struct *task,
  66                                         struct pt_regs *regs,
  67                                         const unsigned long *args)
  68{
  69        struct uml_pt_regs *r = &regs->regs;
  70
  71        UPT_SYSCALL_ARG1(r) = *args++;
  72        UPT_SYSCALL_ARG2(r) = *args++;
  73        UPT_SYSCALL_ARG3(r) = *args++;
  74        UPT_SYSCALL_ARG4(r) = *args++;
  75        UPT_SYSCALL_ARG5(r) = *args++;
  76        UPT_SYSCALL_ARG6(r) = *args;
  77}
  78
  79/* See arch/x86/um/asm/syscall.h for syscall_get_arch() definition. */
  80
  81#endif  /* __UM_SYSCALL_GENERIC_H */
  82