sys32.S 8.7 KB
Newer Older
A
Adrian Bunk 已提交
1
/*
L
Linus Torvalds 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
 * sys32.S: I-cache tricks for 32-bit compatibility layer simple
 *          conversions.
 *
 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
 * Copyright (C) 1998 Jakub Jelinek   (jj@ultra.linux.cz)
 */

#include <asm/errno.h>

/* NOTE: call as jump breaks return stack, we have to avoid that */

	.text

#define SIGN1(STUB,SYSCALL,REG1) \
	.align	32; \
	.globl	STUB; \
STUB:	sethi	%hi(SYSCALL), %g1; \
	jmpl	%g1 + %lo(SYSCALL), %g0; \
	sra	REG1, 0, REG1

#define SIGN2(STUB,SYSCALL,REG1,REG2) \
	.align	32; \
	.globl	STUB; \
STUB:	sethi	%hi(SYSCALL), %g1; \
	sra	REG1, 0, REG1; \
	jmpl	%g1 + %lo(SYSCALL), %g0; \
	sra	REG2, 0, REG2

#define SIGN3(STUB,SYSCALL,REG1,REG2,REG3) \
	.align	32; \
	.globl	STUB; \
STUB:	sra	REG1, 0, REG1; \
	sethi	%hi(SYSCALL), %g1; \
	sra	REG2, 0, REG2; \
	jmpl	%g1 + %lo(SYSCALL), %g0; \
	sra	REG3, 0, REG3

SIGN1(sys32_getrusage, compat_sys_getrusage, %o0)
SIGN1(sys32_readahead, compat_sys_readahead, %o0)
SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4)
SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5)
SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1)
SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1)
SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)
SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)
SIGN1(sys32_select, compat_sys_select, %o0)
SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5)
SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1)
50
SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0)
L
Linus Torvalds 已提交
51 52
SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)
SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0)
53
SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
54
SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)
L
Linus Torvalds 已提交
55 56 57 58 59 60 61 62 63 64 65 66

	.globl		sys32_mmap2
sys32_mmap2:
	sethi		%hi(sys_mmap), %g1
	jmpl		%g1 + %lo(sys_mmap), %g0
	 sllx		%o5, 12, %o5

	.align		32
	.globl		sys32_socketcall
sys32_socketcall:	/* %o0=call, %o1=args */
	cmp		%o0, 1
	bl,pn		%xcc, do_einval
D
David Miller 已提交
67
	 cmp		%o0, 18
L
Linus Torvalds 已提交
68 69 70 71 72 73 74
	bg,pn		%xcc, do_einval
	 sub		%o0, 1, %o0
	sllx		%o0, 5, %o0
	sethi		%hi(__socketcall_table_begin), %g2
	or		%g2, %lo(__socketcall_table_begin), %g2
	jmpl		%g2 + %o0, %g0
	 nop
75 76 77
do_einval:
	retl
	 mov		-EINVAL, %o0
L
Linus Torvalds 已提交
78 79 80

	.align		32
__socketcall_table_begin:
81 82

	/* Each entry is exactly 32 bytes. */
L
Linus Torvalds 已提交
83
do_sys_socket: /* sys_socket(int, int, int) */
84
1:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
85
	sethi		%hi(sys_socket), %g1
86
2:	ldswa		[%o1 + 0x8] %asi, %o2
L
Linus Torvalds 已提交
87
	jmpl		%g1 + %lo(sys_socket), %g0
88
3:	 ldswa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
89 90 91 92
	nop
	nop
	nop
do_sys_bind: /* sys_bind(int fd, struct sockaddr *, int) */
93
4:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
94
	sethi		%hi(sys_bind), %g1
95
5:	ldswa		[%o1 + 0x8] %asi, %o2
L
Linus Torvalds 已提交
96
	jmpl		%g1 + %lo(sys_bind), %g0
97
6:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
98 99 100 101
	nop
	nop
	nop
do_sys_connect: /* sys_connect(int, struct sockaddr *, int) */
102
7:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
103
	sethi		%hi(sys_connect), %g1
104
8:	ldswa		[%o1 + 0x8] %asi, %o2
L
Linus Torvalds 已提交
105
	jmpl		%g1 + %lo(sys_connect), %g0
106
9:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
107 108 109 110
	nop
	nop
	nop
do_sys_listen: /* sys_listen(int, int) */
111
10:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
112 113
	sethi		%hi(sys_listen), %g1
	jmpl		%g1 + %lo(sys_listen), %g0
114
11:	 ldswa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
115 116 117 118 119
	nop
	nop
	nop
	nop
do_sys_accept: /* sys_accept(int, struct sockaddr *, int *) */
120
12:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
121
	sethi		%hi(sys_accept), %g1
122
13:	lduwa		[%o1 + 0x8] %asi, %o2
L
Linus Torvalds 已提交
123
	jmpl		%g1 + %lo(sys_accept), %g0
124
14:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
125 126 127 128
	nop
	nop
	nop
do_sys_getsockname: /* sys_getsockname(int, struct sockaddr *, int *) */
129
15:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
130
	sethi		%hi(sys_getsockname), %g1
131
16:	lduwa		[%o1 + 0x8] %asi, %o2
L
Linus Torvalds 已提交
132
	jmpl		%g1 + %lo(sys_getsockname), %g0
133
17:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
134 135 136 137
	nop
	nop
	nop
do_sys_getpeername: /* sys_getpeername(int, struct sockaddr *, int *) */
138
18:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
139
	sethi		%hi(sys_getpeername), %g1
140
19:	lduwa		[%o1 + 0x8] %asi, %o2
L
Linus Torvalds 已提交
141
	jmpl		%g1 + %lo(sys_getpeername), %g0
142
20:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
143 144 145 146
	nop
	nop
	nop
do_sys_socketpair: /* sys_socketpair(int, int, int, int *) */
147
21:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
148
	sethi		%hi(sys_socketpair), %g1
149 150
22:	ldswa		[%o1 + 0x8] %asi, %o2
23:	lduwa		[%o1 + 0xc] %asi, %o3
L
Linus Torvalds 已提交
151
	jmpl		%g1 + %lo(sys_socketpair), %g0
152
24:	 ldswa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
153 154 155
	nop
	nop
do_sys_send: /* sys_send(int, void *, size_t, unsigned int) */
156
25:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
157
	sethi		%hi(sys_send), %g1
158 159
26:	lduwa		[%o1 + 0x8] %asi, %o2
27:	lduwa		[%o1 + 0xc] %asi, %o3
L
Linus Torvalds 已提交
160
	jmpl		%g1 + %lo(sys_send), %g0
161
28:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
162 163 164
	nop
	nop
do_sys_recv: /* sys_recv(int, void *, size_t, unsigned int) */
165
29:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
166
	sethi		%hi(sys_recv), %g1
167 168
30:	lduwa		[%o1 + 0x8] %asi, %o2
31:	lduwa		[%o1 + 0xc] %asi, %o3
L
Linus Torvalds 已提交
169
	jmpl		%g1 + %lo(sys_recv), %g0
170
32:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
171 172 173
	nop
	nop
do_sys_sendto: /* sys_sendto(int, u32, compat_size_t, unsigned int, u32, int) */
174
33:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
175
	sethi		%hi(sys_sendto), %g1
176 177 178 179
34:	lduwa		[%o1 + 0x8] %asi, %o2
35:	lduwa		[%o1 + 0xc] %asi, %o3
36:	lduwa		[%o1 + 0x10] %asi, %o4
37:	ldswa		[%o1 + 0x14] %asi, %o5
L
Linus Torvalds 已提交
180
	jmpl		%g1 + %lo(sys_sendto), %g0
181
38:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
182
do_sys_recvfrom: /* sys_recvfrom(int, u32, compat_size_t, unsigned int, u32, u32) */
183
39:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
184
	sethi		%hi(sys_recvfrom), %g1
185 186 187 188
40:	lduwa		[%o1 + 0x8] %asi, %o2
41:	lduwa		[%o1 + 0xc] %asi, %o3
42:	lduwa		[%o1 + 0x10] %asi, %o4
43:	lduwa		[%o1 + 0x14] %asi, %o5
L
Linus Torvalds 已提交
189
	jmpl		%g1 + %lo(sys_recvfrom), %g0
190
44:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
191
do_sys_shutdown: /* sys_shutdown(int, int) */
192
45:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
193 194
	sethi		%hi(sys_shutdown), %g1
	jmpl		%g1 + %lo(sys_shutdown), %g0
195
46:	 ldswa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
196 197 198 199 200
	nop
	nop
	nop
	nop
do_sys_setsockopt: /* compat_sys_setsockopt(int, int, int, char *, int) */
201
47:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
202
	sethi		%hi(compat_sys_setsockopt), %g1
203 204 205
48:	ldswa		[%o1 + 0x8] %asi, %o2
49:	lduwa		[%o1 + 0xc] %asi, %o3
50:	ldswa		[%o1 + 0x10] %asi, %o4
L
Linus Torvalds 已提交
206
	jmpl		%g1 + %lo(compat_sys_setsockopt), %g0
207
51:	 ldswa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
208 209
	nop
do_sys_getsockopt: /* compat_sys_getsockopt(int, int, int, u32, u32) */
210
52:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
211
	sethi		%hi(compat_sys_getsockopt), %g1
212 213 214
53:	ldswa		[%o1 + 0x8] %asi, %o2
54:	lduwa		[%o1 + 0xc] %asi, %o3
55:	lduwa		[%o1 + 0x10] %asi, %o4
L
Linus Torvalds 已提交
215
	jmpl		%g1 + %lo(compat_sys_getsockopt), %g0
216
56:	 ldswa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
217 218
	nop
do_sys_sendmsg: /* compat_sys_sendmsg(int, struct compat_msghdr *, unsigned int) */
219
57:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
220
	sethi		%hi(compat_sys_sendmsg), %g1
221
58:	lduwa		[%o1 + 0x8] %asi, %o2
L
Linus Torvalds 已提交
222
	jmpl		%g1 + %lo(compat_sys_sendmsg), %g0
223
59:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
224 225 226 227
	nop
	nop
	nop
do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) */
228
60:	ldswa		[%o1 + 0x0] %asi, %o0
L
Linus Torvalds 已提交
229
	sethi		%hi(compat_sys_recvmsg), %g1
230
61:	lduwa		[%o1 + 0x8] %asi, %o2
L
Linus Torvalds 已提交
231
	jmpl		%g1 + %lo(compat_sys_recvmsg), %g0
232
62:	 lduwa		[%o1 + 0x4] %asi, %o1
L
Linus Torvalds 已提交
233 234 235
	nop
	nop
	nop
D
David Miller 已提交
236 237 238 239 240 241 242 243 244
do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */
63:	ldswa		[%o1 + 0x0] %asi, %o0
	sethi		%hi(sys_accept4), %g1
64:	lduwa		[%o1 + 0x8] %asi, %o2
65:	ldswa		[%o1 + 0xc] %asi, %o3
	jmpl		%g1 + %lo(sys_accept4), %g0
66:	 lduwa		[%o1 + 0x4] %asi, %o1
	nop
	nop
L
Linus Torvalds 已提交
245

246 247 248 249 250 251 252 253 254
	.globl		sys32_fanotify_mark
sys32_fanotify_mark:
	sethi		%hi(sys_fanotify_mark), %g1
	sllx		%o2, 32, %o2
	or		%o2, %o3, %o2
	mov		%o4, %o3
	jmpl		%g1 + %lo(sys_fanotify_mark), %g0
	 mov		%o5, %o4

255
	.section	__ex_table,"a"
L
Linus Torvalds 已提交
256
	.align		4
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
	.word		1b, __retl_efault, 2b, __retl_efault
	.word		3b, __retl_efault, 4b, __retl_efault
	.word		5b, __retl_efault, 6b, __retl_efault
	.word		7b, __retl_efault, 8b, __retl_efault
	.word		9b, __retl_efault, 10b, __retl_efault
	.word		11b, __retl_efault, 12b, __retl_efault
	.word		13b, __retl_efault, 14b, __retl_efault
	.word		15b, __retl_efault, 16b, __retl_efault
	.word		17b, __retl_efault, 18b, __retl_efault
	.word		19b, __retl_efault, 20b, __retl_efault
	.word		21b, __retl_efault, 22b, __retl_efault
	.word		23b, __retl_efault, 24b, __retl_efault
	.word		25b, __retl_efault, 26b, __retl_efault
	.word		27b, __retl_efault, 28b, __retl_efault
	.word		29b, __retl_efault, 30b, __retl_efault
	.word		31b, __retl_efault, 32b, __retl_efault
	.word		33b, __retl_efault, 34b, __retl_efault
	.word		35b, __retl_efault, 36b, __retl_efault
	.word		37b, __retl_efault, 38b, __retl_efault
	.word		39b, __retl_efault, 40b, __retl_efault
	.word		41b, __retl_efault, 42b, __retl_efault
	.word		43b, __retl_efault, 44b, __retl_efault
	.word		45b, __retl_efault, 46b, __retl_efault
	.word		47b, __retl_efault, 48b, __retl_efault
	.word		49b, __retl_efault, 50b, __retl_efault
	.word		51b, __retl_efault, 52b, __retl_efault
	.word		53b, __retl_efault, 54b, __retl_efault
	.word		55b, __retl_efault, 56b, __retl_efault
	.word		57b, __retl_efault, 58b, __retl_efault
	.word		59b, __retl_efault, 60b, __retl_efault
	.word		61b, __retl_efault, 62b, __retl_efault
D
David Miller 已提交
288 289
	.word		63b, __retl_efault, 64b, __retl_efault
	.word		65b, __retl_efault, 66b, __retl_efault
L
Linus Torvalds 已提交
290
	.previous