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