• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_CRIS_ARCH_UNISTD_H_
3 #define _ASM_CRIS_ARCH_UNISTD_H_
4 
5 /* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
6 /*
7  * Don't remove the .ifnc tests; they are an insurance against
8  * any hard-to-spot gcc register allocation bugs.
9  */
10 #define _syscall0(type,name) \
11 type name(void) \
12 { \
13   register long __a __asm__ ("r10"); \
14   register long __n_ __asm__ ("r9") = (__NR_##name); \
15   __asm__ __volatile__ (".ifnc %0%1,$r10$r9\n\t" \
16 			".err\n\t" \
17 			".endif\n\t" \
18 			"break 13" \
19 			: "=r" (__a) \
20 			: "r" (__n_)); \
21   if (__a >= 0) \
22      return (type) __a; \
23   errno = -__a; \
24   return (type) -1; \
25 }
26 
27 #define _syscall1(type,name,type1,arg1) \
28 type name(type1 arg1) \
29 { \
30   register long __a __asm__ ("r10") = (long) arg1; \
31   register long __n_ __asm__ ("r9") = (__NR_##name); \
32   __asm__ __volatile__ (".ifnc %0%1,$r10$r9\n\t" \
33 			".err\n\t" \
34 			".endif\n\t" \
35 			"break 13" \
36 			: "=r" (__a) \
37 			: "r" (__n_), "0" (__a)); \
38   if (__a >= 0) \
39      return (type) __a; \
40   errno = -__a; \
41   return (type) -1; \
42 }
43 
44 #define _syscall2(type,name,type1,arg1,type2,arg2) \
45 type name(type1 arg1,type2 arg2) \
46 { \
47   register long __a __asm__ ("r10") = (long) arg1; \
48   register long __b __asm__ ("r11") = (long) arg2; \
49   register long __n_ __asm__ ("r9") = (__NR_##name); \
50   __asm__ __volatile__ (".ifnc %0%1%3,$r10$r9$r11\n\t" \
51 			".err\n\t" \
52 			".endif\n\t" \
53 			"break 13" \
54 			: "=r" (__a) \
55 			: "r" (__n_), "0" (__a), "r" (__b)); \
56   if (__a >= 0) \
57      return (type) __a; \
58   errno = -__a; \
59   return (type) -1; \
60 }
61 
62 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
63 type name(type1 arg1,type2 arg2,type3 arg3) \
64 { \
65   register long __a __asm__ ("r10") = (long) arg1; \
66   register long __b __asm__ ("r11") = (long) arg2; \
67   register long __c __asm__ ("r12") = (long) arg3; \
68   register long __n_ __asm__ ("r9") = (__NR_##name); \
69   __asm__ __volatile__ (".ifnc %0%1%3%4,$r10$r9$r11$r12\n\t" \
70 			".err\n\t" \
71 			".endif\n\t" \
72 			"break 13" \
73 			: "=r" (__a) \
74 			: "r" (__n_), "0" (__a), "r" (__b), "r" (__c)); \
75   if (__a >= 0) \
76      return (type) __a; \
77   errno = -__a; \
78   return (type) -1; \
79 }
80 
81 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
82 type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
83 { \
84   register long __a __asm__ ("r10") = (long) arg1; \
85   register long __b __asm__ ("r11") = (long) arg2; \
86   register long __c __asm__ ("r12") = (long) arg3; \
87   register long __d __asm__ ("r13") = (long) arg4; \
88   register long __n_ __asm__ ("r9") = (__NR_##name); \
89   __asm__ __volatile__ (".ifnc %0%1%3%4%5,$r10$r9$r11$r12$r13\n\t" \
90 			".err\n\t" \
91 			".endif\n\t" \
92 			"break 13" \
93 			: "=r" (__a) \
94 			: "r" (__n_), "0" (__a), "r" (__b), \
95 			  "r" (__c), "r" (__d)); \
96   if (__a >= 0) \
97      return (type) __a; \
98   errno = -__a; \
99   return (type) -1; \
100 }
101 
102 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
103 	  type5,arg5) \
104 type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
105 { \
106   register long __a __asm__ ("r10") = (long) arg1; \
107   register long __b __asm__ ("r11") = (long) arg2; \
108   register long __c __asm__ ("r12") = (long) arg3; \
109   register long __d __asm__ ("r13") = (long) arg4; \
110   register long __n_ __asm__ ("r9") = (__NR_##name); \
111   __asm__ __volatile__ (".ifnc %0%1%3%4%5,$r10$r9$r11$r12$r13\n\t" \
112 			".err\n\t" \
113 			".endif\n\t" \
114 			"move %6,$mof\n\t" \
115 			"break 13" \
116 			: "=r" (__a) \
117 			: "r" (__n_), "0" (__a), "r" (__b), \
118 			  "r" (__c), "r" (__d), "g" (arg5)); \
119   if (__a >= 0) \
120      return (type) __a; \
121   errno = -__a; \
122   return (type) -1; \
123 }
124 
125 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
126 	  type5,arg5,type6,arg6) \
127 type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
128 { \
129   register long __a __asm__ ("r10") = (long) arg1; \
130   register long __b __asm__ ("r11") = (long) arg2; \
131   register long __c __asm__ ("r12") = (long) arg3; \
132   register long __d __asm__ ("r13") = (long) arg4; \
133   register long __n_ __asm__ ("r9") = (__NR_##name); \
134   __asm__ __volatile__ (".ifnc %0%1%3%4%5,$r10$r9$r11$r12$r13\n\t" \
135 			".err\n\t" \
136 			".endif\n\t" \
137 			"move %6,$mof\n\tmove %7,$srp\n\t" \
138 			"break 13" \
139 			: "=r" (__a) \
140 			: "r" (__n_), "0" (__a), "r" (__b), \
141 			  "r" (__c), "r" (__d), "g" (arg5), "g" (arg6)\
142 			: "srp"); \
143   if (__a >= 0) \
144      return (type) __a; \
145   errno = -__a; \
146   return (type) -1; \
147 }
148 
149 #endif
150