1 /* 2 * Copyright (C) 2018 by Waldemar Brodkorb <wbx@uclibc-ng.org> 3 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. 4 * ported from GNU C Library 5 */ 6 7 #ifndef _BITS_SYSCALLS_H 8 #define _BITS_SYSCALLS_H 9 #ifndef _SYSCALL_H 10 # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead." 11 #endif 12 13 #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ 14 ({ long _sys_result; \ 15 { \ 16 register long int _a7 __asm__ ("a7"); \ 17 LOAD_ARGS_##nr (args) \ 18 _a7 = (name); \ 19 \ 20 __asm__ volatile ( \ 21 "scall\n\t" \ 22 : "=r" (_a0) \ 23 : "r"(_a7) ASM_ARGS_##nr \ 24 : "memory"); \ 25 _sys_result = _a0; \ 26 } \ 27 _sys_result; \ 28 }) 29 30 /* Macros for setting up inline __asm__ input regs */ 31 # define ASM_ARGS_0 32 # define ASM_ARGS_1 , "r" (_a0) 33 # define ASM_ARGS_2 ASM_ARGS_1, "r" (_a1) 34 # define ASM_ARGS_3 ASM_ARGS_2, "r" (_a2) 35 # define ASM_ARGS_4 ASM_ARGS_3, "r" (_a3) 36 # define ASM_ARGS_5 ASM_ARGS_4, "r" (_a4) 37 # define ASM_ARGS_6 ASM_ARGS_5, "r" (_a5) 38 # define ASM_ARGS_7 ASM_ARGS_6, "r" (_a6) 39 40 /* Macros for converting sys-call wrapper args into sys call args */ 41 # define LOAD_ARGS_0() \ 42 register long _a0 __asm__ ("a0"); 43 # define LOAD_ARGS_1(a0) \ 44 long _a0tmp; \ 45 LOAD_ARGS_0 () \ 46 _a0tmp = (long) (a0); \ 47 _a0 = _a0tmp; 48 # define LOAD_ARGS_2(a0, a1) \ 49 register long _a1 __asm__ ("a1"); \ 50 long _a1tmp; \ 51 LOAD_ARGS_1 (a0) \ 52 _a1tmp = (long) (a1); \ 53 _a1 = _a1tmp; 54 # define LOAD_ARGS_3(a0, a1, a2) \ 55 register long _a2 __asm__ ("a2"); \ 56 long _a2tmp; \ 57 LOAD_ARGS_2 (a0, a1) \ 58 _a2tmp = (long) (a2); \ 59 _a2 = _a2tmp; 60 # define LOAD_ARGS_4(a0, a1, a2, a3) \ 61 register long _a3 __asm__ ("a3"); \ 62 long _a3tmp; \ 63 LOAD_ARGS_3 (a0, a1, a2) \ 64 _a3tmp = (long) (a3); \ 65 _a3 = _a3tmp; 66 # define LOAD_ARGS_5(a0, a1, a2, a3, a4) \ 67 register long _a4 __asm__ ("a4"); \ 68 long _a4tmp; \ 69 LOAD_ARGS_4 (a0, a1, a2, a3) \ 70 _a4tmp = (long) (a4); \ 71 _a4 = _a4tmp; 72 # define LOAD_ARGS_6(a0, a1, a2, a3, a4, a5) \ 73 register long _a5 __asm__ ("a5"); \ 74 long _a5tmp; \ 75 LOAD_ARGS_5 (a0, a1, a2, a3, a4) \ 76 _a5tmp = (long) (a5); \ 77 _a5 = _a5tmp; 78 # define LOAD_ARGS_7(a0, a1, a2, a3, a4, a5, a6)\ 79 register long _a6 __asm__ ("a6"); \ 80 long _a6tmp; \ 81 LOAD_ARGS_6 (a0, a1, a2, a3, a4, a5) \ 82 _a6tmp = (long) (a6); \ 83 _a6 = _a6tmp; 84 85 #endif 86