1 #ifndef _BITS_SYSCALLS_H 2 #define _BITS_SYSCALLS_H 3 4 #ifndef _SYSCALL_H 5 #error "Never use <bits/syscall.h> directly; include <sys/syscall.h> instead." 6 #endif 7 8 #ifndef __ASSEMBLER__ 9 10 #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ 11 (__extension__ \ 12 ({ \ 13 register unsigned long __res __asm__ ("r10"); \ 14 LOAD_ARGS_c_##nr(args) \ 15 register unsigned long __callno __asm__ ("r9") \ 16 = name; \ 17 __asm__ __volatile__ (LOAD_ARGS_asm_##nr (args) \ 18 CHECK_ARGS_asm_##nr \ 19 "break 13" \ 20 : "=r" (__res) \ 21 : ASM_ARGS_##nr (args) \ 22 : ASM_CLOBBER_##nr); \ 23 __res; \ 24 }) \ 25 ) 26 #define LOAD_ARGS_c_0() 27 #define LOAD_ARGS_asm_0() 28 #define ASM_CLOBBER_0 "memory" 29 #define ASM_ARGS_0() "r" (__callno) 30 #define CHECK_ARGS_asm_0 31 32 #define LOAD_ARGS_c_1(r10) \ 33 LOAD_ARGS_c_0() \ 34 register unsigned long __r10 __asm__ ("r10") = (unsigned long) (r10); 35 #define LOAD_ARGS_asm_1(r10) LOAD_ARGS_asm_0 () 36 #define ASM_CLOBBER_1 ASM_CLOBBER_0 37 #define ASM_ARGS_1(r10) ASM_ARGS_0 (), "0" (__r10) 38 #define CHECK_ARGS_asm_1 \ 39 ".ifnc %0,$r10\n\t" \ 40 ".err\n\t" \ 41 ".endif\n\t" 42 43 #define LOAD_ARGS_c_2(r10, r11) \ 44 LOAD_ARGS_c_1(r10) \ 45 register unsigned long __r11 __asm__ ("r11") = (unsigned long) (r11); 46 #define LOAD_ARGS_asm_2(r10, r11) LOAD_ARGS_asm_1 (r10) 47 #define ASM_CLOBBER_2 ASM_CLOBBER_1 48 #define ASM_ARGS_2(r10, r11) ASM_ARGS_1 (r10), "r" (__r11) 49 #define CHECK_ARGS_asm_2 \ 50 ".ifnc %0-%3,$r10-$r11\n\t" \ 51 ".err\n\t" \ 52 ".endif\n\t" 53 54 #define LOAD_ARGS_c_3(r10, r11, r12) \ 55 LOAD_ARGS_c_2(r10, r11) \ 56 register unsigned long __r12 __asm__ ("r12") = (unsigned long) (r12); 57 #define LOAD_ARGS_asm_3(r10, r11, r12) LOAD_ARGS_asm_2 (r10, r11) 58 #define ASM_CLOBBER_3 ASM_CLOBBER_2 59 #define ASM_ARGS_3(r10, r11, r12) ASM_ARGS_2 (r10, r11), "r" (__r12) 60 #define CHECK_ARGS_asm_3 \ 61 ".ifnc %0-%3-%4,$r10-$r11-$r12\n\t" \ 62 ".err\n\t" \ 63 ".endif\n\t" 64 65 #define LOAD_ARGS_c_4(r10, r11, r12, r13) \ 66 LOAD_ARGS_c_3(r10, r11, r12) \ 67 register unsigned long __r13 __asm__ ("r13") = (unsigned long) (r13); 68 #define LOAD_ARGS_asm_4(r10, r11, r12, r13) LOAD_ARGS_asm_3 (r10, r11, r12) 69 #define ASM_CLOBBER_4 ASM_CLOBBER_3 70 #define ASM_ARGS_4(r10, r11, r12, r13) ASM_ARGS_3 (r10, r11, r12), "r" (__r13) 71 #define CHECK_ARGS_asm_4 \ 72 ".ifnc %0-%3-%4-%5,$r10-$r11-$r12-$r13\n\t" \ 73 ".err\n\t" \ 74 ".endif\n\t" 75 76 #define LOAD_ARGS_c_5(r10, r11, r12, r13, mof) \ 77 LOAD_ARGS_c_4(r10, r11, r12, r13) 78 #define LOAD_ARGS_asm_5(r10, r11, r12, r13, mof) \ 79 LOAD_ARGS_asm_4 (r10, r11, r12, r13) "move %6,$mof\n\t" 80 #define ASM_CLOBBER_5 ASM_CLOBBER_4 81 #define ASM_ARGS_5(r10, r11, r12, r13, mof) \ 82 ASM_ARGS_4 (r10, r11, r12, r13), "g" (mof) 83 #define CHECK_ARGS_asm_5 CHECK_ARGS_asm_4 84 85 #define LOAD_ARGS_c_6(r10, r11, r12, r13, mof, srp) \ 86 LOAD_ARGS_c_5(r10, r11, r12, r13, mof) 87 #define LOAD_ARGS_asm_6(r10, r11, r12, r13, mof, srp) \ 88 LOAD_ARGS_asm_5(r10, r11, r12, r13, mof) \ 89 "move %7,$srp\n\t" 90 #define ASM_CLOBBER_6 ASM_CLOBBER_5, "srp" 91 #define ASM_ARGS_6(r10, r11, r12, r13, mof, srp) \ 92 ASM_ARGS_5 (r10, r11, r12, r13, mof), "g" (srp) 93 #define CHECK_ARGS_asm_6 CHECK_ARGS_asm_5 94 95 #endif /* not __ASSEMBLER__ */ 96 #endif /* _BITS_SYSCALLS_H */ 97