2 * sys32.S: I-cache tricks for 32-bit compatability layer simple
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).
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.
19 #include <asm/errno.h>
20 #include <asm/processor.h>
25 clrldi r7, r7, 32 /* int fd parm */
26 clrldi r8, r8, 32 /* off_t offset parm */
30 extsw r4,r4 /* sign extend off_t offset parm */
34 clrldi r7, r7, 32 /* struct sockaddr *addr parm */
35 clrldi r8, r8, 32 /* int addr_len parm */
38 _GLOBAL(sys32_recvfrom)
39 clrldi r7, r7, 32 /* struct sockaddr *addr parm */
40 clrldi r8, r8, 32 /* int *addr_len parm */
43 _GLOBAL(sys32_getsockopt)
44 clrldi r7, r7, 32 /* int *optlen parm */
47 _GLOBAL(sys32_bdflush)
48 extsw r4,r4 /* sign extend long data parm */
52 clrldi r7, r7, 32 /* unsigned long fd parm */
53 clrldi r8, r8, 32 /* unsigned long pgoff */
56 _GLOBAL(sys32_socketcall) /* r3=call, r4=args */
61 subi r3, r3, 1 /* index into socketcall_table vectors and jmp */
62 sldi r3, r3, 3 /* each entry is 8 bytes */
63 LOADADDR(r10,.socketcall_table_begin)
68 /* Socket function vectored fix ups for 32 bit */
69 _STATIC(do_sys_socket) /* sys_socket(int, int, int) */
76 _STATIC(do_sys_bind) /* sys_bind(int fd, struct sockaddr *, int) */
83 _STATIC(do_sys_connect) /* sys_connect(int, struct sockaddr *, int) */
90 _STATIC(do_sys_listen) /* sys_listen(int, int) */
96 _STATIC(do_sys_accept) /* sys_accept(int, struct sockaddr *, int *) */
103 _STATIC(do_sys_getsockname) /* sys_getsockname(int, struct sockaddr *, int *) */
110 _STATIC(do_sys_getpeername) /* sys_getpeername(int, struct sockaddr *, int *) */
117 _STATIC(do_sys_socketpair) /* sys_socketpair(int, int, int, int *) */
125 _STATIC(do_sys_send) /* sys_send(int, void *, size_t, unsigned int) */
133 _STATIC(do_sys_recv) /* sys_recv(int, void *, size_t, unsigned int) */
141 _STATIC(do_sys_sendto) /* sys32_sendto(int, u32, __kernel_size_t32, unsigned int, u32, int) */
151 _STATIC(do_sys_recvfrom) /* sys32_recvfrom(int, u32, __kernel_size_t32, unsigned int, u32, u32) */
161 _STATIC(do_sys_shutdown) /* sys_shutdown(int, int) */
167 _STATIC(do_sys_setsockopt) /* sys32_setsockopt(int, int, int, char *, int) */
176 _STATIC(do_sys_getsockopt) /* sys32_getsockopt(int, int, int, u32, u32) */
185 _STATIC(do_sys_sendmsg) /* sys32_sendmsg(int, struct msghdr32 *, unsigned int) */
192 _STATIC(do_sys_recvmsg) /* sys32_recvmsg(int, struct msghdr32 *, unsigned int) */
201 b .ret_from_syscall_1
204 b .ret_from_syscall_1
208 _GLOBAL(socketcall_table_begin)
209 .llong .do_sys_socket
211 .llong .do_sys_connect
212 .llong .do_sys_listen
213 .llong .do_sys_accept
214 .llong .do_sys_getsockname
215 .llong .do_sys_getpeername
216 .llong .do_sys_socketpair
219 .llong .do_sys_sendto
220 .llong .do_sys_recvfrom
221 .llong .do_sys_shutdown
222 .llong .do_sys_setsockopt
223 .llong .do_sys_getsockopt
224 .llong .do_sys_sendmsg
225 .llong .do_sys_recvmsg
226 _GLOBAL(socketcall_table_end)
227 .section __ex_table,"a"
229 .llong .socketcall_table_begin
231 .llong .socketcall_table_end