Skip to content

Commit d6fbd26

Browse files
committed
sparc: fix compat recv/recvfrom syscalls
sparc has the wrong compat version of recv() and recvfrom() for both the direct syscalls and socketcall(). The direct syscalls just need to use the compat version. For socketcall, the same thing could be done, but it seems better to completely remove the custom assembler code for it and just use the same implementation that everyone else has. Fixes: 1dacc76 ("net/compat/wext: send different messages to compat tasks") Signed-off-by: Arnd Bergmann <arnd@arndb.de>
1 parent bae6428 commit d6fbd26

File tree

2 files changed

+2
-223
lines changed

2 files changed

+2
-223
lines changed

arch/sparc/kernel/sys32.S

Lines changed: 0 additions & 221 deletions
Original file line numberDiff line numberDiff line change
@@ -18,224 +18,3 @@ sys32_mmap2:
1818
sethi %hi(sys_mmap), %g1
1919
jmpl %g1 + %lo(sys_mmap), %g0
2020
sllx %o5, 12, %o5
21-
22-
.align 32
23-
.globl sys32_socketcall
24-
sys32_socketcall: /* %o0=call, %o1=args */
25-
cmp %o0, 1
26-
bl,pn %xcc, do_einval
27-
cmp %o0, 18
28-
bg,pn %xcc, do_einval
29-
sub %o0, 1, %o0
30-
sllx %o0, 5, %o0
31-
sethi %hi(__socketcall_table_begin), %g2
32-
or %g2, %lo(__socketcall_table_begin), %g2
33-
jmpl %g2 + %o0, %g0
34-
nop
35-
do_einval:
36-
retl
37-
mov -EINVAL, %o0
38-
39-
.align 32
40-
__socketcall_table_begin:
41-
42-
/* Each entry is exactly 32 bytes. */
43-
do_sys_socket: /* sys_socket(int, int, int) */
44-
1: ldswa [%o1 + 0x0] %asi, %o0
45-
sethi %hi(sys_socket), %g1
46-
2: ldswa [%o1 + 0x8] %asi, %o2
47-
jmpl %g1 + %lo(sys_socket), %g0
48-
3: ldswa [%o1 + 0x4] %asi, %o1
49-
nop
50-
nop
51-
nop
52-
do_sys_bind: /* sys_bind(int fd, struct sockaddr *, int) */
53-
4: ldswa [%o1 + 0x0] %asi, %o0
54-
sethi %hi(sys_bind), %g1
55-
5: ldswa [%o1 + 0x8] %asi, %o2
56-
jmpl %g1 + %lo(sys_bind), %g0
57-
6: lduwa [%o1 + 0x4] %asi, %o1
58-
nop
59-
nop
60-
nop
61-
do_sys_connect: /* sys_connect(int, struct sockaddr *, int) */
62-
7: ldswa [%o1 + 0x0] %asi, %o0
63-
sethi %hi(sys_connect), %g1
64-
8: ldswa [%o1 + 0x8] %asi, %o2
65-
jmpl %g1 + %lo(sys_connect), %g0
66-
9: lduwa [%o1 + 0x4] %asi, %o1
67-
nop
68-
nop
69-
nop
70-
do_sys_listen: /* sys_listen(int, int) */
71-
10: ldswa [%o1 + 0x0] %asi, %o0
72-
sethi %hi(sys_listen), %g1
73-
jmpl %g1 + %lo(sys_listen), %g0
74-
11: ldswa [%o1 + 0x4] %asi, %o1
75-
nop
76-
nop
77-
nop
78-
nop
79-
do_sys_accept: /* sys_accept(int, struct sockaddr *, int *) */
80-
12: ldswa [%o1 + 0x0] %asi, %o0
81-
sethi %hi(sys_accept), %g1
82-
13: lduwa [%o1 + 0x8] %asi, %o2
83-
jmpl %g1 + %lo(sys_accept), %g0
84-
14: lduwa [%o1 + 0x4] %asi, %o1
85-
nop
86-
nop
87-
nop
88-
do_sys_getsockname: /* sys_getsockname(int, struct sockaddr *, int *) */
89-
15: ldswa [%o1 + 0x0] %asi, %o0
90-
sethi %hi(sys_getsockname), %g1
91-
16: lduwa [%o1 + 0x8] %asi, %o2
92-
jmpl %g1 + %lo(sys_getsockname), %g0
93-
17: lduwa [%o1 + 0x4] %asi, %o1
94-
nop
95-
nop
96-
nop
97-
do_sys_getpeername: /* sys_getpeername(int, struct sockaddr *, int *) */
98-
18: ldswa [%o1 + 0x0] %asi, %o0
99-
sethi %hi(sys_getpeername), %g1
100-
19: lduwa [%o1 + 0x8] %asi, %o2
101-
jmpl %g1 + %lo(sys_getpeername), %g0
102-
20: lduwa [%o1 + 0x4] %asi, %o1
103-
nop
104-
nop
105-
nop
106-
do_sys_socketpair: /* sys_socketpair(int, int, int, int *) */
107-
21: ldswa [%o1 + 0x0] %asi, %o0
108-
sethi %hi(sys_socketpair), %g1
109-
22: ldswa [%o1 + 0x8] %asi, %o2
110-
23: lduwa [%o1 + 0xc] %asi, %o3
111-
jmpl %g1 + %lo(sys_socketpair), %g0
112-
24: ldswa [%o1 + 0x4] %asi, %o1
113-
nop
114-
nop
115-
do_sys_send: /* sys_send(int, void *, size_t, unsigned int) */
116-
25: ldswa [%o1 + 0x0] %asi, %o0
117-
sethi %hi(sys_send), %g1
118-
26: lduwa [%o1 + 0x8] %asi, %o2
119-
27: lduwa [%o1 + 0xc] %asi, %o3
120-
jmpl %g1 + %lo(sys_send), %g0
121-
28: lduwa [%o1 + 0x4] %asi, %o1
122-
nop
123-
nop
124-
do_sys_recv: /* sys_recv(int, void *, size_t, unsigned int) */
125-
29: ldswa [%o1 + 0x0] %asi, %o0
126-
sethi %hi(sys_recv), %g1
127-
30: lduwa [%o1 + 0x8] %asi, %o2
128-
31: lduwa [%o1 + 0xc] %asi, %o3
129-
jmpl %g1 + %lo(sys_recv), %g0
130-
32: lduwa [%o1 + 0x4] %asi, %o1
131-
nop
132-
nop
133-
do_sys_sendto: /* sys_sendto(int, u32, compat_size_t, unsigned int, u32, int) */
134-
33: ldswa [%o1 + 0x0] %asi, %o0
135-
sethi %hi(sys_sendto), %g1
136-
34: lduwa [%o1 + 0x8] %asi, %o2
137-
35: lduwa [%o1 + 0xc] %asi, %o3
138-
36: lduwa [%o1 + 0x10] %asi, %o4
139-
37: ldswa [%o1 + 0x14] %asi, %o5
140-
jmpl %g1 + %lo(sys_sendto), %g0
141-
38: lduwa [%o1 + 0x4] %asi, %o1
142-
do_sys_recvfrom: /* sys_recvfrom(int, u32, compat_size_t, unsigned int, u32, u32) */
143-
39: ldswa [%o1 + 0x0] %asi, %o0
144-
sethi %hi(sys_recvfrom), %g1
145-
40: lduwa [%o1 + 0x8] %asi, %o2
146-
41: lduwa [%o1 + 0xc] %asi, %o3
147-
42: lduwa [%o1 + 0x10] %asi, %o4
148-
43: lduwa [%o1 + 0x14] %asi, %o5
149-
jmpl %g1 + %lo(sys_recvfrom), %g0
150-
44: lduwa [%o1 + 0x4] %asi, %o1
151-
do_sys_shutdown: /* sys_shutdown(int, int) */
152-
45: ldswa [%o1 + 0x0] %asi, %o0
153-
sethi %hi(sys_shutdown), %g1
154-
jmpl %g1 + %lo(sys_shutdown), %g0
155-
46: ldswa [%o1 + 0x4] %asi, %o1
156-
nop
157-
nop
158-
nop
159-
nop
160-
do_sys_setsockopt: /* sys_setsockopt(int, int, int, char *, int) */
161-
47: ldswa [%o1 + 0x0] %asi, %o0
162-
sethi %hi(sys_setsockopt), %g1
163-
48: ldswa [%o1 + 0x8] %asi, %o2
164-
49: lduwa [%o1 + 0xc] %asi, %o3
165-
50: ldswa [%o1 + 0x10] %asi, %o4
166-
jmpl %g1 + %lo(sys_setsockopt), %g0
167-
51: ldswa [%o1 + 0x4] %asi, %o1
168-
nop
169-
do_sys_getsockopt: /* sys_getsockopt(int, int, int, u32, u32) */
170-
52: ldswa [%o1 + 0x0] %asi, %o0
171-
sethi %hi(sys_getsockopt), %g1
172-
53: ldswa [%o1 + 0x8] %asi, %o2
173-
54: lduwa [%o1 + 0xc] %asi, %o3
174-
55: lduwa [%o1 + 0x10] %asi, %o4
175-
jmpl %g1 + %lo(sys_getsockopt), %g0
176-
56: ldswa [%o1 + 0x4] %asi, %o1
177-
nop
178-
do_sys_sendmsg: /* compat_sys_sendmsg(int, struct compat_msghdr *, unsigned int) */
179-
57: ldswa [%o1 + 0x0] %asi, %o0
180-
sethi %hi(compat_sys_sendmsg), %g1
181-
58: lduwa [%o1 + 0x8] %asi, %o2
182-
jmpl %g1 + %lo(compat_sys_sendmsg), %g0
183-
59: lduwa [%o1 + 0x4] %asi, %o1
184-
nop
185-
nop
186-
nop
187-
do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) */
188-
60: ldswa [%o1 + 0x0] %asi, %o0
189-
sethi %hi(compat_sys_recvmsg), %g1
190-
61: lduwa [%o1 + 0x8] %asi, %o2
191-
jmpl %g1 + %lo(compat_sys_recvmsg), %g0
192-
62: lduwa [%o1 + 0x4] %asi, %o1
193-
nop
194-
nop
195-
nop
196-
do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */
197-
63: ldswa [%o1 + 0x0] %asi, %o0
198-
sethi %hi(sys_accept4), %g1
199-
64: lduwa [%o1 + 0x8] %asi, %o2
200-
65: ldswa [%o1 + 0xc] %asi, %o3
201-
jmpl %g1 + %lo(sys_accept4), %g0
202-
66: lduwa [%o1 + 0x4] %asi, %o1
203-
nop
204-
nop
205-
206-
.section __ex_table,"a"
207-
.align 4
208-
.word 1b, __retl_efault, 2b, __retl_efault
209-
.word 3b, __retl_efault, 4b, __retl_efault
210-
.word 5b, __retl_efault, 6b, __retl_efault
211-
.word 7b, __retl_efault, 8b, __retl_efault
212-
.word 9b, __retl_efault, 10b, __retl_efault
213-
.word 11b, __retl_efault, 12b, __retl_efault
214-
.word 13b, __retl_efault, 14b, __retl_efault
215-
.word 15b, __retl_efault, 16b, __retl_efault
216-
.word 17b, __retl_efault, 18b, __retl_efault
217-
.word 19b, __retl_efault, 20b, __retl_efault
218-
.word 21b, __retl_efault, 22b, __retl_efault
219-
.word 23b, __retl_efault, 24b, __retl_efault
220-
.word 25b, __retl_efault, 26b, __retl_efault
221-
.word 27b, __retl_efault, 28b, __retl_efault
222-
.word 29b, __retl_efault, 30b, __retl_efault
223-
.word 31b, __retl_efault, 32b, __retl_efault
224-
.word 33b, __retl_efault, 34b, __retl_efault
225-
.word 35b, __retl_efault, 36b, __retl_efault
226-
.word 37b, __retl_efault, 38b, __retl_efault
227-
.word 39b, __retl_efault, 40b, __retl_efault
228-
.word 41b, __retl_efault, 42b, __retl_efault
229-
.word 43b, __retl_efault, 44b, __retl_efault
230-
.word 45b, __retl_efault, 46b, __retl_efault
231-
.word 47b, __retl_efault, 48b, __retl_efault
232-
.word 49b, __retl_efault, 50b, __retl_efault
233-
.word 51b, __retl_efault, 52b, __retl_efault
234-
.word 53b, __retl_efault, 54b, __retl_efault
235-
.word 55b, __retl_efault, 56b, __retl_efault
236-
.word 57b, __retl_efault, 58b, __retl_efault
237-
.word 59b, __retl_efault, 60b, __retl_efault
238-
.word 61b, __retl_efault, 62b, __retl_efault
239-
.word 63b, __retl_efault, 64b, __retl_efault
240-
.word 65b, __retl_efault, 66b, __retl_efault
241-
.previous

arch/sparc/kernel/syscalls/syscall.tbl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@
155155
123 32 fchown sys_fchown16
156156
123 64 fchown sys_fchown
157157
124 common fchmod sys_fchmod
158-
125 common recvfrom sys_recvfrom
158+
125 common recvfrom sys_recvfrom compat_sys_recvfrom
159159
126 32 setreuid sys_setreuid16
160160
126 64 setreuid sys_setreuid
161161
127 32 setregid sys_setregid16
@@ -247,7 +247,7 @@
247247
204 32 readdir sys_old_readdir compat_sys_old_readdir
248248
204 64 readdir sys_nis_syscall
249249
205 common readahead sys_readahead compat_sys_readahead
250-
206 common socketcall sys_socketcall sys32_socketcall
250+
206 common socketcall sys_socketcall compat_sys_socketcall
251251
207 common syslog sys_syslog
252252
208 common lookup_dcookie sys_ni_syscall
253253
209 common fadvise64 sys_fadvise64 compat_sys_fadvise64

0 commit comments

Comments
 (0)