syscalls.h 2.4 KB

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