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 #ifndef __ASSEMBLER__
8 
9 #include <errno.h>
10 
11 #define ASMFMT_0
12 #define ASMFMT_1 , "g"(er1)
13 #define ASMFMT_2 , "g"(er1), "g"(er2)
14 #define ASMFMT_3 , "g"(er1), "g"(er2), "g"(er3)
15 #define ASMFMT_4 , "g"(er1), "g"(er2), "g"(er3), "g"(er4)
16 #define ASMFMT_5 , "g"(er1), "g"(er2), "g"(er3), "g"(er4), "g"(er5)
17 #define ASMFMT_6 , "g"(er1), "g"(er2), "g"(er3), "g"(er4), "m"(er5), "m"(er6)
18 
19 #define SUBSTITUTE_ARGS_0() do {} while(0);
20 #define SUBSTITUTE_ARGS_1(arg1)			\
21 	register long int er1 __asm__("er1") = (long int)arg1;
22 #define SUBSTITUTE_ARGS_2(arg1, arg2)		\
23 	register long int er1 __asm__("er1") = (long int)arg1; \
24 	register long int er2 __asm__("er2") = (long int)arg2;
25 #define SUBSTITUTE_ARGS_3(arg1, arg2, arg3)	\
26 	register long int er1 __asm__("er1") = (long int)arg1; \
27 	register long int er2 __asm__("er2") = (long int)arg2; \
28 	register long int er3 __asm__("er3") = (long int)arg3;
29 #define SUBSTITUTE_ARGS_4(arg1, arg2, arg3, arg4)	     \
30 	register long int er1 __asm__("er1") = (long int)arg1; \
31 	register long int er2 __asm__("er2") = (long int)arg2; \
32 	register long int er3 __asm__("er3") = (long int)arg3; \
33 	register long int er4 __asm__("er4") = (long int)arg4;
34 #define SUBSTITUTE_ARGS_5(arg1, arg2, arg3, arg4, arg5)   \
35 	register long int er1 __asm__("er1") = (long int)arg1; \
36 	register long int er2 __asm__("er2") = (long int)arg2; \
37 	register long int er3 __asm__("er3") = (long int)arg3; \
38 	register long int er4 __asm__("er4") = (long int)arg4; \
39 	register long int er5 __asm__("er5") = (long int)arg5;
40 #define SUBSTITUTE_ARGS_6(arg1, arg2, arg3, arg4, arg5, arg6)	\
41 	register long int er1 __asm__("er1") = (long int)arg1; \
42 	register long int er2 __asm__("er2") = (long int)arg2; \
43 	register long int er3 __asm__("er3") = (long int)arg3; \
44 	register long int er4 __asm__("er4") = (long int)arg4; \
45 	long int er5 = (long int)arg5; \
46 	long int er6 = (long int)arg6;
47 
48 #define LOAD_ARGS_0
49 #define LOAD_ARGS_1
50 #define LOAD_ARGS_2
51 #define LOAD_ARGS_3
52 #define LOAD_ARGS_4
53 #define LOAD_ARGS_5
54 #define LOAD_ARGS_6	"mov.l er5,@-sp\n\tmov.l %6,er5\n\t" \
55 			"mov.l er6,@-sp\n\tmov.l %7,er6\n\t"
56 
57 #define RESTORE_ARGS_0
58 #define RESTORE_ARGS_1
59 #define RESTORE_ARGS_2
60 #define RESTORE_ARGS_3
61 #define RESTORE_ARGS_4
62 #define RESTORE_ARGS_5
63 #define RESTORE_ARGS_6	"mov.l @sp+,er6\n\tmov.l @sp+,er5"
64 
65 /* The _NCS variant allows non-constant syscall numbers.  */
66 #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
67 (__extension__ \
68   ({							\
69     register long int er0 __asm__ ("er0");		\
70     SUBSTITUTE_ARGS_##nr(args)				\
71     __asm__ __volatile__ ( 				\
72 		LOAD_ARGS_##nr				\
73 		"mov.l %1,er0\n\t"			\
74 		"trapa #0\n\t"				\
75 		RESTORE_ARGS_##nr			\
76 		: "=r" (er0)				\
77 		: "ir" (name) ASMFMT_##nr		\
78 		: "memory"				\
79     );							\
80     (int) er0;						\
81    }) \
82 )
83 
84 #endif /* __ASSEMBLER__ */
85 #endif /* _BITS_SYSCALLS_H */
86