dl-syscalls.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. * This file contains the system call macros and syscall
  3. * numbers used by the shared library loader.
  4. *
  5. * NOTE: This should be integrated/moved to
  6. * sysdeps/linux/sparc/bits/syscalls.h at some point ...
  7. */
  8. #define MMAP_HAS_6_ARGS
  9. #define __NR_exit 1
  10. #define __NR_read 3
  11. #define __NR_write 4
  12. #define __NR_open 5
  13. #define __NR_close 6
  14. #define __NR_getpid 20
  15. #define __NR_getuid 24
  16. #define __NR_getgid 47
  17. #define __NR_geteuid 49
  18. #define __NR_getegid 50
  19. #define __NR_readlink 58
  20. #define __NR_mmap 71
  21. #define __NR_munmap 73
  22. #define __NR_stat 38
  23. #define __NR_mprotect 74
  24. /* We can't use the real errno in ldso, since it has not yet
  25. * been dynamicly linked in yet. */
  26. extern int _dl_errno;
  27. #define __set_errno(X) {(_dl_errno) = (X);}
  28. /* Here are the macros which define how this platform makes
  29. * system calls. This particular variant does _not_ set
  30. * errno (note how _dl_errno is used in __syscall_return) since
  31. * these will get called before the errno symbol is dynamicly
  32. * linked. */
  33. #define __syscall_return(type, res) \
  34. do { \
  35. if (res < -255 || res >= 0) \
  36. return (type) res; \
  37. __set_errno(-res); \
  38. res = -1; \
  39. return (type) res; \
  40. } while (0)
  41. #define _syscall0(type,name) \
  42. type name(void) \
  43. { \
  44. long __res; \
  45. register long __g1 __asm__ ("g1") = __NR_##name; \
  46. __asm__ __volatile__ ( \
  47. "t 0x10\n\t" \
  48. "bcc 1f\n\t" \
  49. "mov %%o0, %0\n\t" \
  50. "sub %%g0, %%o0, %0\n\t" \
  51. "1:\n\t" \
  52. : "=r" (__res)\
  53. : "r" (__g1) \
  54. : "o0", "cc"); \
  55. __syscall_return(type, __res); \
  56. }
  57. #define _syscall1(type,name,type1,arg1) \
  58. type name(type1 arg1) \
  59. { \
  60. long __res; \
  61. register long __g1 __asm__ ("g1") = __NR_##name; \
  62. register long __o0 __asm__ ("o0") = (long)(arg1); \
  63. __asm__ __volatile__ ( \
  64. "t 0x10\n\t" \
  65. "bcc 1f\n\t" \
  66. "mov %%o0, %0\n\t" \
  67. "sub %%g0, %%o0, %0\n\t" \
  68. "1:\n\t" \
  69. : "=r" (__res), "=&r" (__o0) \
  70. : "1" (__o0), "r" (__g1) \
  71. : "cc"); \
  72. __syscall_return(type, __res); \
  73. }
  74. #define _syscall2(type,name,type1,arg1,type2,arg2) \
  75. type name(type1 arg1,type2 arg2) \
  76. { \
  77. long __res; \
  78. register long __g1 __asm__ ("g1") = __NR_##name; \
  79. register long __o0 __asm__ ("o0") = (long)(arg1); \
  80. register long __o1 __asm__ ("o1") = (long)(arg2); \
  81. __asm__ __volatile__ ( \
  82. "t 0x10\n\t" \
  83. "bcc 1f\n\t" \
  84. "mov %%o0, %0\n\t" \
  85. "sub %%g0, %%o0, %0\n\t" \
  86. "1:\n\t" \
  87. : "=r" (__res), "=&r" (__o0) \
  88. : "1" (__o0), "r" (__o1), "r" (__g1) \
  89. : "cc"); \
  90. __syscall_return(type, __res); \
  91. }
  92. #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
  93. type name(type1 arg1,type2 arg2,type3 arg3) \
  94. { \
  95. long __res; \
  96. register long __g1 __asm__ ("g1") = __NR_##name; \
  97. register long __o0 __asm__ ("o0") = (long)(arg1); \
  98. register long __o1 __asm__ ("o1") = (long)(arg2); \
  99. register long __o2 __asm__ ("o2") = (long)(arg3); \
  100. __asm__ __volatile__ ( \
  101. "t 0x10\n\t" \
  102. "bcc 1f\n\t" \
  103. "mov %%o0, %0\n\t" \
  104. "sub %%g0, %%o0, %0\n\t" \
  105. "1:\n\t" \
  106. : "=r" (__res), "=&r" (__o0) \
  107. : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) \
  108. : "cc"); \
  109. __syscall_return(type, __res); \
  110. }
  111. #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
  112. type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
  113. { \
  114. long __res; \
  115. register long __g1 __asm__ ("g1") = __NR_##name; \
  116. register long __o0 __asm__ ("o0") = (long)(arg1); \
  117. register long __o1 __asm__ ("o1") = (long)(arg2); \
  118. register long __o2 __asm__ ("o2") = (long)(arg3); \
  119. register long __o3 __asm__ ("o3") = (long)(arg4); \
  120. __asm__ __volatile__ ( \
  121. "t 0x10\n\t" \
  122. "bcc 1f\n\t" \
  123. "mov %%o0, %0\n\t" \
  124. "sub %%g0, %%o0, %0\n\t" \
  125. "1:\n\t" \
  126. : "=r" (__res), "=&r" (__o0) \
  127. : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__g1) \
  128. : "cc"); \
  129. __syscall_return(type, __res); \
  130. }
  131. #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
  132. type5,arg5) \
  133. type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
  134. { \
  135. long __res; \
  136. register long __g1 __asm__ ("g1") = __NR_##name; \
  137. register long __o0 __asm__ ("o0") = (long)(arg1); \
  138. register long __o1 __asm__ ("o1") = (long)(arg2); \
  139. register long __o2 __asm__ ("o2") = (long)(arg3); \
  140. register long __o3 __asm__ ("o3") = (long)(arg4); \
  141. register long __o4 __asm__ ("o4") = (long)(arg5); \
  142. __asm__ __volatile__ ( \
  143. "t 0x10\n\t" \
  144. "bcc 1f\n\t" \
  145. "mov %%o0, %0\n\t" \
  146. "sub %%g0, %%o0, %0\n\t" \
  147. "1:\n\t" \
  148. : "=r" (__res), "=&r" (__o0) \
  149. : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__g1) \
  150. : "cc"); \
  151. __syscall_return(type, __res); \
  152. }
  153. #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
  154. type5,arg5,type6,arg6) \
  155. type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
  156. { \
  157. long __res; \
  158. register long __g1 __asm__ ("g1") = __NR_##name; \
  159. register long __o0 __asm__ ("o0") = (long)(arg1); \
  160. register long __o1 __asm__ ("o1") = (long)(arg2); \
  161. register long __o2 __asm__ ("o2") = (long)(arg3); \
  162. register long __o3 __asm__ ("o3") = (long)(arg4); \
  163. register long __o4 __asm__ ("o4") = (long)(arg5); \
  164. register long __o5 __asm__ ("o5") = (long)(arg6); \
  165. __asm__ __volatile__ ( \
  166. "t 0x10\n\t" \
  167. "bcc 1f\n\t" \
  168. "mov %%o0, %0\n\t" \
  169. "sub %%g0, %%o0, %0\n\t" \
  170. "1:\n\t" \
  171. : "=r" (__res), "=&r" (__o0) \
  172. : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__o5), "r" (__g1) \
  173. : "cc"); \
  174. __syscall_return(type, __res); \
  175. }