Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
syscall.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Texas Instruments Incorporated
3  * Author: Mark Salter <[email protected]>
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 
17 static inline int syscall_get_nr(struct task_struct *task,
18  struct pt_regs *regs)
19 {
20  return regs->b0;
21 }
22 
23 static inline void syscall_rollback(struct task_struct *task,
24  struct pt_regs *regs)
25 {
26  /* do nothing */
27 }
28 
29 static 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 
35 static inline long syscall_get_return_value(struct task_struct *task,
36  struct pt_regs *regs)
37 {
38  return regs->a4;
39 }
40 
41 static 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 
48 static 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 
85 static 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 */