1 #ifndef _BITS_SYSCALLS_H
2 #define _BITS_SYSCALLS_H
4 # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
7 /* The Linux kernel uses different trap numbers on sh-2. */
8 #if defined __sh2__ || defined __SH2A__
9 # define __SH_SYSCALL_TRAP_BASE 0x20
11 # define __SH_SYSCALL_TRAP_BASE 0x10
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)
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"
31 # define SYSCALL_INST_PAD
40 , "r" (r4), "r" (r5), "r" (r6)
42 , "r" (r4), "r" (r5), "r" (r6), "r" (r7)
44 , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0)
46 , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1)
48 , "r" (r4), "r" (r5), "r" (r6), "r" (r7), "0" (r0), "r" (r1), "r" (r2)
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)
115 /* The _NCS variant allows non-constant syscall numbers. */
116 #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
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 \
124 : "r" (r3) ASMFMT_##nr \
130 #define INTERNAL_SYSCALL_ERROR_P(val, err) \
131 ((unsigned int) (val) >= 0xfffff001u)
133 #endif /* __ASSEMBLER__ */
134 #endif /* _BITS_SYSCALLS_H */