syscalls.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. #ifndef _BITS_SYSCALLS_H
  7. #define _BITS_SYSCALLS_H
  8. #ifndef _SYSCALL_H
  9. # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
  10. #endif
  11. #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
  12. ({ long _sys_result; \
  13. { \
  14. register long int _a7 __asm__ ("a7"); \
  15. LOAD_ARGS_##nr (args) \
  16. _a7 = (name); \
  17. \
  18. __asm__ volatile ( \
  19. "scall\n\t" \
  20. : "=r" (_a0) \
  21. : "r"(_a7) ASM_ARGS_##nr \
  22. : "memory"); \
  23. _sys_result = _a0; \
  24. } \
  25. _sys_result; \
  26. })
  27. /* Macros for setting up inline __asm__ input regs */
  28. # define ASM_ARGS_0
  29. # define ASM_ARGS_1 , "r" (_a0)
  30. # define ASM_ARGS_2 ASM_ARGS_1, "r" (_a1)
  31. # define ASM_ARGS_3 ASM_ARGS_2, "r" (_a2)
  32. # define ASM_ARGS_4 ASM_ARGS_3, "r" (_a3)
  33. # define ASM_ARGS_5 ASM_ARGS_4, "r" (_a4)
  34. # define ASM_ARGS_6 ASM_ARGS_5, "r" (_a5)
  35. # define ASM_ARGS_7 ASM_ARGS_6, "r" (_a6)
  36. /* Macros for converting sys-call wrapper args into sys call args */
  37. # define LOAD_ARGS_0() \
  38. register long _a0 __asm__ ("a0");
  39. # define LOAD_ARGS_1(a0) \
  40. long _a0tmp; \
  41. LOAD_ARGS_0 () \
  42. _a0tmp = (long) (a0); \
  43. _a0 = _a0tmp;
  44. # define LOAD_ARGS_2(a0, a1) \
  45. register long _a1 __asm__ ("a1"); \
  46. long _a1tmp; \
  47. LOAD_ARGS_1 (a0) \
  48. _a1tmp = (long) (a1); \
  49. _a1 = _a1tmp;
  50. # define LOAD_ARGS_3(a0, a1, a2) \
  51. register long _a2 __asm__ ("a2"); \
  52. long _a2tmp; \
  53. LOAD_ARGS_2 (a0, a1) \
  54. _a2tmp = (long) (a2); \
  55. _a2 = _a2tmp;
  56. # define LOAD_ARGS_4(a0, a1, a2, a3) \
  57. register long _a3 __asm__ ("a3"); \
  58. long _a3tmp; \
  59. LOAD_ARGS_3 (a0, a1, a2) \
  60. _a3tmp = (long) (a3); \
  61. _a3 = _a3tmp;
  62. # define LOAD_ARGS_5(a0, a1, a2, a3, a4) \
  63. register long _a4 __asm__ ("a4"); \
  64. long _a4tmp; \
  65. LOAD_ARGS_4 (a0, a1, a2, a3) \
  66. _a4tmp = (long) (a4); \
  67. _a4 = _a4tmp;
  68. # define LOAD_ARGS_6(a0, a1, a2, a3, a4, a5) \
  69. register long _a5 __asm__ ("a5"); \
  70. long _a5tmp; \
  71. LOAD_ARGS_5 (a0, a1, a2, a3, a4) \
  72. _a5tmp = (long) (a5); \
  73. _a5 = _a5tmp;
  74. # define LOAD_ARGS_7(a0, a1, a2, a3, a4, a5, a6)\
  75. register long _a6 __asm__ ("a6"); \
  76. long _a6tmp; \
  77. LOAD_ARGS_6 (a0, a1, a2, a3, a4, a5) \
  78. _a6tmp = (long) (a6); \
  79. _a6 = _a6tmp;
  80. #endif