110d91aedb63605c6c2ffb1b0b897344a222bd6c
[linux-2.6.git] / arch / sparc64 / kernel / sys32.S
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
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
9 #include <linux/config.h>
10 #include <asm/errno.h>
11
12 /* NOTE: call as jump breaks return stack, we have to avoid that */
13
14         .text
15
16         .align          32
17         .globl          sys32_mmap
18 sys32_mmap:
19         srl             %o4, 0, %o4
20         sethi           %hi(sys_mmap), %g1
21         jmpl            %g1 + %lo(sys_mmap), %g0
22          srl            %o5, 0, %o5
23
24         .align          32
25         .globl          sys32_lseek
26         .globl          sys32_chmod, sys32_mknod
27 sys32_lseek:
28         sra             %o1, 0, %o1
29         sethi           %hi(sys_lseek), %g1
30         jmpl            %g1 + %lo(sys_lseek), %g0
31          nop
32 sys32_chmod:
33         sethi           %hi(0xffff), %g2
34         sethi           %hi(sys_chmod), %g1
35         orcc            %g2, %lo(0xffff), %g2
36         jmpl            %g1 + %lo(sys_chmod), %g0
37          and            %o1, %g2, %o1
38 sys32_mknod:
39         sethi           %hi(0xffff), %g2
40         sethi           %hi(sys_mknod), %g1
41         orcc            %g2, %lo(0xffff), %g2
42         jmpl            %g1 + %lo(sys_mknod), %g0
43          and            %o2, %g2, %o2
44
45         .align          32
46         .globl          sys32_sendto, sys32_recvfrom
47 sys32_sendto:
48         sethi           %hi(sys_sendto), %g1
49         jmpl            %g1 + %lo(sys_sendto), %g0
50          srl            %o4, 0, %o4
51 sys32_recvfrom:
52         srl             %o4, 0, %o4
53         sethi           %hi(sys_recvfrom), %g1
54         jmpl            %g1 + %lo(sys_recvfrom), %g0
55          srl            %o5, 0, %o5
56
57         .globl          sys32_bdflush
58 sys32_bdflush:
59         sethi           %hi(sys_bdflush), %g1
60         jmpl            %g1 + %lo(sys_bdflush), %g0
61          sra            %o1, 0, %o1
62
63         .align          32
64         .globl          sys32_mmap2
65 sys32_mmap2:
66         srl             %o4, 0, %o4
67         sethi           %hi(sys_mmap), %g1
68         srl             %o5, 0, %o5
69         jmpl            %g1 + %lo(sys_mmap), %g0
70          sllx           %o5, 12, %o5
71
72         .globl          sys32_mq_timedsend
73 sys32_mq_timedsend:
74         sethi           %hi(compat_sys_mq_timedsend), %g1
75         jmpl            %g1 + %lo(compat_sys_mq_timedsend), %g0
76          srl            %o4, 0, %o4
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
81          srl            %o4, 0, %o4
82
83         .globl          sys32_select
84 sys32_select:
85         sethi           %hi(compat_sys_select), %g1
86         jmpl            %g1 + %lo(compat_sys_select), %g0
87          srl            %o4, 0, %o4
88
89         .globl          sys32_futex
90 sys32_futex:
91         sethi           %hi(compat_sys_futex), %g1
92         jmpl            %g1 + %lo(compat_sys_futex), %g0
93          srl            %o4, 0, %o4
94
95         .align          32
96         .globl          sys32_socketcall
97 sys32_socketcall:       /* %o0=call, %o1=args */
98         cmp             %o0, 1
99         bl,pn           %xcc, do_einval
100          cmp            %o0, 17
101         bg,pn           %xcc, do_einval
102          sub            %o0, 1, %o0
103         sllx            %o0, 5, %o0
104         sethi           %hi(__socketcall_table_begin), %g2
105         or              %g2, %lo(__socketcall_table_begin), %g2
106         jmpl            %g2 + %o0, %g0
107          nop
108
109         /* Each entry is exactly 32 bytes. */
110         .align          32
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
118         nop
119         nop
120         nop
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
127         nop
128         nop
129         nop
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
136         nop
137         nop
138         nop
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
144         nop
145         nop
146         nop
147         nop
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
154         nop
155         nop
156         nop
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
163         nop
164         nop
165         nop
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
172         nop
173         nop
174         nop
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
182         nop
183         nop
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
191         nop
192         nop
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
200         nop
201         nop
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
225         nop
226         nop
227         nop
228         nop
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
237         nop
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
246         nop
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
253         nop
254         nop
255         nop
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
262         nop
263         nop
264         nop
265 __socketcall_table_end:
266
267 do_einval:
268         retl
269          mov            -EINVAL, %o0
270 do_efault:
271         retl
272          mov            -EFAULT, %o0
273
274         .section        __ex_table
275         .align          4
276         .word           __socketcall_table_begin, 0, __socketcall_table_end, do_efault
277         .previous