sys32.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: sys32.S,v 1.12 2000/03/24 04:17:37 davem Exp $
  2.  * sys32.S: I-cache tricks for 32-bit compatability layer simple
  3.  *          conversions.
  4.  *
  5.  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
  6.  * Copyright (C) 1998 Jakub Jelinek   (jj@ultra.linux.cz)
  7.  */
  8. #include <asm/errno.h>
  9. /* NOTE: call as jump breaks return stack, we have to avoid that */
  10. .text
  11. .align 32
  12. .globl sys32_mmap
  13. sys32_mmap:
  14. srl %o4, 0, %o4
  15. sethi %hi(sys_mmap), %g1
  16. jmpl %g1 + %lo(sys_mmap), %g0
  17.  srl %o5, 0, %o5
  18. .align 32
  19. .globl sys32_lseek
  20. .globl sys32_chmod, sys32_mknod
  21. sys32_lseek:
  22. sra %o1, 0, %o1
  23. sethi %hi(sys_lseek), %g1
  24. jmpl %g1 + %lo(sys_lseek), %g0
  25.  nop
  26. sys32_chmod:
  27. sethi %hi(0xffff), %g2
  28. sethi %hi(sys_chmod), %g1
  29. orcc %g2, %lo(0xffff), %g2
  30. jmpl %g1 + %lo(sys_chmod), %g0
  31.  and %o1, %g2, %o1
  32. sys32_mknod:
  33. sethi %hi(0xffff), %g2
  34. sethi %hi(sys_mknod), %g1
  35. orcc %g2, %lo(0xffff), %g2
  36. jmpl %g1 + %lo(sys_mknod), %g0
  37.  and %o2, %g2, %o2
  38. .align 32
  39. .globl sys32_sendto, sys32_recvfrom
  40. sys32_sendto:
  41. sethi %hi(sys_sendto), %g1
  42. jmpl %g1 + %lo(sys_sendto), %g0
  43.  srl %o4, 0, %o4
  44. sys32_recvfrom:
  45. srl %o4, 0, %o4
  46. sethi %hi(sys_recvfrom), %g1
  47. jmpl %g1 + %lo(sys_recvfrom), %g0
  48.  srl %o5, 0, %o5
  49. .globl sys32_bdflush
  50. sys32_bdflush:
  51. sethi %hi(sys_bdflush), %g1
  52. jmpl %g1 + %lo(sys_bdflush), %g0
  53.  sra %o1, 0, %o1
  54. .align 32
  55. .globl sys32_mmap2
  56. sys32_mmap2:
  57. srl %o4, 0, %o4
  58. sethi %hi(sys_mmap), %g1
  59. srl %o5, 0, %o5
  60. jmpl %g1 + %lo(sys_mmap), %g0
  61.  sllx %o5, 12, %o5
  62. .align 32
  63. .globl sys32_socketcall
  64. sys32_socketcall: /* %o0=call, %o1=args */
  65. cmp %o0, 1
  66. bl,pn %xcc, do_einval
  67.  cmp %o0, 17
  68. bg,pn %xcc, do_einval
  69.  sub %o0, 1, %o0
  70. sllx %o0, 5, %o0
  71. sethi %hi(__socketcall_table_begin), %g2
  72. or %g2, %lo(__socketcall_table_begin), %g2
  73. jmpl %g2 + %o0, %g0
  74.  nop
  75. /* Each entry is exactly 32 bytes. */
  76. .align 32
  77. __socketcall_table_begin:
  78. do_sys_socket: /* sys_socket(int, int, int) */
  79. ldswa [%o1 + 0x0] %asi, %o0
  80. sethi %hi(sys_socket), %g1
  81. ldswa [%o1 + 0x8] %asi, %o2
  82. jmpl %g1 + %lo(sys_socket), %g0
  83.  ldswa [%o1 + 0x4] %asi, %o1
  84. nop
  85. nop
  86. nop
  87. do_sys_bind: /* sys_bind(int fd, struct sockaddr *, int) */
  88. ldswa [%o1 + 0x0] %asi, %o0
  89. sethi %hi(sys_bind), %g1
  90. ldswa [%o1 + 0x8] %asi, %o2
  91. jmpl %g1 + %lo(sys_bind), %g0
  92.  lduwa [%o1 + 0x4] %asi, %o1
  93. nop
  94. nop
  95. nop
  96. do_sys_connect: /* sys_connect(int, struct sockaddr *, int) */
  97. ldswa [%o1 + 0x0] %asi, %o0
  98. sethi %hi(sys_connect), %g1
  99. ldswa [%o1 + 0x8] %asi, %o2
  100. jmpl %g1 + %lo(sys_connect), %g0
  101.  lduwa [%o1 + 0x4] %asi, %o1
  102. nop
  103. nop
  104. nop
  105. do_sys_listen: /* sys_listen(int, int) */
  106. ldswa [%o1 + 0x0] %asi, %o0
  107. sethi %hi(sys_listen), %g1
  108. jmpl %g1 + %lo(sys_listen), %g0
  109.  ldswa [%o1 + 0x4] %asi, %o1
  110. nop
  111. nop
  112. nop
  113. nop
  114. do_sys_accept: /* sys_accept(int, struct sockaddr *, int *) */
  115. ldswa [%o1 + 0x0] %asi, %o0
  116. sethi %hi(sys_accept), %g1
  117. lduwa [%o1 + 0x8] %asi, %o2
  118. jmpl %g1 + %lo(sys_accept), %g0
  119.  lduwa [%o1 + 0x4] %asi, %o1
  120. nop
  121. nop
  122. nop
  123. do_sys_getsockname: /* sys_getsockname(int, struct sockaddr *, int *) */
  124. ldswa [%o1 + 0x0] %asi, %o0
  125. sethi %hi(sys_getsockname), %g1
  126. lduwa [%o1 + 0x8] %asi, %o2
  127. jmpl %g1 + %lo(sys_getsockname), %g0
  128.  lduwa [%o1 + 0x4] %asi, %o1
  129. nop
  130. nop
  131. nop
  132. do_sys_getpeername: /* sys_getpeername(int, struct sockaddr *, int *) */
  133. ldswa [%o1 + 0x0] %asi, %o0
  134. sethi %hi(sys_getpeername), %g1
  135. lduwa [%o1 + 0x8] %asi, %o2
  136. jmpl %g1 + %lo(sys_getpeername), %g0
  137.  lduwa [%o1 + 0x4] %asi, %o1
  138. nop
  139. nop
  140. nop
  141. do_sys_socketpair: /* sys_socketpair(int, int, int, int *) */
  142. ldswa [%o1 + 0x0] %asi, %o0
  143. sethi %hi(sys_socketpair), %g1
  144. ldswa [%o1 + 0x8] %asi, %o2
  145. lduwa [%o1 + 0xc] %asi, %o3
  146. jmpl %g1 + %lo(sys_socketpair), %g0
  147.  ldswa [%o1 + 0x4] %asi, %o1
  148. nop
  149. nop
  150. do_sys_send: /* sys_send(int, void *, size_t, unsigned int) */
  151. ldswa [%o1 + 0x0] %asi, %o0
  152. sethi %hi(sys_send), %g1
  153. lduwa [%o1 + 0x8] %asi, %o2
  154. lduwa [%o1 + 0xc] %asi, %o3
  155. jmpl %g1 + %lo(sys_send), %g0
  156.  lduwa [%o1 + 0x4] %asi, %o1
  157. nop
  158. nop
  159. do_sys_recv: /* sys_recv(int, void *, size_t, unsigned int) */
  160. ldswa [%o1 + 0x0] %asi, %o0
  161. sethi %hi(sys_recv), %g1
  162. lduwa [%o1 + 0x8] %asi, %o2
  163. lduwa [%o1 + 0xc] %asi, %o3
  164. jmpl %g1 + %lo(sys_recv), %g0
  165.  lduwa [%o1 + 0x4] %asi, %o1
  166. nop
  167. nop
  168. do_sys_sendto: /* sys32_sendto(int, u32, __kernel_size_t32, unsigned int, u32, int) */
  169. ldswa [%o1 + 0x0] %asi, %o0
  170. sethi %hi(sys32_sendto), %g1
  171. lduwa [%o1 + 0x8] %asi, %o2
  172. lduwa [%o1 + 0xc] %asi, %o3
  173. lduwa [%o1 + 0x10] %asi, %o4
  174. ldswa [%o1 + 0x14] %asi, %o5
  175. jmpl %g1 + %lo(sys32_sendto), %g0
  176.  lduwa [%o1 + 0x4] %asi, %o1
  177. do_sys_recvfrom: /* sys32_recvfrom(int, u32, __kernel_size_t32, unsigned int, u32, u32) */
  178. ldswa [%o1 + 0x0] %asi, %o0
  179. sethi %hi(sys32_recvfrom), %g1
  180. lduwa [%o1 + 0x8] %asi, %o2
  181. lduwa [%o1 + 0xc] %asi, %o3
  182. lduwa [%o1 + 0x10] %asi, %o4
  183. lduwa [%o1 + 0x14] %asi, %o5
  184. jmpl %g1 + %lo(sys32_recvfrom), %g0
  185.  lduwa [%o1 + 0x4] %asi, %o1
  186. do_sys_shutdown: /* sys_shutdown(int, int) */
  187. ldswa [%o1 + 0x0] %asi, %o0
  188. sethi %hi(sys_shutdown), %g1
  189. jmpl %g1 + %lo(sys_shutdown), %g0
  190.  ldswa [%o1 + 0x4] %asi, %o1
  191. nop
  192. nop
  193. nop
  194. nop
  195. do_sys_setsockopt: /* sys32_setsockopt(int, int, int, char *, int) */
  196. ldswa [%o1 + 0x0] %asi, %o0
  197. sethi %hi(sys32_setsockopt), %g1
  198. ldswa [%o1 + 0x8] %asi, %o2
  199. lduwa [%o1 + 0xc] %asi, %o3
  200. ldswa [%o1 + 0x10] %asi, %o4
  201. jmpl %g1 + %lo(sys32_setsockopt), %g0
  202.  ldswa [%o1 + 0x4] %asi, %o1
  203. nop
  204. do_sys_getsockopt: /* sys32_getsockopt(int, int, int, u32, u32) */
  205. ldswa [%o1 + 0x0] %asi, %o0
  206. sethi %hi(sys32_getsockopt), %g1
  207. ldswa [%o1 + 0x8] %asi, %o2
  208. lduwa [%o1 + 0xc] %asi, %o3
  209. lduwa [%o1 + 0x10] %asi, %o4
  210. jmpl %g1 + %lo(sys32_getsockopt), %g0
  211.  ldswa [%o1 + 0x4] %asi, %o1
  212. nop
  213. do_sys_sendmsg: /* sys32_sendmsg(int, struct msghdr32 *, unsigned int) */
  214. ldswa [%o1 + 0x0] %asi, %o0
  215. sethi %hi(sys32_sendmsg), %g1
  216. lduwa [%o1 + 0x8] %asi, %o2
  217. jmpl %g1 + %lo(sys32_sendmsg), %g0
  218.  lduwa [%o1 + 0x4] %asi, %o1
  219. nop
  220. nop
  221. nop
  222. do_sys_recvmsg: /* sys32_recvmsg(int, struct msghdr32 *, unsigned int) */
  223. ldswa [%o1 + 0x0] %asi, %o0
  224. sethi %hi(sys32_recvmsg), %g1
  225. lduwa [%o1 + 0x8] %asi, %o2
  226. jmpl %g1 + %lo(sys32_recvmsg), %g0
  227.  lduwa [%o1 + 0x4] %asi, %o1
  228. nop
  229. nop
  230. nop
  231. __socketcall_table_end:
  232. do_einval:
  233. retl
  234.  mov -EINVAL, %o0
  235. do_efault:
  236. retl
  237.  mov -EFAULT, %o0
  238. .section __ex_table
  239. .align 4
  240. .word __socketcall_table_begin, 0, __socketcall_table_end, do_efault
  241. .previous