chiark / gitweb /
4c795a43caf7cb9ac985070cfa95b58b88641f9a
[elogind.git] / klibc / include / arch / ia64 / klibc / archsys.h
1 /*
2  * arch/ia64/include/klibc/archsys.h
3  *
4  * Architecture-specific syscall definitions
5  */
6
7 #ifndef _KLIBC_ARCHSYS_H
8 #define _KLIBC_ARCHSYS_H
9
10 #define __IA64_BREAK "break 0x100000;;\n\t"
11
12 #define _syscall0(type,name)                                            \
13 type                                                                    \
14 name (void)                                                             \
15 {                                                                       \
16        register long _r8 asm ("r8");                                    \
17        register long _r10 asm ("r10");                                  \
18        register long _r15 asm ("r15") = __NR_##name;                    \
19        long _retval;                                                    \
20        __asm __volatile (__IA64_BREAK                                   \
21                          : "=r" (_r8), "=r" (_r10), "=r" (_r15)         \
22                          : "2" (_r15) ASM_ARGS_0                        \
23                          : "memory" ASM_CLOBBERS_0);                    \
24        _retval = _r8;                                                   \
25        if (_r10 == -1) {                                                \
26                errno = (_retval);                                       \
27                _retval = -1;                                            \
28        }                                                                \
29        return (type)_retval;                                                  \
30 }
31
32 #define _syscall1(type,name,type1,arg1)                                 \
33 type                                                                    \
34 name (type1 arg1)                                                       \
35 {                                                                       \
36        register long _r8 asm ("r8");                                    \
37        register long _r10 asm ("r10");                                  \
38        register long _r15 asm ("r15") = __NR_##name;                    \
39        long _retval;                                                    \
40        LOAD_ARGS_1(arg1);                                               \
41        __asm __volatile (__IA64_BREAK                                   \
42                          : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
43                            ASM_OUTARGS_1                                \
44                          : "2" (_r15) ASM_ARGS_1                        \
45                          : "memory" ASM_CLOBBERS_1);                    \
46        _retval = _r8;                                                   \
47        if (_r10 == -1) {                                                \
48                errno = (_retval);                                       \
49                _retval = -1;                                            \
50        }                                                                \
51        return (type)_retval;                                                  \
52 }
53
54 #define _syscall2(type,name,type1,arg1,type2,arg2)                      \
55 type                                                                    \
56 name (type1 arg1, type2 arg2)                                           \
57 {                                                                       \
58        register long _r8 asm ("r8");                                    \
59        register long _r10 asm ("r10");                                  \
60        register long _r15 asm ("r15") = __NR_##name;                    \
61        long _retval;                                                    \
62        LOAD_ARGS_2(arg1, arg2);                                         \
63        __asm __volatile (__IA64_BREAK                                   \
64                          : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
65                            ASM_OUTARGS_2                                \
66                          : "2" (_r15) ASM_ARGS_2                        \
67                          : "memory" ASM_CLOBBERS_2);                    \
68        _retval = _r8;                                                   \
69        if (_r10 == -1) {                                                \
70                errno = (_retval);                                       \
71                _retval = -1;                                            \
72        }                                                                \
73        return (type)_retval;                                                  \
74 }
75
76 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)           \
77 type                                                                    \
78 name (type1 arg1, type2 arg2, type3 arg3)                               \
79 {                                                                       \
80        register long _r8 asm ("r8");                                    \
81        register long _r10 asm ("r10");                                  \
82        register long _r15 asm ("r15") = __NR_##name;                    \
83        long _retval;                                                    \
84        LOAD_ARGS_3(arg1, arg2, arg3);                                   \
85        __asm __volatile (__IA64_BREAK                                   \
86                          : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
87                            ASM_OUTARGS_3                                \
88                          : "2" (_r15) ASM_ARGS_3                        \
89                          : "memory" ASM_CLOBBERS_3);                    \
90        _retval = _r8;                                                   \
91        if (_r10 == -1) {                                                \
92                errno = (_retval);                                       \
93                _retval = -1;                                            \
94        }                                                                \
95        return (type)_retval;                                                  \
96 }
97
98 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
99 type                                                                    \
100 name (type1 arg1, type2 arg2, type3 arg3, type4 arg4)                   \
101 {                                                                       \
102        register long _r8 asm ("r8");                                    \
103        register long _r10 asm ("r10");                                  \
104        register long _r15 asm ("r15") = __NR_##name;                    \
105        long _retval;                                                    \
106        LOAD_ARGS_4(arg1, arg2, arg3, arg4);                             \
107        __asm __volatile (__IA64_BREAK                                   \
108                          : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
109                            ASM_OUTARGS_4                                \
110                          : "2" (_r15) ASM_ARGS_4                        \
111                          : "memory" ASM_CLOBBERS_4);                    \
112        _retval = _r8;                                                   \
113        if (_r10 == -1) {                                                \
114                errno = (_retval);                                       \
115                _retval = -1;                                            \
116        }                                                                \
117        return (type)_retval;                                                  \
118 }
119
120 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
121 type                                                                    \
122 name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)       \
123 {                                                                       \
124        register long _r8 asm ("r8");                                    \
125        register long _r10 asm ("r10");                                  \
126        register long _r15 asm ("r15") = __NR_##name;                    \
127        long _retval;                                                    \
128        LOAD_ARGS_5(arg1, arg2, arg3, arg4, arg5);                       \
129        __asm __volatile (__IA64_BREAK                                   \
130                          : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
131                            ASM_OUTARGS_5                                \
132                          : "2" (_r15) ASM_ARGS_5                        \
133                          : "memory" ASM_CLOBBERS_5);                    \
134        _retval = _r8;                                                   \
135        if (_r10 == -1) {                                                \
136                errno = (_retval);                                       \
137                _retval = -1;                                            \
138        }                                                                \
139        return (type)_retval;                                                  \
140 }
141
142 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \
143 type                                                                    \
144 name (type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6)       \
145 {                                                                       \
146        register long _r8 asm ("r8");                                    \
147        register long _r10 asm ("r10");                                  \
148        register long _r15 asm ("r15") = __NR_##name;                    \
149        long _retval;                                                    \
150        LOAD_ARGS_6(arg1, arg2, arg3, arg4, arg5, arg6);                 \
151        __asm __volatile (__IA64_BREAK                                   \
152                          : "=r" (_r8), "=r" (_r10), "=r" (_r15),        \
153                            ASM_OUTARGS_6                                \
154                          : "2" (_r15) ASM_ARGS_6                        \
155                          : "memory" ASM_CLOBBERS_6);                    \
156        _retval = _r8;                                                   \
157        if (_r10 == -1) {                                                \
158                errno = (_retval);                                       \
159                _retval = -1;                                            \
160        }                                                                \
161        return (type)_retval;                                                  \
162 }
163   
164
165 #define LOAD_ARGS_0()   do { } while (0)
166 #define LOAD_ARGS_1(out0)                               \
167   register long _out0 asm ("out0") = (long) (out0);     \
168   LOAD_ARGS_0 ()
169 #define LOAD_ARGS_2(out0, out1)                         \
170   register long _out1 asm ("out1") = (long) (out1);     \
171   LOAD_ARGS_1 (out0)
172 #define LOAD_ARGS_3(out0, out1, out2)                   \
173   register long _out2 asm ("out2") = (long) (out2);     \
174   LOAD_ARGS_2 (out0, out1)
175 #define LOAD_ARGS_4(out0, out1, out2, out3)             \
176   register long _out3 asm ("out3") = (long) (out3);     \
177   LOAD_ARGS_3 (out0, out1, out2)
178 #define LOAD_ARGS_5(out0, out1, out2, out3, out4)       \
179   register long _out4 asm ("out4") = (long) (out4);     \
180   LOAD_ARGS_4 (out0, out1, out2, out3)
181 #define LOAD_ARGS_6(out0, out1, out2, out3, out4, out5) \
182   register long _out5 asm ("out5") = (long) (out5);     \
183   LOAD_ARGS_5 (out0, out1, out2, out3, out4)
184
185 #define ASM_OUTARGS_1   "=r" (_out0)
186 #define ASM_OUTARGS_2   ASM_OUTARGS_1, "=r" (_out1)
187 #define ASM_OUTARGS_3   ASM_OUTARGS_2, "=r" (_out2)
188 #define ASM_OUTARGS_4   ASM_OUTARGS_3, "=r" (_out3)
189 #define ASM_OUTARGS_5   ASM_OUTARGS_4, "=r" (_out4)
190 #define ASM_OUTARGS_6   ASM_OUTARGS_5, "=r" (_out5)
191
192 #define ASM_ARGS_0
193 #define ASM_ARGS_1      ASM_ARGS_0, "3" (_out0)
194 #define ASM_ARGS_2      ASM_ARGS_1, "4" (_out1)
195 #define ASM_ARGS_3      ASM_ARGS_2, "5" (_out2)
196 #define ASM_ARGS_4      ASM_ARGS_3, "6" (_out3)
197 #define ASM_ARGS_5      ASM_ARGS_4, "7" (_out4)
198 #define ASM_ARGS_6      ASM_ARGS_5, "8" (_out5)
199
200 #define ASM_CLOBBERS_0  ASM_CLOBBERS_1, "out0"
201 #define ASM_CLOBBERS_1  ASM_CLOBBERS_2, "out1"
202 #define ASM_CLOBBERS_2  ASM_CLOBBERS_3, "out2"
203 #define ASM_CLOBBERS_3  ASM_CLOBBERS_4, "out3"
204 #define ASM_CLOBBERS_4  ASM_CLOBBERS_5, "out4"
205 #define ASM_CLOBBERS_5  ASM_CLOBBERS_6, "out5"
206 #define ASM_CLOBBERS_6  , "out6", "out7",                               \
207   /* Non-stacked integer registers, minus r8, r10, r15.  */             \
208   "r2", "r3", "r9", "r11", "r12", "r13", "r14", "r16", "r17", "r18",    \
209   "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27",        \
210   "r28", "r29", "r30", "r31",                                           \
211   /* Predicate registers.  */                                           \
212   "p6", "p7", "p8", "p9", "p10", "p11", "p12", "p13", "p14", "p15",     \
213   /* Non-rotating fp registers.  */                                     \
214   "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",     \
215   /* Branch registers.  */                                              \
216   "b6", "b7"
217
218 #endif /* _KLIBC_ARCHSYS_H */