]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4re-core/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/sh/bits/syscalls.h
Update
[l4.git] / l4 / pkg / l4re-core / uclibc / lib / contrib / uclibc / libc / sysdeps / linux / sh / bits / syscalls.h
1 #ifndef _BITS_SYSCALLS_H
2 #define _BITS_SYSCALLS_H
3 #ifndef _SYSCALL_H
4 # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
5 #endif
6
7 /* The Linux kernel uses different trap numbers on sh-2.  */
8 #if defined __sh2__ || defined __SH2A__
9 # define __SH_SYSCALL_TRAP_BASE 0x20
10 #else
11 # define __SH_SYSCALL_TRAP_BASE 0x10
12 #endif
13
14 #ifndef __ASSEMBLER__
15
16 #include <errno.h>
17
18 #define SYSCALL_INST_STR(x)     "trapa #"__stringify(__SH_SYSCALL_TRAP_BASE + x)"\n\t"
19 #define SYSCALL_INST_STR0       SYSCALL_INST_STR(0)
20 #define SYSCALL_INST_STR1       SYSCALL_INST_STR(1)
21 #define SYSCALL_INST_STR2       SYSCALL_INST_STR(2)
22 #define SYSCALL_INST_STR3       SYSCALL_INST_STR(3)
23 #define SYSCALL_INST_STR4       SYSCALL_INST_STR(4)
24 #define SYSCALL_INST_STR5       SYSCALL_INST_STR(5)
25 #define SYSCALL_INST_STR6       SYSCALL_INST_STR(6)
26
27 # ifdef NEED_SYSCALL_INST_PAD
28 #  define SYSCALL_INST_PAD "\
29         or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0"
30 # else
31 #  define SYSCALL_INST_PAD
32 # endif
33
34 #define ASMFMT_0
35 #define ASMFMT_1 \
36         , "r" (r4)
37 #define ASMFMT_2 \
38         , "r" (r4), "r" (r5)
39 #define ASMFMT_3 \
40         , "r" (r4), "r" (r5), "r" (r6)
41 #define ASMFMT_4 \
42         , "r" (r4), "r" (r5), "r" (r6), "r" (r7)
43 #define ASMFMT_5 \
44         , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0)
45 #define ASMFMT_6 \
46         , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1)
47 #define ASMFMT_7 \
48         , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1), "r" (r2)
49
50 #define SUBSTITUTE_ARGS_0()
51 #define SUBSTITUTE_ARGS_1(arg1) \
52         long int _arg1 = (long int) (arg1);                                   \
53         register long int r4 __asm__ ("%r4") = (long int) (_arg1)
54 #define SUBSTITUTE_ARGS_2(arg1, arg2) \
55         long int _arg1 = (long int) (arg1);                                   \
56         long int _arg2 = (long int) (arg2);                                   \
57         register long int r4 __asm__ ("%r4") = (long int) (_arg1);                    \
58         register long int r5 __asm__ ("%r5") = (long int) (_arg2)
59 #define SUBSTITUTE_ARGS_3(arg1, arg2, arg3) \
60         long int _arg1 = (long int) (arg1);                                   \
61         long int _arg2 = (long int) (arg2);                                   \
62         long int _arg3 = (long int) (arg3);                                   \
63         register long int r4 __asm__ ("%r4") = (long int) (_arg1);                    \
64         register long int r5 __asm__ ("%r5") = (long int) (_arg2);                    \
65         register long int r6 __asm__ ("%r6") = (long int) (_arg3)
66 #define SUBSTITUTE_ARGS_4(arg1, arg2, arg3, arg4) \
67         long int _arg1 = (long int) (arg1);                                   \
68         long int _arg2 = (long int) (arg2);                                   \
69         long int _arg3 = (long int) (arg3);                                   \
70         long int _arg4 = (long int) (arg4);                                   \
71         register long int r4 __asm__ ("%r4") = (long int) (_arg1);                    \
72         register long int r5 __asm__ ("%r5") = (long int) (_arg2);                    \
73         register long int r6 __asm__ ("%r6") = (long int) (_arg3);                    \
74         register long int r7 __asm__ ("%r7") = (long int) (_arg4)
75 #define SUBSTITUTE_ARGS_5(arg1, arg2, arg3, arg4, arg5) \
76         long int _arg1 = (long int) (arg1);                                   \
77         long int _arg2 = (long int) (arg2);                                   \
78         long int _arg3 = (long int) (arg3);                                   \
79         long int _arg4 = (long int) (arg4);                                   \
80         long int _arg5 = (long int) (arg5);                                   \
81         register long int r4 __asm__ ("%r4") = (long int) (_arg1);                    \
82         register long int r5 __asm__ ("%r5") = (long int) (_arg2);                    \
83         register long int r6 __asm__ ("%r6") = (long int) (_arg3);                    \
84         register long int r7 __asm__ ("%r7") = (long int) (_arg4);                    \
85         register long int r0 __asm__ ("%r0") = (long int) (_arg5)
86 #define SUBSTITUTE_ARGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \
87         long int _arg1 = (long int) (arg1);                                   \
88         long int _arg2 = (long int) (arg2);                                   \
89         long int _arg3 = (long int) (arg3);                                   \
90         long int _arg4 = (long int) (arg4);                                   \
91         long int _arg5 = (long int) (arg5);                                   \
92         long int _arg6 = (long int) (arg6);                                   \
93         register long int r4 __asm__ ("%r4") = (long int)(_arg1);                     \
94         register long int r5 __asm__ ("%r5") = (long int) (_arg2);                    \
95         register long int r6 __asm__ ("%r6") = (long int) (_arg3);                    \
96         register long int r7 __asm__ ("%r7") = (long int) (_arg4);                    \
97         register long int r0 __asm__ ("%r0") = (long int) (_arg5);                    \
98         register long int r1 __asm__ ("%r1") = (long int) (_arg6)
99 #define SUBSTITUTE_ARGS_7(arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
100         long int _arg1 = (long int) (arg1);                                   \
101         long int _arg2 = (long int) (arg2);                                   \
102         long int _arg3 = (long int) (arg3);                                   \
103         long int _arg4 = (long int) (arg4);                                   \
104         long int _arg5 = (long int) (arg5);                                   \
105         long int _arg6 = (long int) (arg6);                                   \
106         long int _arg7 = (long int) (arg7);                                   \
107         register long int r4 __asm__ ("%r4") = (long int) (_arg1);                    \
108         register long int r5 __asm__ ("%r5") = (long int) (_arg2);                    \
109         register long int r6 __asm__ ("%r6") = (long int) (_arg3);                    \
110         register long int r7 __asm__ ("%r7") = (long int) (_arg4);                    \
111         register long int r0 __asm__ ("%r0") = (long int) (_arg5);                    \
112         register long int r1 __asm__ ("%r1") = (long int) (_arg6);                    \
113         register long int r2 __asm__ ("%r2") = (long int) (_arg7)
114
115 /* The _NCS variant allows non-constant syscall numbers.  */
116 #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
117 (__extension__ \
118   ({                                                                                                                    \
119     unsigned long int resultvar;                                                                \
120     register long int r3 __asm__ ("%r3") = (name);                              \
121     SUBSTITUTE_ARGS_##nr(args);                                                                 \
122     __asm__ __volatile__ (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \
123                   : "=z" (resultvar)                                                                    \
124                   : "r" (r3) ASMFMT_##nr                                                                \
125                   : "memory"                                                                                    \
126     );                                                                                                                  \
127     (int) resultvar;                                                                                    \
128    }) \
129 )
130 #define INTERNAL_SYSCALL_ERROR_P(val, err) \
131   ((unsigned int) (val) >= 0xfffff001u)
132
133 #endif /* __ASSEMBLER__ */
134 #endif /* _BITS_SYSCALLS_H */
135