linux/arch/c6x/include/asm/syscall.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2011 Texas Instruments Incorporated
   3 * Author: Mark Salter <msalter@redhat.com>
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation; either version 2 of the License, or
   8 * (at your option) any later version.
   9 */
  10
  11#ifndef __ASM_C6X_SYSCALL_H
  12#define __ASM_C6X_SYSCALL_H
  13
  14#include <linux/err.h>
  15#include <linux/sched.h>
  16
  17static inline int syscall_get_nr(struct task_struct *task,
  18                                 struct pt_regs *regs)
  19{
  20        return regs->b0;
  21}
  22
  23static inline void syscall_rollback(struct task_struct *task,
  24                                    struct pt_regs *regs)
  25{
  26        /* do nothing */
  27}
  28
  29static inline long syscall_get_error(struct task_struct *task,
  30                                     struct pt_regs *regs)
  31{
  32        return IS_ERR_VALUE(regs->a4) ? regs->a4 : 0;
  33}
  34
  35static inline long syscall_get_return_value(struct task_struct *task,
  36                                            struct pt_regs *regs)
  37{
  38        return regs->a4;
  39}
  40
  41static inline void syscall_set_return_value(struct task_struct *task,
  42                                            struct pt_regs *regs,
  43                                            int error, long val)
  44{
  45        regs->a4 = error ?: val;
  46}
  47
  48static inline void syscall_get_arguments(struct task_struct *task,
  49                                         struct pt_regs *regs, unsigned int i,
  50                                         unsigned int n, unsigned long *args)
  51{
  52        switch (i) {
  53        case 0:
  54                if (!n--)
  55                        break;
  56                *args++ = regs->a4;
  57        case 1:
  58                if (!n--)
  59                        break;
  60                *args++ = regs->b4;
  61        case 2:
  62                if (!n--)
  63                        break;
  64                *args++ = regs->a6;
  65        case 3:
  66                if (!n--)
  67                        break;
  68                *args++ = regs->b6;
  69        case 4:
  70                if (!n--)
  71                        break;
  72                *args++ = regs->a8;
  73        case 5:
  74                if (!n--)
  75                        break;
  76                *args++ = regs->b8;
  77        case 6:
  78                if (!n--)
  79                        break;
  80        default:
  81                BUG();
  82        }
  83}
  84
  85static inline void syscall_set_arguments(struct task_struct *task,
  86                                         struct pt_regs *regs,
  87                                         unsigned int i, unsigned int n,
  88                                         const unsigned long *args)
  89{
  90        switch (i) {
  91        case 0:
  92                if (!n--)
  93                        break;
  94                regs->a4 = *args++;
  95        case 1:
  96                if (!n--)
  97                        break;
  98                regs->b4 = *args++;
  99        case 2:
 100                if (!n--)
 101                        break;
 102                regs->a6 = *args++;
 103        case 3:
 104                if (!n--)
 105                        break;
 106                regs->b6 = *args++;
 107        case 4:
 108                if (!n--)
 109                        break;
 110                regs->a8 = *args++;
 111        case 5:
 112                if (!n--)
 113                        break;
 114                regs->a9 = *args++;
 115        case 6:
 116                if (!n)
 117                        break;
 118        default:
 119                BUG();
 120        }
 121}
 122
 123#endif /* __ASM_C6X_SYSCALLS_H */
 124