more changes on original files
[linux-2.4.git] / arch / ppc64 / kernel / sys32.S
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
18 #include "ppc_asm.h"
19 #include <asm/errno.h>
20 #include <asm/processor.h>
21
22         .text
23
24 _GLOBAL(sys32_mmap)
25         clrldi          r7, r7, 32      /* int fd parm */
26         clrldi          r8, r8, 32      /* off_t offset parm */
27         b               .sys_mmap
28
29 _GLOBAL(sys32_lseek)
30         extsw           r4,r4           /* sign extend off_t offset parm */
31         b               .sys_lseek
32
33 _GLOBAL(sys32_sendto)
34         clrldi          r7, r7, 32      /* struct sockaddr *addr parm */
35         clrldi          r8, r8, 32      /* int addr_len parm */
36         b               .sys_sendto
37
38 _GLOBAL(sys32_recvfrom)
39         clrldi          r7, r7, 32      /* struct sockaddr *addr parm */
40         clrldi          r8, r8, 32      /* int *addr_len parm */
41         b               .sys_recvfrom
42
43 _GLOBAL(sys32_getsockopt)
44         clrldi          r7, r7, 32      /* int *optlen parm */
45         b               .sys_getsockopt
46
47 _GLOBAL(sys32_bdflush)
48         extsw           r4,r4           /* sign extend long data parm */
49         b               .sys_bdflush
50
51 _GLOBAL(ppc32_mmap2)
52         clrldi          r7, r7, 32      /* unsigned long fd parm */
53         clrldi          r8, r8, 32      /* unsigned long pgoff */
54         b               .sys32_mmap2
55
56 _GLOBAL(sys32_socketcall)       /* r3=call, r4=args */
57         cmpwi           r3, 1
58         blt-            .do_einval
59         cmpwi           r3, 17
60         bgt-            .do_einval
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)
64         ldx             r10, r10, r3
65         mtctr           r10
66         bctr
67
68 /* Socket function vectored fix ups for 32 bit */
69 _STATIC(do_sys_socket) /* sys_socket(int, int, int) */
70         mr              r10,r4
71         lwa             r3,0(r10)
72         lwa             r4,4(r10)
73         lwa             r5,8(r10)
74         b               .sys_socket
75
76 _STATIC(do_sys_bind) /* sys_bind(int fd, struct sockaddr *, int) */
77         mr              r10,r4
78         lwa             r3,0(r10)
79         lwz             r4,4(r10)
80         lwa             r5,8(r10)
81         b               .sys_bind
82
83 _STATIC(do_sys_connect) /* sys_connect(int, struct sockaddr *, int) */
84         mr              r10,r4
85         lwa             r3,0(r10)
86         lwz             r4,4(r10)
87         lwa             r5,8(r10)
88         b               .sys_connect
89
90 _STATIC(do_sys_listen) /* sys_listen(int, int) */
91         mr              r10,r4
92         lwa             r3,0(r10)
93         lwa             r4,4(r10)
94         b               .sys_listen
95
96 _STATIC(do_sys_accept) /* sys_accept(int, struct sockaddr *, int *) */
97         mr              r10,r4
98         lwa             r3,0(r10)
99         lwz             r4,4(r10)
100         lwz             r5,8(r10)
101         b               .sys_accept
102
103 _STATIC(do_sys_getsockname) /* sys_getsockname(int, struct sockaddr *, int *) */
104         mr              r10,r4
105         lwa             r3,0(r10)
106         lwz             r4,4(r10)
107         lwz             r5,8(r10)
108         b               .sys_getsockname
109
110 _STATIC(do_sys_getpeername) /* sys_getpeername(int, struct sockaddr *, int *) */
111         mr              r10,r4
112         lwa             r3,0(r10)
113         lwz             r4,4(r10)
114         lwz             r5,8(r10)
115         b               .sys_getpeername
116
117 _STATIC(do_sys_socketpair) /* sys_socketpair(int, int, int, int *) */
118         mr              r10,r4
119         lwa             r3,0(r10)
120         lwa             r4,4(r10)
121         lwa             r5,8(r10)
122         lwz             r6,12(r10)
123         b               .sys_socketpair
124
125 _STATIC(do_sys_send) /* sys_send(int, void *, size_t, unsigned int) */
126         mr              r10,r4
127         lwa             r3,0(r10)
128         lwz             r4,4(r10)
129         lwz             r5,8(r10)
130         lwz             r6,12(r10)
131         b               .sys_send
132
133 _STATIC(do_sys_recv) /* sys_recv(int, void *, size_t, unsigned int) */
134         mr              r10,r4
135         lwa             r3,0(r10)
136         lwz             r4,4(r10)
137         lwz             r5,8(r10)
138         lwz             r6,12(r10)
139         b               .sys_recv
140
141 _STATIC(do_sys_sendto) /* sys32_sendto(int, u32, __kernel_size_t32, unsigned int, u32, int) */
142         mr              r10,r4
143         lwa             r3,0(r10)
144         lwz             r4,4(r10)
145         lwz             r5,8(r10)
146         lwz             r6,12(r10)
147         lwz             r7,16(r10)
148         lwa             r8,20(r10)
149         b               .sys32_sendto
150
151 _STATIC(do_sys_recvfrom) /* sys32_recvfrom(int, u32, __kernel_size_t32, unsigned int, u32, u32) */
152         mr              r10,r4
153         lwa             r3,0(r10)
154         lwz             r4,4(r10)
155         lwz             r5,8(r10)
156         lwz             r6,12(r10)
157         lwz             r7,16(r10)
158         lwz             r8,20(r10)
159         b               .sys32_recvfrom
160
161 _STATIC(do_sys_shutdown) /* sys_shutdown(int, int) */
162         mr              r10,r4
163         lwa             r3,0(r10)
164         lwa             r4,4(r10)
165         b               .sys_shutdown
166
167 _STATIC(do_sys_setsockopt) /* sys32_setsockopt(int, int, int, char *, int) */
168         mr              r10,r4
169         lwa             r3,0(r10)
170         lwa             r4,4(r10)
171         lwa             r5,8(r10)
172         lwz             r6,12(r10)
173         lwa             r7,16(r10)
174         b               .sys32_setsockopt
175
176 _STATIC(do_sys_getsockopt) /* sys32_getsockopt(int, int, int, u32, u32) */
177         mr              r10,r4
178         lwa             r3,0(r10)
179         lwa             r4,4(r10)
180         lwa             r5,8(r10)
181         lwz             r6,12(r10)
182         lwz             r7,16(r10)
183         b               .sys32_getsockopt
184
185 _STATIC(do_sys_sendmsg) /* sys32_sendmsg(int, struct msghdr32 *, unsigned int) */
186         mr              r10,r4
187         lwa             r3,0(r10)
188         lwz             r4,4(r10)
189         lwa             r5,8(r10)
190         b               .sys32_sendmsg
191
192 _STATIC(do_sys_recvmsg) /* sys32_recvmsg(int, struct msghdr32 *, unsigned int) */
193         mr              r10,r4
194         lwa             r3,0(r10)
195         lwz             r4,4(r10)
196         lwa             r5,8(r10)
197         b               .sys32_recvmsg
198
199 _STATIC(do_einval)
200         li      r3,-EINVAL
201         b       .ret_from_syscall_1
202 _STATIC(do_efault)
203         li      r3,-EFAULT
204         b       .ret_from_syscall_1
205
206         .data
207         .align  8
208 _GLOBAL(socketcall_table_begin)
209         .llong          .do_sys_socket
210         .llong          .do_sys_bind
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
217         .llong          .do_sys_send
218         .llong          .do_sys_recv
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"
228         .align          3
229         .llong          .socketcall_table_begin
230         .llong          0
231         .llong          .socketcall_table_end
232         .llong          .do_efault
233         .previous