Commit | Line | Data |
---|---|---|
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 |
55 | asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ |
56 | asmlinkage long notrace compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__));\ | |
57 | asmlinkage 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 |
62 | COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode); |
63 | COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname); | |
64 | COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname); | |
65 | COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename); | |
66 | COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev); | |
67 | COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode); | |
68 | COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name); | |
b07edab2 | 69 | COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode); |
473a0657 HC |
70 | COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname); |
71 | COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode); | |
72 | COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname); | |
473a0657 | 73 | COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes); |
ab4f8bba | 74 | COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk); |
473a0657 HC |
75 | COMPAT_SYSCALL_WRAP2(signal, int, sig, __sighandler_t, handler); |
76 | COMPAT_SYSCALL_WRAP1(acct, const char __user *, name); | |
77 | COMPAT_SYSCALL_WRAP2(umount, char __user *, name, int, flags); | |
be06fbf8 | 78 | COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename); |
ab4f8bba | 79 | COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask); |
be06fbf8 HC |
80 | COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len); |
81 | COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new); | |
82 | COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz); | |
83 | COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library); | |
84 | COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags); | |
c355ce18 | 85 | COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg); |
ab4f8bba | 86 | COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len); |
c355ce18 HC |
87 | COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len); |
88 | COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile); | |
c355ce18 HC |
89 | COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len); |
90 | COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name); | |
ab4f8bba HC |
91 | COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot); |
92 | COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs); | |
86d295e1 HC |
93 | COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags); |
94 | COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr); | |
ab4f8bba HC |
95 | COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data); |
96 | COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2); | |
ab4f8bba | 97 | COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence); |
ab4f8bba | 98 | COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags); |
ab4f8bba HC |
99 | COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len); |
100 | COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len); | |
ab4f8bba HC |
101 | COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param); |
102 | COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param); | |
103 | COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param); | |
ab4f8bba | 104 | COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr); |
0ebe3eec | 105 | COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout); |
ab4f8bba HC |
106 | COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5); |
107 | COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size); | |
0ebe3eec HC |
108 | COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr); |
109 | COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data); | |
ab4f8bba | 110 | COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group); |
ab4f8bba HC |
111 | COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist); |
112 | COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist); | |
ab4f8bba | 113 | COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid); |
ab4f8bba HC |
114 | COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid); |
115 | COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group); | |
24e4c2aa | 116 | COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old); |
ab4f8bba HC |
117 | COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec); |
118 | COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior); | |
119 | COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); | |
120 | COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags); | |
121 | COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags); | |
18421166 | 122 | COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count); |
ab4f8bba HC |
123 | COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); |
124 | COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size); | |
125 | COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size); | |
126 | COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size); | |
127 | COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size); | |
128 | COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size); | |
18421166 HC |
129 | COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name); |
130 | COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name); | |
131 | COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name); | |
9c4d62fa | 132 | COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr); |
9c4d62fa HC |
133 | COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event); |
134 | COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout); | |
ab4f8bba HC |
135 | COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx); |
136 | COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result); | |
9c4d62fa | 137 | COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name); |
ab4f8bba | 138 | COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id); |
20f7835c | 139 | COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id); |
ab4f8bba | 140 | COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags); |
20f7835c | 141 | COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask); |
20f7835c HC |
142 | COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode); |
143 | COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev); | |
ab4f8bba | 144 | COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag); |
28798abc HC |
145 | COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag); |
146 | COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname); | |
147 | COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags); | |
148 | COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname); | |
149 | COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz); | |
150 | COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode); | |
151 | COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode); | |
ab4f8bba HC |
152 | COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags); |
153 | COMPAT_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); | |
154 | COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); | |
7f6afe87 | 155 | COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache); |
7f6afe87 | 156 | COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags); |
ab4f8bba | 157 | COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags); |
3033f14a | 158 | COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, int __user *, parent_tidptr, int __user *, child_tidptr, unsigned long, tls); |
00fcb149 HC |
159 | COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim); |
160 | COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag); | |
ab4f8bba | 161 | COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2); |
00fcb149 HC |
162 | COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags); |
163 | COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags); | |
164 | COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags); | |
a1977d12 | 165 | COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags); |
b8a7a990 HC |
166 | COMPAT_SYSCALL_WRAP3(seccomp, unsigned int, op, unsigned int, flags, const char __user *, uargs) |
167 | COMPAT_SYSCALL_WRAP3(getrandom, char __user *, buf, size_t, count, unsigned int, flags) | |
7bb1cdbf | 168 | COMPAT_SYSCALL_WRAP2(memfd_create, const char __user *, uname, unsigned int, flags) |
fcb1c2d7 | 169 | COMPAT_SYSCALL_WRAP3(bpf, int, cmd, union bpf_attr *, attr, unsigned int, size); |
4eafad7f AI |
170 | COMPAT_SYSCALL_WRAP3(s390_pci_mmio_write, const unsigned long, mmio_addr, const void __user *, user_buffer, const size_t, length); |
171 | COMPAT_SYSCALL_WRAP3(s390_pci_mmio_read, const unsigned long, mmio_addr, void __user *, user_buffer, const size_t, length); | |
977108f8 HC |
172 | COMPAT_SYSCALL_WRAP4(socketpair, int, family, int, type, int, protocol, int __user *, usockvec); |
173 | COMPAT_SYSCALL_WRAP3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen); | |
174 | COMPAT_SYSCALL_WRAP3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen); | |
175 | COMPAT_SYSCALL_WRAP4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr, int __user *, upeer_addrlen, int, flags); | |
176 | COMPAT_SYSCALL_WRAP3(getsockname, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); | |
177 | COMPAT_SYSCALL_WRAP3(getpeername, int, fd, struct sockaddr __user *, usockaddr, int __user *, usockaddr_len); | |
178 | COMPAT_SYSCALL_WRAP6(sendto, int, fd, void __user *, buff, size_t, len, unsigned int, flags, struct sockaddr __user *, addr, int, addr_len); | |
932f6081 | 179 | COMPAT_SYSCALL_WRAP3(mlock2, unsigned long, start, size_t, len, int, flags); |