1 /* $Id: sys32.S,v 1.12 2000/03/24 04:17:37 davem Exp $
2 * sys32.S: I-cache tricks for 32-bit compatibility layer simple
5 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
6 * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz)
9 #include <linux/config.h>
10 #include <asm/errno.h>
12 /* NOTE: call as jump breaks return stack, we have to avoid that */
20 sethi %hi(sys_mmap), %g1
21 jmpl %g1 + %lo(sys_mmap), %g0
26 .globl sys32_chmod, sys32_mknod
29 sethi %hi(sys_lseek), %g1
30 jmpl %g1 + %lo(sys_lseek), %g0
33 sethi %hi(0xffff), %g2
34 sethi %hi(sys_chmod), %g1
35 orcc %g2, %lo(0xffff), %g2
36 jmpl %g1 + %lo(sys_chmod), %g0
39 sethi %hi(0xffff), %g2
40 sethi %hi(sys_mknod), %g1
41 orcc %g2, %lo(0xffff), %g2
42 jmpl %g1 + %lo(sys_mknod), %g0
46 .globl sys32_sendto, sys32_recvfrom
48 sethi %hi(sys_sendto), %g1
49 jmpl %g1 + %lo(sys_sendto), %g0
53 sethi %hi(sys_recvfrom), %g1
54 jmpl %g1 + %lo(sys_recvfrom), %g0
59 sethi %hi(sys_bdflush), %g1
60 jmpl %g1 + %lo(sys_bdflush), %g0
67 sethi %hi(sys_mmap), %g1
69 jmpl %g1 + %lo(sys_mmap), %g0
72 .globl sys32_mq_timedsend
74 sethi %hi(compat_sys_mq_timedsend), %g1
75 jmpl %g1 + %lo(compat_sys_mq_timedsend), %g0
77 .globl sys32_mq_timedreceive
78 sys32_mq_timedreceive:
79 sethi %hi(compat_sys_mq_timedreceive), %g1
80 jmpl %g1 + %lo(compat_sys_mq_timedreceive), %g0
85 sethi %hi(compat_sys_select), %g1
86 jmpl %g1 + %lo(compat_sys_select), %g0
91 sethi %hi(compat_sys_futex), %g1
92 jmpl %g1 + %lo(compat_sys_futex), %g0
96 .globl sys32_socketcall
97 sys32_socketcall: /* %o0=call, %o1=args */
101 bg,pn %xcc, do_einval
104 sethi %hi(__socketcall_table_begin), %g2
105 or %g2, %lo(__socketcall_table_begin), %g2
109 /* Each entry is exactly 32 bytes. */
111 __socketcall_table_begin:
112 do_sys_socket: /* sys_socket(int, int, int) */
113 ldswa [%o1 + 0x0] %asi, %o0
114 sethi %hi(sys_socket), %g1
115 ldswa [%o1 + 0x8] %asi, %o2
116 jmpl %g1 + %lo(sys_socket), %g0
117 ldswa [%o1 + 0x4] %asi, %o1
121 do_sys_bind: /* sys_bind(int fd, struct sockaddr *, int) */
122 ldswa [%o1 + 0x0] %asi, %o0
123 sethi %hi(sys_bind), %g1
124 ldswa [%o1 + 0x8] %asi, %o2
125 jmpl %g1 + %lo(sys_bind), %g0
126 lduwa [%o1 + 0x4] %asi, %o1
130 do_sys_connect: /* sys_connect(int, struct sockaddr *, int) */
131 ldswa [%o1 + 0x0] %asi, %o0
132 sethi %hi(sys_connect), %g1
133 ldswa [%o1 + 0x8] %asi, %o2
134 jmpl %g1 + %lo(sys_connect), %g0
135 lduwa [%o1 + 0x4] %asi, %o1
139 do_sys_listen: /* sys_listen(int, int) */
140 ldswa [%o1 + 0x0] %asi, %o0
141 sethi %hi(sys_listen), %g1
142 jmpl %g1 + %lo(sys_listen), %g0
143 ldswa [%o1 + 0x4] %asi, %o1
148 do_sys_accept: /* sys_accept(int, struct sockaddr *, int *) */
149 ldswa [%o1 + 0x0] %asi, %o0
150 sethi %hi(sys_accept), %g1
151 lduwa [%o1 + 0x8] %asi, %o2
152 jmpl %g1 + %lo(sys_accept), %g0
153 lduwa [%o1 + 0x4] %asi, %o1
157 do_sys_getsockname: /* sys_getsockname(int, struct sockaddr *, int *) */
158 ldswa [%o1 + 0x0] %asi, %o0
159 sethi %hi(sys_getsockname), %g1
160 lduwa [%o1 + 0x8] %asi, %o2
161 jmpl %g1 + %lo(sys_getsockname), %g0
162 lduwa [%o1 + 0x4] %asi, %o1
166 do_sys_getpeername: /* sys_getpeername(int, struct sockaddr *, int *) */
167 ldswa [%o1 + 0x0] %asi, %o0
168 sethi %hi(sys_getpeername), %g1
169 lduwa [%o1 + 0x8] %asi, %o2
170 jmpl %g1 + %lo(sys_getpeername), %g0
171 lduwa [%o1 + 0x4] %asi, %o1
175 do_sys_socketpair: /* sys_socketpair(int, int, int, int *) */
176 ldswa [%o1 + 0x0] %asi, %o0
177 sethi %hi(sys_socketpair), %g1
178 ldswa [%o1 + 0x8] %asi, %o2
179 lduwa [%o1 + 0xc] %asi, %o3
180 jmpl %g1 + %lo(sys_socketpair), %g0
181 ldswa [%o1 + 0x4] %asi, %o1
184 do_sys_send: /* sys_send(int, void *, size_t, unsigned int) */
185 ldswa [%o1 + 0x0] %asi, %o0
186 sethi %hi(sys_send), %g1
187 lduwa [%o1 + 0x8] %asi, %o2
188 lduwa [%o1 + 0xc] %asi, %o3
189 jmpl %g1 + %lo(sys_send), %g0
190 lduwa [%o1 + 0x4] %asi, %o1
193 do_sys_recv: /* sys_recv(int, void *, size_t, unsigned int) */
194 ldswa [%o1 + 0x0] %asi, %o0
195 sethi %hi(sys_recv), %g1
196 lduwa [%o1 + 0x8] %asi, %o2
197 lduwa [%o1 + 0xc] %asi, %o3
198 jmpl %g1 + %lo(sys_recv), %g0
199 lduwa [%o1 + 0x4] %asi, %o1
202 do_sys_sendto: /* sys32_sendto(int, u32, compat_size_t, unsigned int, u32, int) */
203 ldswa [%o1 + 0x0] %asi, %o0
204 sethi %hi(sys32_sendto), %g1
205 lduwa [%o1 + 0x8] %asi, %o2
206 lduwa [%o1 + 0xc] %asi, %o3
207 lduwa [%o1 + 0x10] %asi, %o4
208 ldswa [%o1 + 0x14] %asi, %o5
209 jmpl %g1 + %lo(sys32_sendto), %g0
210 lduwa [%o1 + 0x4] %asi, %o1
211 do_sys_recvfrom: /* sys32_recvfrom(int, u32, compat_size_t, unsigned int, u32, u32) */
212 ldswa [%o1 + 0x0] %asi, %o0
213 sethi %hi(sys32_recvfrom), %g1
214 lduwa [%o1 + 0x8] %asi, %o2
215 lduwa [%o1 + 0xc] %asi, %o3
216 lduwa [%o1 + 0x10] %asi, %o4
217 lduwa [%o1 + 0x14] %asi, %o5
218 jmpl %g1 + %lo(sys32_recvfrom), %g0
219 lduwa [%o1 + 0x4] %asi, %o1
220 do_sys_shutdown: /* sys_shutdown(int, int) */
221 ldswa [%o1 + 0x0] %asi, %o0
222 sethi %hi(sys_shutdown), %g1
223 jmpl %g1 + %lo(sys_shutdown), %g0
224 ldswa [%o1 + 0x4] %asi, %o1
229 do_sys_setsockopt: /* compat_sys_setsockopt(int, int, int, char *, int) */
230 ldswa [%o1 + 0x0] %asi, %o0
231 sethi %hi(compat_sys_setsockopt), %g1
232 ldswa [%o1 + 0x8] %asi, %o2
233 lduwa [%o1 + 0xc] %asi, %o3
234 ldswa [%o1 + 0x10] %asi, %o4
235 jmpl %g1 + %lo(compat_sys_setsockopt), %g0
236 ldswa [%o1 + 0x4] %asi, %o1
238 do_sys_getsockopt: /* compat_sys_getsockopt(int, int, int, u32, u32) */
239 ldswa [%o1 + 0x0] %asi, %o0
240 sethi %hi(compat_sys_getsockopt), %g1
241 ldswa [%o1 + 0x8] %asi, %o2
242 lduwa [%o1 + 0xc] %asi, %o3
243 lduwa [%o1 + 0x10] %asi, %o4
244 jmpl %g1 + %lo(compat_sys_getsockopt), %g0
245 ldswa [%o1 + 0x4] %asi, %o1
247 do_sys_sendmsg: /* compat_sys_sendmsg(int, struct compat_msghdr *, unsigned int) */
248 ldswa [%o1 + 0x0] %asi, %o0
249 sethi %hi(compat_sys_sendmsg), %g1
250 lduwa [%o1 + 0x8] %asi, %o2
251 jmpl %g1 + %lo(compat_sys_sendmsg), %g0
252 lduwa [%o1 + 0x4] %asi, %o1
256 do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) */
257 ldswa [%o1 + 0x0] %asi, %o0
258 sethi %hi(compat_sys_recvmsg), %g1
259 lduwa [%o1 + 0x8] %asi, %o2
260 jmpl %g1 + %lo(compat_sys_recvmsg), %g0
261 lduwa [%o1 + 0x4] %asi, %o1
265 __socketcall_table_end:
276 .word __socketcall_table_begin, 0, __socketcall_table_end, do_efault