ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[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 <asm/errno.h>
10
11 /* NOTE: call as jump breaks return stack, we have to avoid that */
12
13         .text
14
15         .align          32
16         .globl          sys32_mmap
17 sys32_mmap:
18         srl             %o4, 0, %o4
19         sethi           %hi(sys_mmap), %g1
20         jmpl            %g1 + %lo(sys_mmap), %g0
21          srl            %o5, 0, %o5
22
23         .align          32
24         .globl          sys32_lseek
25         .globl          sys32_chmod, sys32_mknod
26 sys32_lseek:
27         sra             %o1, 0, %o1
28         sethi           %hi(sys_lseek), %g1
29         jmpl            %g1 + %lo(sys_lseek), %g0
30          nop
31 sys32_chmod:
32         sethi           %hi(0xffff), %g2
33         sethi           %hi(sys_chmod), %g1
34         orcc            %g2, %lo(0xffff), %g2
35         jmpl            %g1 + %lo(sys_chmod), %g0
36          and            %o1, %g2, %o1
37 sys32_mknod:
38         sethi           %hi(0xffff), %g2
39         sethi           %hi(sys_mknod), %g1
40         orcc            %g2, %lo(0xffff), %g2
41         jmpl            %g1 + %lo(sys_mknod), %g0
42          and            %o2, %g2, %o2
43
44         .align          32
45         .globl          sys32_sendto, sys32_recvfrom
46 sys32_sendto:
47         sethi           %hi(sys_sendto), %g1
48         jmpl            %g1 + %lo(sys_sendto), %g0
49          srl            %o4, 0, %o4
50 sys32_recvfrom:
51         srl             %o4, 0, %o4
52         sethi           %hi(sys_recvfrom), %g1
53         jmpl            %g1 + %lo(sys_recvfrom), %g0
54          srl            %o5, 0, %o5
55
56         .globl          sys32_bdflush
57 sys32_bdflush:
58         sethi           %hi(sys_bdflush), %g1
59         jmpl            %g1 + %lo(sys_bdflush), %g0
60          sra            %o1, 0, %o1
61
62         .align          32
63         .globl          sys32_mmap2
64 sys32_mmap2:
65         srl             %o4, 0, %o4
66         sethi           %hi(sys_mmap), %g1
67         srl             %o5, 0, %o5
68         jmpl            %g1 + %lo(sys_mmap), %g0
69          sllx           %o5, 12, %o5
70
71         .globl          sys32_mq_timedsend
72 sys32_mq_timedsend:
73         sethi           %hi(compat_sys_mq_timedsend), %g1
74         jmpl            %g1 + %lo(compat_sys_mq_timedsend), %g0
75          srl            %o4, 0, %o4
76         .globl          sys32_mq_timedreceive
77 sys32_mq_timedreceive:
78         sethi           %hi(compat_sys_mq_timedreceive), %g1
79         jmpl            %g1 + %lo(compat_sys_mq_timedreceive), %g0
80          srl            %o4, 0, %o4
81
82         .align          32
83         .globl          sys32_socketcall
84 sys32_socketcall:       /* %o0=call, %o1=args */
85         cmp             %o0, 1
86         bl,pn           %xcc, do_einval
87          cmp            %o0, 17
88         bg,pn           %xcc, do_einval
89          sub            %o0, 1, %o0
90         sllx            %o0, 5, %o0
91         sethi           %hi(__socketcall_table_begin), %g2
92         or              %g2, %lo(__socketcall_table_begin), %g2
93         jmpl            %g2 + %o0, %g0
94          nop
95
96         /* Each entry is exactly 32 bytes. */
97         .align          32
98 __socketcall_table_begin:
99 do_sys_socket: /* sys_socket(int, int, int) */
100         ldswa           [%o1 + 0x0] %asi, %o0
101         sethi           %hi(sys_socket), %g1
102         ldswa           [%o1 + 0x8] %asi, %o2
103         jmpl            %g1 + %lo(sys_socket), %g0
104          ldswa          [%o1 + 0x4] %asi, %o1
105         nop
106         nop
107         nop
108 do_sys_bind: /* sys_bind(int fd, struct sockaddr *, int) */
109         ldswa           [%o1 + 0x0] %asi, %o0
110         sethi           %hi(sys_bind), %g1
111         ldswa           [%o1 + 0x8] %asi, %o2
112         jmpl            %g1 + %lo(sys_bind), %g0
113          lduwa          [%o1 + 0x4] %asi, %o1
114         nop
115         nop
116         nop
117 do_sys_connect: /* sys_connect(int, struct sockaddr *, int) */
118         ldswa           [%o1 + 0x0] %asi, %o0
119         sethi           %hi(sys_connect), %g1
120         ldswa           [%o1 + 0x8] %asi, %o2
121         jmpl            %g1 + %lo(sys_connect), %g0
122          lduwa          [%o1 + 0x4] %asi, %o1
123         nop
124         nop
125         nop
126 do_sys_listen: /* sys_listen(int, int) */
127         ldswa           [%o1 + 0x0] %asi, %o0
128         sethi           %hi(sys_listen), %g1
129         jmpl            %g1 + %lo(sys_listen), %g0
130          ldswa          [%o1 + 0x4] %asi, %o1
131         nop
132         nop
133         nop
134         nop
135 do_sys_accept: /* sys_accept(int, struct sockaddr *, int *) */
136         ldswa           [%o1 + 0x0] %asi, %o0
137         sethi           %hi(sys_accept), %g1
138         lduwa           [%o1 + 0x8] %asi, %o2
139         jmpl            %g1 + %lo(sys_accept), %g0
140          lduwa          [%o1 + 0x4] %asi, %o1
141         nop
142         nop
143         nop
144 do_sys_getsockname: /* sys_getsockname(int, struct sockaddr *, int *) */
145         ldswa           [%o1 + 0x0] %asi, %o0
146         sethi           %hi(sys_getsockname), %g1
147         lduwa           [%o1 + 0x8] %asi, %o2
148         jmpl            %g1 + %lo(sys_getsockname), %g0
149          lduwa          [%o1 + 0x4] %asi, %o1
150         nop
151         nop
152         nop
153 do_sys_getpeername: /* sys_getpeername(int, struct sockaddr *, int *) */
154         ldswa           [%o1 + 0x0] %asi, %o0
155         sethi           %hi(sys_getpeername), %g1
156         lduwa           [%o1 + 0x8] %asi, %o2
157         jmpl            %g1 + %lo(sys_getpeername), %g0
158          lduwa          [%o1 + 0x4] %asi, %o1
159         nop
160         nop
161         nop
162 do_sys_socketpair: /* sys_socketpair(int, int, int, int *) */
163         ldswa           [%o1 + 0x0] %asi, %o0
164         sethi           %hi(sys_socketpair), %g1
165         ldswa           [%o1 + 0x8] %asi, %o2
166         lduwa           [%o1 + 0xc] %asi, %o3
167         jmpl            %g1 + %lo(sys_socketpair), %g0
168          ldswa          [%o1 + 0x4] %asi, %o1
169         nop
170         nop
171 do_sys_send: /* sys_send(int, void *, size_t, unsigned int) */
172         ldswa           [%o1 + 0x0] %asi, %o0
173         sethi           %hi(sys_send), %g1
174         lduwa           [%o1 + 0x8] %asi, %o2
175         lduwa           [%o1 + 0xc] %asi, %o3
176         jmpl            %g1 + %lo(sys_send), %g0
177          lduwa          [%o1 + 0x4] %asi, %o1
178         nop
179         nop
180 do_sys_recv: /* sys_recv(int, void *, size_t, unsigned int) */
181         ldswa           [%o1 + 0x0] %asi, %o0
182         sethi           %hi(sys_recv), %g1
183         lduwa           [%o1 + 0x8] %asi, %o2
184         lduwa           [%o1 + 0xc] %asi, %o3
185         jmpl            %g1 + %lo(sys_recv), %g0
186          lduwa          [%o1 + 0x4] %asi, %o1
187         nop
188         nop
189 do_sys_sendto: /* sys32_sendto(int, u32, compat_size_t, unsigned int, u32, int) */
190         ldswa           [%o1 + 0x0] %asi, %o0
191         sethi           %hi(sys32_sendto), %g1
192         lduwa           [%o1 + 0x8] %asi, %o2
193         lduwa           [%o1 + 0xc] %asi, %o3
194         lduwa           [%o1 + 0x10] %asi, %o4
195         ldswa           [%o1 + 0x14] %asi, %o5
196         jmpl            %g1 + %lo(sys32_sendto), %g0
197          lduwa          [%o1 + 0x4] %asi, %o1
198 do_sys_recvfrom: /* sys32_recvfrom(int, u32, compat_size_t, unsigned int, u32, u32) */
199         ldswa           [%o1 + 0x0] %asi, %o0
200         sethi           %hi(sys32_recvfrom), %g1
201         lduwa           [%o1 + 0x8] %asi, %o2
202         lduwa           [%o1 + 0xc] %asi, %o3
203         lduwa           [%o1 + 0x10] %asi, %o4
204         lduwa           [%o1 + 0x14] %asi, %o5
205         jmpl            %g1 + %lo(sys32_recvfrom), %g0
206          lduwa          [%o1 + 0x4] %asi, %o1
207 do_sys_shutdown: /* sys_shutdown(int, int) */
208         ldswa           [%o1 + 0x0] %asi, %o0
209         sethi           %hi(sys_shutdown), %g1
210         jmpl            %g1 + %lo(sys_shutdown), %g0
211          ldswa          [%o1 + 0x4] %asi, %o1
212         nop
213         nop
214         nop
215         nop
216 do_sys_setsockopt: /* compat_sys_setsockopt(int, int, int, char *, int) */
217         ldswa           [%o1 + 0x0] %asi, %o0
218         sethi           %hi(compat_sys_setsockopt), %g1
219         ldswa           [%o1 + 0x8] %asi, %o2
220         lduwa           [%o1 + 0xc] %asi, %o3
221         ldswa           [%o1 + 0x10] %asi, %o4
222         jmpl            %g1 + %lo(compat_sys_setsockopt), %g0
223          ldswa          [%o1 + 0x4] %asi, %o1
224         nop
225 do_sys_getsockopt: /* compat_sys_getsockopt(int, int, int, u32, u32) */
226         ldswa           [%o1 + 0x0] %asi, %o0
227         sethi           %hi(compat_sys_getsockopt), %g1
228         ldswa           [%o1 + 0x8] %asi, %o2
229         lduwa           [%o1 + 0xc] %asi, %o3
230         lduwa           [%o1 + 0x10] %asi, %o4
231         jmpl            %g1 + %lo(compat_sys_getsockopt), %g0
232          ldswa          [%o1 + 0x4] %asi, %o1
233         nop
234 do_sys_sendmsg: /* compat_sys_sendmsg(int, struct compat_msghdr *, unsigned int) */
235         ldswa           [%o1 + 0x0] %asi, %o0
236         sethi           %hi(compat_sys_sendmsg), %g1
237         lduwa           [%o1 + 0x8] %asi, %o2
238         jmpl            %g1 + %lo(compat_sys_sendmsg), %g0
239          lduwa          [%o1 + 0x4] %asi, %o1
240         nop
241         nop
242         nop
243 do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) */
244         ldswa           [%o1 + 0x0] %asi, %o0
245         sethi           %hi(compat_sys_recvmsg), %g1
246         lduwa           [%o1 + 0x8] %asi, %o2
247         jmpl            %g1 + %lo(compat_sys_recvmsg), %g0
248          lduwa          [%o1 + 0x4] %asi, %o1
249         nop
250         nop
251         nop
252 __socketcall_table_end:
253
254 do_einval:
255         retl
256          mov            -EINVAL, %o0
257 do_efault:
258         retl
259          mov            -EFAULT, %o0
260
261         .section        __ex_table
262         .align          4
263         .word           __socketcall_table_begin, 0, __socketcall_table_end, do_efault
264         .previous