]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - arch/s390/kernel/compat_wrapper.c
Merge tag 'efi-urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi into...
[mirror_ubuntu-artful-kernel.git] / arch / s390 / kernel / compat_wrapper.c
CommitLineData
1e4ec621 1/*
572c3eb7 2 * Compat system call wrappers.
1e4ec621
HC
3 *
4 * Copyright IBM Corp. 2014
5 */
6
b07edab2
HC
7#include <linux/syscalls.h>
8#include <linux/compat.h>
86d295e1 9#include "entry.h"
b07edab2
HC
10
11#define COMPAT_SYSCALL_WRAP1(name, ...) \
12 COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__)
13#define COMPAT_SYSCALL_WRAP2(name, ...) \
14 COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__)
15#define COMPAT_SYSCALL_WRAP3(name, ...) \
16 COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__)
17#define COMPAT_SYSCALL_WRAP4(name, ...) \
18 COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__)
19#define COMPAT_SYSCALL_WRAP5(name, ...) \
20 COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__)
21#define COMPAT_SYSCALL_WRAP6(name, ...) \
22 COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__)
23
c2e7c3d0
HC
24#define __SC_COMPAT_TYPE(t, a) \
25 __typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a
26
ab4f8bba
HC
27#define __SC_COMPAT_CAST(t, a) \
28({ \
29 long __ReS = a; \
30 \
31 BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \
32 !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \
33 if (__TYPE_IS_L(t)) \
34 __ReS = (s32)a; \
35 if (__TYPE_IS_UL(t)) \
36 __ReS = (u32)a; \
37 if (__TYPE_IS_PTR(t)) \
38 __ReS = a & 0x7fffffff; \
39 (t)__ReS; \
40})
41
c2e7c3d0
HC
42/*
43 * The COMPAT_SYSCALL_WRAP macro generates system call wrappers to be used by
44 * compat tasks. These wrappers will only be used for system calls where only
45 * the system call arguments need sign or zero extension or zeroing of the upper
46 * 33 bits of pointers.
47 * Note: since the wrapper function will afterwards call a system call which
48 * again performs zero and sign extension for all system call arguments with
49 * a size of less than eight bytes, these compat wrappers only touch those
50 * system call arguments with a size of eight bytes ((unsigned) long and
51 * pointers). Zero and sign extension for e.g. int parameters will be done by
52 * the regular system call wrappers.
53 */
b07edab2 54#define COMPAT_SYSCALL_WRAPx(x, name, ...) \
a55b2ae7
HC
55asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
56asmlinkage long notrace compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__));\
57asmlinkage long notrace compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) \
58{ \
59 return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \
60}
b07edab2 61
b07edab2
HC
62COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode);
63COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname);
64COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname);
65COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename);
66COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev);
67COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode);
68COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name);
b07edab2 69COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode);
473a0657
HC
70COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname);
71COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode);
72COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname);
473a0657 73COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes);
ab4f8bba 74COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk);
473a0657
HC
75COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler);
76COMPAT_SYSCALL_WRAP1(acct, const char __user *, name);
77COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags);
be06fbf8 78COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename);
ab4f8bba 79COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask);
be06fbf8
HC
80COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len);
81COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new);
82COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz);
83COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library);
84COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags);
c355ce18 85COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg);
ab4f8bba 86COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len);
c355ce18
HC
87COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len);
88COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile);
c355ce18
HC
89COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len);
90COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name);
ab4f8bba
HC
91COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot);
92COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs);
86d295e1
HC
93COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags);
94COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr);
ab4f8bba
HC
95COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data);
96COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2);
ab4f8bba 97COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence);
ab4f8bba 98COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags);
ab4f8bba
HC
99COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len);
100COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len);
ab4f8bba
HC
101COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param);
102COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param);
103COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param);
ab4f8bba 104COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr);
0ebe3eec 105COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout);
ab4f8bba
HC
106COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5);
107COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size);
0ebe3eec
HC
108COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr);
109COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data);
ab4f8bba 110COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group);
ab4f8bba
HC
111COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist);
112COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist);
ab4f8bba 113COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid);
ab4f8bba
HC
114COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid);
115COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group);
24e4c2aa 116COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old);
ab4f8bba
HC
117COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec);
118COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior);
119COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags);
120COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags);
121COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags);
18421166 122COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count);
ab4f8bba
HC
123COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size);
124COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size);
125COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size);
126COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size);
127COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size);
128COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size);
18421166
HC
129COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name);
130COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name);
131COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name);
9c4d62fa 132COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr);
9c4d62fa
HC
133COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event);
134COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout);
ab4f8bba
HC
135COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx);
136COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result);
9c4d62fa 137COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name);
ab4f8bba 138COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id);
20f7835c 139COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id);
ab4f8bba 140COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags);
20f7835c 141COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask);
20f7835c
HC
142COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode);
143COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev);
ab4f8bba 144COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag);
28798abc
HC
145COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag);
146COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname);
147COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags);
148COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname);
149COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz);
150COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode);
151COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode);
ab4f8bba
HC
152COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags);
153COMPAT_SYSCALL_WRAP6(splice, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags);
154COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags);
7f6afe87 155COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache);
7f6afe87 156COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags);
ab4f8bba 157COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags);
3033f14a 158COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, int __user *, parent_tidptr, int __user *, child_tidptr, unsigned long, tls);
00fcb149
HC
159COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim);
160COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag);
ab4f8bba 161COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2);
00fcb149
HC
162COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags);
163COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags);
164COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags);
a1977d12 165COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags);
b8a7a990
HC
166COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs)
167COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags)
7bb1cdbf 168COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags)
fcb1c2d7 169COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size);
4eafad7f
AI
170COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length);
171COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length);
977108f8
HC
172COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec);
173COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen);
174COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen);
175COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags);
176COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len);
177COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len);
178COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len);
932f6081 179COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags);
696aafd3 180COMPAT_SYSCALL_WRAP6(copy_file_range, int, fd_in, loff_t __user *, off_in, int, fd_out, loff_t __user *, off_out, size_t, len, unsigned int, flags);
8bd49ac8 181COMPAT_SYSCALL_WRAP5(statx, int, dfd, const char __user *, path, unsigned, flags, unsigned, mask, struct statx __user *, buffer);