root/arch/microblaze/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. microblaze_get_syscall_arg
  7. microblaze_set_syscall_arg
  8. syscall_get_arguments
  9. syscall_set_arguments
  10. syscall_get_arch

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef __ASM_MICROBLAZE_SYSCALL_H
   3 #define __ASM_MICROBLAZE_SYSCALL_H
   4 
   5 #include <uapi/linux/audit.h>
   6 #include <linux/kernel.h>
   7 #include <linux/sched.h>
   8 #include <asm/ptrace.h>
   9 
  10 /* The system call number is given by the user in R12 */
  11 static inline long syscall_get_nr(struct task_struct *task,
  12                                   struct pt_regs *regs)
  13 {
  14         return regs->r12;
  15 }
  16 
  17 static inline void syscall_rollback(struct task_struct *task,
  18                                     struct pt_regs *regs)
  19 {
  20         /* TODO.  */
  21 }
  22 
  23 static inline long syscall_get_error(struct task_struct *task,
  24                                      struct pt_regs *regs)
  25 {
  26         return IS_ERR_VALUE(regs->r3) ? regs->r3 : 0;
  27 }
  28 
  29 static inline long syscall_get_return_value(struct task_struct *task,
  30                                             struct pt_regs *regs)
  31 {
  32         return regs->r3;
  33 }
  34 
  35 static inline void syscall_set_return_value(struct task_struct *task,
  36                                             struct pt_regs *regs,
  37                                             int error, long val)
  38 {
  39         if (error)
  40                 regs->r3 = -error;
  41         else
  42                 regs->r3 = val;
  43 }
  44 
  45 static inline microblaze_reg_t microblaze_get_syscall_arg(struct pt_regs *regs,
  46                                                           unsigned int n)
  47 {
  48         switch (n) {
  49         case 5: return regs->r10;
  50         case 4: return regs->r9;
  51         case 3: return regs->r8;
  52         case 2: return regs->r7;
  53         case 1: return regs->r6;
  54         case 0: return regs->r5;
  55         default:
  56                 BUG();
  57         }
  58         return ~0;
  59 }
  60 
  61 static inline void microblaze_set_syscall_arg(struct pt_regs *regs,
  62                                               unsigned int n,
  63                                               unsigned long val)
  64 {
  65         switch (n) {
  66         case 5:
  67                 regs->r10 = val;
  68         case 4:
  69                 regs->r9 = val;
  70         case 3:
  71                 regs->r8 = val;
  72         case 2:
  73                 regs->r7 = val;
  74         case 1:
  75                 regs->r6 = val;
  76         case 0:
  77                 regs->r5 = val;
  78         default:
  79                 BUG();
  80         }
  81 }
  82 
  83 static inline void syscall_get_arguments(struct task_struct *task,
  84                                          struct pt_regs *regs,
  85                                          unsigned long *args)
  86 {
  87         unsigned int i = 0;
  88         unsigned int n = 6;
  89 
  90         while (n--)
  91                 *args++ = microblaze_get_syscall_arg(regs, i++);
  92 }
  93 
  94 static inline void syscall_set_arguments(struct task_struct *task,
  95                                          struct pt_regs *regs,
  96                                          const unsigned long *args)
  97 {
  98         unsigned int i = 0;
  99         unsigned int n = 6;
 100 
 101         while (n--)
 102                 microblaze_set_syscall_arg(regs, i++, *args++);
 103 }
 104 
 105 asmlinkage unsigned long do_syscall_trace_enter(struct pt_regs *regs);
 106 asmlinkage void do_syscall_trace_leave(struct pt_regs *regs);
 107 
 108 static inline int syscall_get_arch(struct task_struct *task)
 109 {
 110         return AUDIT_ARCH_MICROBLAZE;
 111 }
 112 #endif /* __ASM_MICROBLAZE_SYSCALL_H */

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