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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  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.  * Copyright (C) 2000 Ken Aaker (kdaaker@rchland.vnet.ibm.com)
  8.  * For PPC ABI convention is parms in Regs 3-10.
  9.  * The router in entry.S clears the high 32 bits in the first
  10.  * 4 arguments (R3-R6).
  11.  *
  12.  *      This program is free software; you can redistribute it and/or
  13.  *      modify it under the terms of the GNU General Public License
  14.  *      as published by the Free Software Foundation; either version
  15.  *      2 of the License, or (at your option) any later version.
  16.  */
  17. #include "ppc_asm.h"
  18. #include <asm/errno.h>
  19. #include <asm/processor.h>
  20. /* NOTE: call as jump breaks return stack, we have to avoid that */
  21. .text
  22. _GLOBAL(sys32_mmap)
  23. clrldi r7, r7, 32 /* int fd parm */
  24. clrldi r8, r8, 32 /* off_t offset parm */
  25. b .sys_mmap
  26. _GLOBAL(sys32_lseek)
  27. extsw r4,r4 /* sign extend off_t offset parm */
  28. b .sys_lseek
  29. _GLOBAL(sys32_chmod)
  30. /* Ken Aaker.. hmmm maybe I don't need to do anything here */
  31. b .sys_chmod
  32. _GLOBAL(sys32_mknod)
  33. /* Ken Aaker.. hmmm maybe I don't need to do anything here */
  34. b .sys_mknod
  35. _GLOBAL(sys32_sendto)
  36. clrldi r7, r7, 32 /* struct sockaddr *addr parm */
  37. clrldi r8, r8, 32 /* int addr_len parm */
  38. b .sys_sendto
  39. _GLOBAL(sys32_recvfrom)
  40. clrldi r7, r7, 32 /* struct sockaddr *addr parm */
  41. clrldi r8, r8, 32 /* int *addr_len parm */
  42. b .sys_recvfrom
  43. _GLOBAL(sys32_getsockopt)
  44. clrldi r7, r7, 32 /* int *optlen parm */
  45. b .sys_getsockopt
  46. _GLOBAL(sys32_bdflush)
  47. extsw r4,r4 /* sign extend long data parm */
  48. b .sys_bdflush
  49. _GLOBAL(sys32_mmap2)
  50. clrldi r7, r7, 32 /* unsigned long fd parm */
  51. extsw r8, r8 /* off_t offset */
  52. b .sys_mmap
  53. _GLOBAL(sys32_socketcall) /* r3=call, r4=args */
  54. cmpwi r3, 1
  55. blt- .do_einval
  56. cmpwi r3, 17
  57. bgt- .do_einval
  58. subi r3, r3, 1 /* index into socketcall_table vectors and jmp */
  59. sldi r3, r3, 3 /* each entry is 8 bytes */
  60. LOADADDR(r10,.socketcall_table_begin)
  61. ldx r10, r10, r3
  62. mtctr r10
  63. bctr
  64. /* Socket function vectored fix ups for 32 bit */
  65. _STATIC(do_sys_socket) /* sys_socket(int, int, int) */
  66. mr r10,r4
  67. lwa r3,0(r10)
  68. lwa r4,4(r10)
  69. lwa r5,8(r10)
  70. b .sys_socket
  71. _STATIC(do_sys_bind) /* sys_bind(int fd, struct sockaddr *, int) */
  72. mr r10,r4
  73. lwa r3,0(r10)
  74. lwz r4,4(r10)
  75. lwa r5,8(r10)
  76. b .sys_bind
  77. _STATIC(do_sys_connect) /* sys_connect(int, struct sockaddr *, int) */
  78. mr r10,r4
  79. lwa r3,0(r10)
  80. lwz r4,4(r10)
  81. lwa r5,8(r10)
  82. b .sys_connect
  83. _STATIC(do_sys_listen) /* sys_listen(int, int) */
  84. mr r10,r4
  85. lwa r3,0(r10)
  86. lwa r4,4(r10)
  87. b .sys_listen
  88. _STATIC(do_sys_accept) /* sys_accept(int, struct sockaddr *, int *) */
  89. mr r10,r4
  90. lwa r3,0(r10)
  91. lwz r4,4(r10)
  92. lwz r5,8(r10)
  93. b .sys_accept
  94. _STATIC(do_sys_getsockname) /* sys_getsockname(int, struct sockaddr *, int *) */
  95. mr r10,r4
  96. lwa r3,0(r10)
  97. lwz r4,4(r10)
  98. lwz r5,8(r10)
  99. b .sys_getsockname
  100. _STATIC(do_sys_getpeername) /* sys_getpeername(int, struct sockaddr *, int *) */
  101. mr r10,r4
  102. lwa r3,0(r10)
  103. lwz r4,4(r10)
  104. lwz r5,8(r10)
  105. b .sys_getpeername
  106. _STATIC(do_sys_socketpair) /* sys_socketpair(int, int, int, int *) */
  107. mr r10,r4
  108. lwa r3,0(r10)
  109. lwa r4,4(r10)
  110. lwa r5,8(r10)
  111. lwz r6,12(r10)
  112. b .sys_socketpair
  113. _STATIC(do_sys_send) /* sys_send(int, void *, size_t, unsigned int) */
  114. mr r10,r4
  115. lwa r3,0(r10)
  116. lwz r4,4(r10)
  117. lwz r5,8(r10)
  118. lwz r6,12(r10)
  119. b .sys_send
  120. _STATIC(do_sys_recv) /* sys_recv(int, void *, size_t, unsigned int) */
  121. mr r10,r4
  122. lwa r3,0(r10)
  123. lwz r4,4(r10)
  124. lwz r5,8(r10)
  125. lwz r6,12(r10)
  126. b .sys_recv
  127. _STATIC(do_sys_sendto) /* sys32_sendto(int, u32, __kernel_size_t32, unsigned int, u32, int) */
  128. mr r10,r4
  129. lwa r3,0(r10)
  130. lwz r4,4(r10)
  131. lwz r5,8(r10)
  132. lwz r6,12(r10)
  133. lwz r7,16(r10)
  134. lwa r8,20(r10)
  135. b .sys32_sendto
  136. _STATIC(do_sys_recvfrom) /* sys32_recvfrom(int, u32, __kernel_size_t32, unsigned int, u32, u32) */
  137. mr r10,r4
  138. lwa r3,0(r10)
  139. lwz r4,4(r10)
  140. lwz r5,8(r10)
  141. lwz r6,12(r10)
  142. lwz r7,16(r10)
  143. lwz r8,20(r10)
  144. b .sys32_recvfrom
  145. _STATIC(do_sys_shutdown) /* sys_shutdown(int, int) */
  146. mr r10,r4
  147. lwa r3,0(r10)
  148. lwa r4,4(r10)
  149. b .sys_shutdown
  150. _STATIC(do_sys_setsockopt) /* sys32_setsockopt(int, int, int, char *, int) */
  151. mr r10,r4
  152. lwa r3,0(r10)
  153. lwa r4,4(r10)
  154. lwa r5,8(r10)
  155. lwz r6,12(r10)
  156. lwa r7,16(r10)
  157. b .sys32_setsockopt
  158. _STATIC(do_sys_getsockopt) /* sys32_getsockopt(int, int, int, u32, u32) */
  159. mr r10,r4
  160. lwa r3,0(r10)
  161. lwa r4,4(r10)
  162. lwa r5,8(r10)
  163. lwz r6,12(r10)
  164. lwz r7,16(r10)
  165. b .sys32_getsockopt
  166. _STATIC(do_sys_sendmsg) /* sys32_sendmsg(int, struct msghdr32 *, unsigned int) */
  167. mr r10,r4
  168. lwa r3,0(r10)
  169. lwz r4,4(r10)
  170. lwa r5,8(r10)
  171. b .sys32_sendmsg
  172. _STATIC(do_sys_recvmsg) /* sys32_recvmsg(int, struct msghdr32 *, unsigned int) */
  173. mr r10,r4
  174. lwa r3,0(r10)
  175. lwz r4,4(r10)
  176. lwa r5,8(r10)
  177. b .sys32_recvmsg
  178. _STATIC(do_einval)
  179. li r3,-EINVAL
  180. b .ret_from_syscall_1
  181. _STATIC(do_efault)
  182. li r3,-EFAULT
  183. b .ret_from_syscall_1
  184. .data
  185. .align 8
  186. _GLOBAL(socketcall_table_begin)
  187. .llong .do_sys_socket
  188. .llong .do_sys_bind
  189. .llong .do_sys_connect
  190. .llong .do_sys_listen
  191. .llong .do_sys_accept
  192. .llong .do_sys_getsockname
  193. .llong .do_sys_getpeername
  194. .llong .do_sys_socketpair
  195. .llong .do_sys_send
  196. .llong .do_sys_recv
  197. .llong .do_sys_sendto
  198. .llong .do_sys_recvfrom
  199. .llong .do_sys_shutdown
  200. .llong .do_sys_setsockopt
  201. .llong .do_sys_getsockopt
  202. .llong .do_sys_sendmsg
  203. .llong .do_sys_recvmsg
  204. _GLOBAL(socketcall_table_end)
  205. .section __ex_table,"a"
  206. .align 3
  207. .llong .socketcall_table_begin
  208. .llong 0
  209. .llong .socketcall_table_end
  210. .llong .do_efault
  211. .previous