s390/compat: convert system call wrappers to C part 13
[linux-2.6/btrfs-unstable.git] / arch / s390 / kernel / compat_wrapper.S
blob583cac71df0646ce7803e05718139e0b4ad8085c
1 /*
2 *    wrapper for 31 bit compatible system calls.
4 *    Copyright IBM Corp. 2000, 2006
5 *    Author(s): Gerhard Tonn (ton@de.ibm.com),
6 *               Thomas Spatzier (tspat@de.ibm.com)
7 */
9 #include <linux/linkage.h>
11 ENTRY(sys32_time_wrapper)
12         llgtr   %r2,%r2                 # int *
13         jg      compat_sys_time         # branch to system call
15 #sys32_getpid_wrapper                           # void
17 ENTRY(sys32_mount_wrapper)
18         llgtr   %r2,%r2                 # char *
19         llgtr   %r3,%r3                 # char *
20         llgtr   %r4,%r4                 # char *
21         llgfr   %r5,%r5                 # unsigned long
22         llgtr   %r6,%r6                 # void *
23         jg      compat_sys_mount        # branch to system call
25 ENTRY(sys32_ptrace_wrapper)
26         lgfr    %r2,%r2                 # long
27         lgfr    %r3,%r3                 # long
28         llgtr   %r4,%r4                 # long
29         llgfr   %r5,%r5                 # long
30         jg      compat_sys_ptrace       # branch to system call
32 ENTRY(compat_sys_utime_wrapper)
33         llgtr   %r2,%r2                 # char *
34         llgtr   %r3,%r3                 # struct compat_utimbuf *
35         jg      compat_sys_utime        # branch to system call
37 ENTRY(compat_sys_times_wrapper)
38         llgtr   %r2,%r2                 # struct compat_tms *
39         jg      compat_sys_times        # branch to system call
41 ENTRY(compat_sys_ioctl_wrapper)
42         llgfr   %r2,%r2                 # unsigned int
43         llgfr   %r3,%r3                 # unsigned int
44         llgfr   %r4,%r4                 # unsigned int
45         jg      compat_sys_ioctl        # branch to system call
47 ENTRY(compat_sys_fcntl_wrapper)
48         llgfr   %r2,%r2                 # unsigned int
49         llgfr   %r3,%r3                 # unsigned int
50         llgfr   %r4,%r4                 # unsigned long
51         jg      compat_sys_fcntl        # branch to system call
53 ENTRY(sys32_ustat_wrapper)
54         llgfr   %r2,%r2                 # dev_t
55         llgtr   %r3,%r3                 # struct ustat *
56         jg      compat_sys_ustat
58 ENTRY(compat_sys_sigpending_wrapper)
59         llgtr   %r2,%r2                 # compat_old_sigset_t *
60         jg      compat_sys_sigpending   # branch to system call
62 ENTRY(compat_sys_setrlimit_wrapper)
63         llgfr   %r2,%r2                 # unsigned int
64         llgtr   %r3,%r3                 # struct rlimit_emu31 *
65         jg      compat_sys_setrlimit    # branch to system call
67 ENTRY(compat_sys_old_getrlimit_wrapper)
68         llgfr   %r2,%r2                 # unsigned int
69         llgtr   %r3,%r3                 # struct rlimit_emu31 *
70         jg      compat_sys_old_getrlimit # branch to system call
72 ENTRY(compat_sys_getrlimit_wrapper)
73         llgfr   %r2,%r2                 # unsigned int
74         llgtr   %r3,%r3                 # struct rlimit_emu31 *
75         jg      compat_sys_getrlimit    # branch to system call
77 ENTRY(compat_sys_gettimeofday_wrapper)
78         llgtr   %r2,%r2                 # struct timeval_emu31 *
79         llgtr   %r3,%r3                 # struct timezone *
80         jg      compat_sys_gettimeofday # branch to system call
82 ENTRY(compat_sys_settimeofday_wrapper)
83         llgtr   %r2,%r2                 # struct timeval_emu31 *
84         llgtr   %r3,%r3                 # struct timezone *
85         jg      compat_sys_settimeofday # branch to system call
87 ENTRY(old32_readdir_wrapper)
88         llgfr   %r2,%r2                 # unsigned int
89         llgtr   %r3,%r3                 # void *
90         llgfr   %r4,%r4                 # unsigned int
91         jg      compat_sys_old_readdir  # branch to system call
93 ENTRY(compat_sys_statfs_wrapper)
94         llgtr   %r2,%r2                 # char *
95         llgtr   %r3,%r3                 # struct compat_statfs *
96         jg      compat_sys_statfs       # branch to system call
98 ENTRY(compat_sys_fstatfs_wrapper)
99         llgfr   %r2,%r2                 # unsigned int
100         llgtr   %r3,%r3                 # struct compat_statfs *
101         jg      compat_sys_fstatfs      # branch to system call
103 ENTRY(compat_sys_socketcall_wrapper)
104         lgfr    %r2,%r2                 # int
105         llgtr   %r3,%r3                 # u32 *
106         jg      compat_sys_socketcall   # branch to system call
108 ENTRY(compat_sys_newstat_wrapper)
109         llgtr   %r2,%r2                 # char *
110         llgtr   %r3,%r3                 # struct stat_emu31 *
111         jg      compat_sys_newstat      # branch to system call
113 ENTRY(compat_sys_newlstat_wrapper)
114         llgtr   %r2,%r2                 # char *
115         llgtr   %r3,%r3                 # struct stat_emu31 *
116         jg      compat_sys_newlstat     # branch to system call
118 ENTRY(compat_sys_newfstat_wrapper)
119         llgfr   %r2,%r2                 # unsigned int
120         llgtr   %r3,%r3                 # struct stat_emu31 *
121         jg      compat_sys_newfstat     # branch to system call
123 ENTRY(compat_sys_sysinfo_wrapper)
124         llgtr   %r2,%r2                 # struct sysinfo_emu31 *
125         jg      compat_sys_sysinfo      # branch to system call
127 ENTRY(compat_sys_adjtimex_wrapper)
128         llgtr   %r2,%r2                 # struct compat_timex *
129         jg      compat_sys_adjtimex     # branch to system call
131 ENTRY(sys32_getdents_wrapper)
132         llgfr   %r2,%r2                 # unsigned int
133         llgtr   %r3,%r3                 # void *
134         llgfr   %r4,%r4                 # unsigned int
135         jg      compat_sys_getdents     # branch to system call
137 ENTRY(compat_sys_select_wrapper)
138         lgfr    %r2,%r2                 # int
139         llgtr   %r3,%r3                 # compat_fd_set *
140         llgtr   %r4,%r4                 # compat_fd_set *
141         llgtr   %r5,%r5                 # compat_fd_set *
142         llgtr   %r6,%r6                 # struct compat_timeval *
143         jg      compat_sys_select       # branch to system call
145 ENTRY(compat_sys_readv_wrapper)
146         lgfr    %r2,%r2                 # int
147         llgtr   %r3,%r3                 # const struct compat_iovec *
148         llgfr   %r4,%r4                 # unsigned long
149         jg      compat_sys_readv        # branch to system call
151 ENTRY(compat_sys_writev_wrapper)
152         lgfr    %r2,%r2                 # int
153         llgtr   %r3,%r3                 # const struct compat_iovec *
154         llgfr   %r4,%r4                 # unsigned long
155         jg      compat_sys_writev       # branch to system call
157 ENTRY(compat_sys_nanosleep_wrapper)
158         llgtr   %r2,%r2                 # struct compat_timespec *
159         llgtr   %r3,%r3                 # struct compat_timespec *
160         jg      compat_sys_nanosleep            # branch to system call
162 ENTRY(compat_sys_fcntl64_wrapper)
163         llgfr   %r2,%r2                 # unsigned int
164         llgfr   %r3,%r3                 # unsigned int
165         llgfr   %r4,%r4                 # unsigned long
166         jg      compat_sys_fcntl64      # branch to system call
168 ENTRY(sys32_stime_wrapper)
169         llgtr   %r2,%r2                 # long *
170         jg      compat_sys_stime        # branch to system call
172 ENTRY(sys32_sched_setaffinity_wrapper)
173         lgfr    %r2,%r2                 # int
174         llgfr   %r3,%r3                 # unsigned int
175         llgtr   %r4,%r4                 # unsigned long *
176         jg      compat_sys_sched_setaffinity
178 ENTRY(sys32_sched_getaffinity_wrapper)
179         lgfr    %r2,%r2                 # int
180         llgfr   %r3,%r3                 # unsigned int
181         llgtr   %r4,%r4                 # unsigned long *
182         jg      compat_sys_sched_getaffinity
184 ENTRY(sys32_clock_settime_wrapper)
185         lgfr    %r2,%r2                 # clockid_t (int)
186         llgtr   %r3,%r3                 # struct compat_timespec *
187         jg      compat_sys_clock_settime
189 ENTRY(sys32_clock_gettime_wrapper)
190         lgfr    %r2,%r2                 # clockid_t (int)
191         llgtr   %r3,%r3                 # struct compat_timespec *
192         jg      compat_sys_clock_gettime
194 ENTRY(sys32_clock_getres_wrapper)
195         lgfr    %r2,%r2                 # clockid_t (int)
196         llgtr   %r3,%r3                 # struct compat_timespec *
197         jg      compat_sys_clock_getres
199 ENTRY(sys32_clock_nanosleep_wrapper)
200         lgfr    %r2,%r2                 # clockid_t (int)
201         lgfr    %r3,%r3                 # int
202         llgtr   %r4,%r4                 # struct compat_timespec *
203         llgtr   %r5,%r5                 # struct compat_timespec *
204         jg      compat_sys_clock_nanosleep
206 ENTRY(sys32_timer_create_wrapper)
207         lgfr    %r2,%r2                 # timer_t (int)
208         llgtr   %r3,%r3                 # struct compat_sigevent *
209         llgtr   %r4,%r4                 # timer_t *
210         jg      compat_sys_timer_create
212 ENTRY(sys32_timer_settime_wrapper)
213         lgfr    %r2,%r2                 # timer_t (int)
214         lgfr    %r3,%r3                 # int
215         llgtr   %r4,%r4                 # struct compat_itimerspec *
216         llgtr   %r5,%r5                 # struct compat_itimerspec *
217         jg      compat_sys_timer_settime
219 ENTRY(sys32_timer_gettime_wrapper)
220         lgfr    %r2,%r2                 # timer_t (int)
221         llgtr   %r3,%r3                 # struct compat_itimerspec *
222         jg      compat_sys_timer_gettime
224 ENTRY(sys32_io_setup_wrapper)
225         llgfr   %r2,%r2                 # unsigned int
226         llgtr   %r3,%r3                 # u32 *
227         jg      compat_sys_io_setup
229 ENTRY(sys32_io_getevents_wrapper)
230         llgfr   %r2,%r2                 # (aio_context_t) u32
231         lgfr    %r3,%r3                 # long
232         lgfr    %r4,%r4                 # long
233         llgtr   %r5,%r5                 # struct io_event *
234         llgtr   %r6,%r6                 # struct compat_timespec *
235         jg      compat_sys_io_getevents
237 ENTRY(sys32_io_submit_wrapper)
238         llgfr   %r2,%r2                 # (aio_context_t) u32
239         lgfr    %r3,%r3                 # long
240         llgtr   %r4,%r4                 # struct iocb **
241         jg      compat_sys_io_submit
243 ENTRY(compat_sys_statfs64_wrapper)
244         llgtr   %r2,%r2                 # const char *
245         llgfr   %r3,%r3                 # compat_size_t
246         llgtr   %r4,%r4                 # struct compat_statfs64 *
247         jg      compat_sys_statfs64
249 ENTRY(compat_sys_fstatfs64_wrapper)
250         llgfr   %r2,%r2                 # unsigned int fd
251         llgfr   %r3,%r3                 # compat_size_t
252         llgtr   %r4,%r4                 # struct compat_statfs64 *
253         jg      compat_sys_fstatfs64
255 ENTRY(compat_sys_mq_open_wrapper)
256         llgtr   %r2,%r2                 # const char *
257         lgfr    %r3,%r3                 # int
258         llgfr   %r4,%r4                 # mode_t
259         llgtr   %r5,%r5                 # struct compat_mq_attr *
260         jg      compat_sys_mq_open
262 ENTRY(compat_sys_mq_timedsend_wrapper)
263         lgfr    %r2,%r2                 # mqd_t
264         llgtr   %r3,%r3                 # const char *
265         llgfr   %r4,%r4                 # size_t
266         llgfr   %r5,%r5                 # unsigned int
267         llgtr   %r6,%r6                 # const struct compat_timespec *
268         jg      compat_sys_mq_timedsend
270 ENTRY(compat_sys_mq_timedreceive_wrapper)
271         lgfr    %r2,%r2                 # mqd_t
272         llgtr   %r3,%r3                 # char *
273         llgfr   %r4,%r4                 # size_t
274         llgtr   %r5,%r5                 # unsigned int *
275         llgtr   %r6,%r6                 # const struct compat_timespec *
276         jg      compat_sys_mq_timedreceive
278 ENTRY(compat_sys_mq_notify_wrapper)
279         lgfr    %r2,%r2                 # mqd_t
280         llgtr   %r3,%r3                 # struct compat_sigevent *
281         jg      compat_sys_mq_notify
283 ENTRY(compat_sys_mq_getsetattr_wrapper)
284         lgfr    %r2,%r2                 # mqd_t
285         llgtr   %r3,%r3                 # struct compat_mq_attr *
286         llgtr   %r4,%r4                 # struct compat_mq_attr *
287         jg      compat_sys_mq_getsetattr
289 ENTRY(compat_sys_kexec_load_wrapper)
290         llgfr   %r2,%r2                 # unsigned long
291         llgfr   %r3,%r3                 # unsigned long
292         llgtr   %r4,%r4                 # struct kexec_segment *
293         llgfr   %r5,%r5                 # unsigned long
294         jg      compat_sys_kexec_load
296 ENTRY(compat_sys_futimesat_wrapper)
297         llgfr   %r2,%r2                 # unsigned int
298         llgtr   %r3,%r3                 # char *
299         llgtr   %r4,%r4                 # struct timeval *
300         jg      compat_sys_futimesat
302 ENTRY(compat_sys_pselect6_wrapper)
303         lgfr    %r2,%r2                 # int
304         llgtr   %r3,%r3                 # fd_set *
305         llgtr   %r4,%r4                 # fd_set *
306         llgtr   %r5,%r5                 # fd_set *
307         llgtr   %r6,%r6                 # struct timespec *
308         llgt    %r0,164(%r15)           # void *
309         stg     %r0,160(%r15)
310         jg      compat_sys_pselect6
312 ENTRY(compat_sys_ppoll_wrapper)
313         llgtr   %r2,%r2                 # struct pollfd *
314         llgfr   %r3,%r3                 # unsigned int
315         llgtr   %r4,%r4                 # struct timespec *
316         llgtr   %r5,%r5                 # const sigset_t *
317         llgfr   %r6,%r6                 # size_t
318         jg      compat_sys_ppoll
320 ENTRY(sys_sync_file_range_wrapper)
321         lgfr    %r2,%r2                 # int
322         sllg    %r3,%r3,32              # get high word of 64bit loff_t
323         or      %r3,%r4                 # get low word of 64bit loff_t
324         sllg    %r4,%r5,32              # get high word of 64bit loff_t
325         or      %r4,%r6                 # get low word of 64bit loff_t
326         llgf    %r5,164(%r15)           # unsigned int
327         jg      sys_sync_file_range
329 ENTRY(sys_getcpu_wrapper)
330         llgtr   %r2,%r2                 # unsigned *
331         llgtr   %r3,%r3                 # unsigned *
332         llgtr   %r4,%r4                 # struct getcpu_cache *
333         jg      sys_getcpu
335 ENTRY(compat_sys_utimes_wrapper)
336         llgtr   %r2,%r2                 # char *
337         llgtr   %r3,%r3                 # struct compat_timeval *
338         jg      compat_sys_utimes
340 ENTRY(compat_sys_utimensat_wrapper)
341         llgfr   %r2,%r2                 # unsigned int
342         llgtr   %r3,%r3                 # char *
343         llgtr   %r4,%r4                 # struct compat_timespec *
344         lgfr    %r5,%r5                 # int
345         jg      compat_sys_utimensat
347 ENTRY(sys_eventfd_wrapper)
348         llgfr   %r2,%r2                 # unsigned int
349         jg      sys_eventfd
351 ENTRY(sys_fallocate_wrapper)
352         lgfr    %r2,%r2                 # int
353         lgfr    %r3,%r3                 # int
354         sllg    %r4,%r4,32              # get high word of 64bit loff_t
355         lr      %r4,%r5                 # get low word of 64bit loff_t
356         sllg    %r5,%r6,32              # get high word of 64bit loff_t
357         l       %r5,164(%r15)           # get low word of 64bit loff_t
358         jg      sys_fallocate
360 ENTRY(sys_timerfd_create_wrapper)
361         lgfr    %r2,%r2                 # int
362         lgfr    %r3,%r3                 # int
363         jg      sys_timerfd_create
365 ENTRY(sys_eventfd2_wrapper)
366         llgfr   %r2,%r2                 # unsigned int
367         lgfr    %r3,%r3                 # int
368         jg      sys_eventfd2
370 ENTRY(sys_inotify_init1_wrapper)
371         lgfr    %r2,%r2                 # int
372         jg      sys_inotify_init1
374 ENTRY(sys_pipe2_wrapper)
375         llgtr   %r2,%r2                 # u32 *
376         lgfr    %r3,%r3                 # int
377         jg      sys_pipe2               # branch to system call
379 ENTRY(sys_dup3_wrapper)
380         llgfr   %r2,%r2                 # unsigned int
381         llgfr   %r3,%r3                 # unsigned int
382         lgfr    %r4,%r4                 # int
383         jg      sys_dup3                # branch to system call
385 ENTRY(sys_epoll_create1_wrapper)
386         lgfr    %r2,%r2                 # int
387         jg      sys_epoll_create1       # branch to system call
389 ENTRY(sys_tkill_wrapper)
390         lgfr    %r2,%r2                 # pid_t
391         lgfr    %r3,%r3                 # int
392         jg      sys_tkill               # branch to system call
394 ENTRY(sys_tgkill_wrapper)
395         lgfr    %r2,%r2                 # pid_t
396         lgfr    %r3,%r3                 # pid_t
397         lgfr    %r4,%r4                 # int
398         jg      sys_tgkill              # branch to system call
400 ENTRY(compat_sys_keyctl_wrapper)
401         llgfr   %r2,%r2                 # u32
402         llgfr   %r3,%r3                 # u32
403         llgfr   %r4,%r4                 # u32
404         llgfr   %r5,%r5                 # u32
405         llgfr   %r6,%r6                 # u32
406         jg      compat_sys_keyctl       # branch to system call
408 ENTRY(sys_perf_event_open_wrapper)
409         llgtr   %r2,%r2                 # const struct perf_event_attr *
410         lgfr    %r3,%r3                 # pid_t
411         lgfr    %r4,%r4                 # int
412         lgfr    %r5,%r5                 # int
413         llgfr   %r6,%r6                 # unsigned long
414         jg      sys_perf_event_open     # branch to system call
416 ENTRY(sys_clone_wrapper)
417         llgfr   %r2,%r2                 # unsigned long
418         llgfr   %r3,%r3                 # unsigned long
419         llgtr   %r4,%r4                 # int *
420         llgtr   %r5,%r5                 # int *
421         jg      sys_clone               # branch to system call
423 ENTRY(sys32_execve_wrapper)
424         llgtr   %r2,%r2                 # char *
425         llgtr   %r3,%r3                 # compat_uptr_t *
426         llgtr   %r4,%r4                 # compat_uptr_t *
427         jg      compat_sys_execve       # branch to system call
429 ENTRY(sys_fanotify_init_wrapper)
430         llgfr   %r2,%r2                 # unsigned int
431         llgfr   %r3,%r3                 # unsigned int
432         jg      sys_fanotify_init       # branch to system call
434 ENTRY(sys_prlimit64_wrapper)
435         lgfr    %r2,%r2                 # pid_t
436         llgfr   %r3,%r3                 # unsigned int
437         llgtr   %r4,%r4                 # const struct rlimit64 __user *
438         llgtr   %r5,%r5                 # struct rlimit64 __user *
439         jg      sys_prlimit64           # branch to system call
441 ENTRY(sys_name_to_handle_at_wrapper)
442         lgfr    %r2,%r2                 # int
443         llgtr   %r3,%r3                 # const char __user *
444         llgtr   %r4,%r4                 # struct file_handle __user *
445         llgtr   %r5,%r5                 # int __user *
446         lgfr    %r6,%r6                 # int
447         jg      sys_name_to_handle_at
449 ENTRY(compat_sys_clock_adjtime_wrapper)
450         lgfr    %r2,%r2                 # clockid_t (int)
451         llgtr   %r3,%r3                 # struct compat_timex __user *
452         jg      compat_sys_clock_adjtime
454 ENTRY(sys_syncfs_wrapper)
455         lgfr    %r2,%r2                 # int
456         jg      sys_syncfs
458 ENTRY(sys_setns_wrapper)
459         lgfr    %r2,%r2                 # int
460         lgfr    %r3,%r3                 # int
461         jg      sys_setns
463 ENTRY(compat_sys_process_vm_readv_wrapper)
464         lgfr    %r2,%r2                 # compat_pid_t
465         llgtr   %r3,%r3                 # struct compat_iovec __user *
466         llgfr   %r4,%r4                 # unsigned long
467         llgtr   %r5,%r5                 # struct compat_iovec __user *
468         llgfr   %r6,%r6                 # unsigned long
469         llgf    %r0,164(%r15)           # unsigned long
470         stg     %r0,160(%r15)
471         jg      compat_sys_process_vm_readv
473 ENTRY(compat_sys_process_vm_writev_wrapper)
474         lgfr    %r2,%r2                 # compat_pid_t
475         llgtr   %r3,%r3                 # struct compat_iovec __user *
476         llgfr   %r4,%r4                 # unsigned long
477         llgtr   %r5,%r5                 # struct compat_iovec __user *
478         llgfr   %r6,%r6                 # unsigned long
479         llgf    %r0,164(%r15)           # unsigned long
480         stg     %r0,160(%r15)
481         jg      compat_sys_process_vm_writev
483 ENTRY(sys_s390_runtime_instr_wrapper)
484         lgfr    %r2,%r2                 # int
485         lgfr    %r3,%r3                 # int
486         jg      sys_s390_runtime_instr
488 ENTRY(sys_kcmp_wrapper)
489         lgfr    %r2,%r2                 # pid_t
490         lgfr    %r3,%r3                 # pid_t
491         lgfr    %r4,%r4                 # int
492         llgfr   %r5,%r5                 # unsigned long
493         llgfr   %r6,%r6                 # unsigned long
494         jg      sys_kcmp
496 ENTRY(sys_finit_module_wrapper)
497         lgfr    %r2,%r2                 # int
498         llgtr   %r3,%r3                 # const char __user *
499         lgfr    %r4,%r4                 # int
500         jg      sys_finit_module
502 ENTRY(sys_sched_setattr_wrapper)
503         lgfr    %r2,%r2                 # pid_t
504         llgtr   %r3,%r3                 # struct sched_attr __user *
505         jg      sys_sched_setattr
507 ENTRY(sys_sched_getattr_wrapper)
508         lgfr    %r2,%r2                 # pid_t
509         llgtr   %r3,%r3                 # const char __user *
510         llgfr   %r4,%r4                 # unsigned int
511         jg      sys_sched_getattr