compat_wrapper.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*
  2. * Compat system call wrappers.
  3. *
  4. * Copyright IBM Corp. 2014
  5. */
  6. #include <linux/syscalls.h>
  7. #include <linux/compat.h>
  8. #include "entry.h"
  9. #define COMPAT_SYSCALL_WRAP1(name, ...) \
  10. COMPAT_SYSCALL_WRAPx(1, _##name, __VA_ARGS__)
  11. #define COMPAT_SYSCALL_WRAP2(name, ...) \
  12. COMPAT_SYSCALL_WRAPx(2, _##name, __VA_ARGS__)
  13. #define COMPAT_SYSCALL_WRAP3(name, ...) \
  14. COMPAT_SYSCALL_WRAPx(3, _##name, __VA_ARGS__)
  15. #define COMPAT_SYSCALL_WRAP4(name, ...) \
  16. COMPAT_SYSCALL_WRAPx(4, _##name, __VA_ARGS__)
  17. #define COMPAT_SYSCALL_WRAP5(name, ...) \
  18. COMPAT_SYSCALL_WRAPx(5, _##name, __VA_ARGS__)
  19. #define COMPAT_SYSCALL_WRAP6(name, ...) \
  20. COMPAT_SYSCALL_WRAPx(6, _##name, __VA_ARGS__)
  21. #define __SC_COMPAT_TYPE(t, a) \
  22. __typeof(__builtin_choose_expr(sizeof(t) > 4, 0L, (t)0)) a
  23. #define __SC_COMPAT_CAST(t, a) \
  24. ({ \
  25. long __ReS = a; \
  26. \
  27. BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \
  28. !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t)); \
  29. if (__TYPE_IS_L(t)) \
  30. __ReS = (s32)a; \
  31. if (__TYPE_IS_UL(t)) \
  32. __ReS = (u32)a; \
  33. if (__TYPE_IS_PTR(t)) \
  34. __ReS = a & 0x7fffffff; \
  35. (t)__ReS; \
  36. })
  37. /*
  38. * The COMPAT_SYSCALL_WRAP macro generates system call wrappers to be used by
  39. * compat tasks. These wrappers will only be used for system calls where only
  40. * the system call arguments need sign or zero extension or zeroing of the upper
  41. * 33 bits of pointers.
  42. * Note: since the wrapper function will afterwards call a system call which
  43. * again performs zero and sign extension for all system call arguments with
  44. * a size of less than eight bytes, these compat wrappers only touch those
  45. * system call arguments with a size of eight bytes ((unsigned) long and
  46. * pointers). Zero and sign extension for e.g. int parameters will be done by
  47. * the regular system call wrappers.
  48. */
  49. #define COMPAT_SYSCALL_WRAPx(x, name, ...) \
  50. asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
  51. asmlinkage long compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__));\
  52. asmlinkage long compat_sys##name(__MAP(x,__SC_COMPAT_TYPE,__VA_ARGS__)) \
  53. { \
  54. return sys##name(__MAP(x,__SC_COMPAT_CAST,__VA_ARGS__)); \
  55. }
  56. COMPAT_SYSCALL_WRAP1(exit, int, error_code);
  57. COMPAT_SYSCALL_WRAP1(close, unsigned int, fd);
  58. COMPAT_SYSCALL_WRAP2(creat, const char __user *, pathname, umode_t, mode);
  59. COMPAT_SYSCALL_WRAP2(link, const char __user *, oldname, const char __user *, newname);
  60. COMPAT_SYSCALL_WRAP1(unlink, const char __user *, pathname);
  61. COMPAT_SYSCALL_WRAP1(chdir, const char __user *, filename);
  62. COMPAT_SYSCALL_WRAP3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev);
  63. COMPAT_SYSCALL_WRAP2(chmod, const char __user *, filename, umode_t, mode);
  64. COMPAT_SYSCALL_WRAP1(oldumount, char __user *, name);
  65. COMPAT_SYSCALL_WRAP1(alarm, unsigned int, seconds);
  66. COMPAT_SYSCALL_WRAP2(access, const char __user *, filename, int, mode);
  67. COMPAT_SYSCALL_WRAP1(nice, int, increment);
  68. COMPAT_SYSCALL_WRAP2(kill, int, pid, int, sig);
  69. COMPAT_SYSCALL_WRAP2(rename, const char __user *, oldname, const char __user *, newname);
  70. COMPAT_SYSCALL_WRAP2(mkdir, const char __user *, pathname, umode_t, mode);
  71. COMPAT_SYSCALL_WRAP1(rmdir, const char __user *, pathname);
  72. COMPAT_SYSCALL_WRAP1(dup, unsigned int, fildes);
  73. COMPAT_SYSCALL_WRAP1(pipe, int __user *, fildes);
  74. COMPAT_SYSCALL_WRAP1(brk, unsigned long, brk);
  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);
  78. COMPAT_SYSCALL_WRAP2(setpgid, pid_t, pid, pid_t, pgid);
  79. COMPAT_SYSCALL_WRAP1(umask, int, mask);
  80. COMPAT_SYSCALL_WRAP1(chroot, const char __user *, filename);
  81. COMPAT_SYSCALL_WRAP2(dup2, unsigned int, oldfd, unsigned int, newfd);
  82. COMPAT_SYSCALL_WRAP3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask);
  83. COMPAT_SYSCALL_WRAP2(sethostname, char __user *, name, int, len);
  84. COMPAT_SYSCALL_WRAP2(symlink, const char __user *, old, const char __user *, new);
  85. COMPAT_SYSCALL_WRAP3(readlink, const char __user *, path, char __user *, buf, int, bufsiz);
  86. COMPAT_SYSCALL_WRAP1(uselib, const char __user *, library);
  87. COMPAT_SYSCALL_WRAP2(swapon, const char __user *, specialfile, int, swap_flags);
  88. COMPAT_SYSCALL_WRAP4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg);
  89. COMPAT_SYSCALL_WRAP2(munmap, unsigned long, addr, size_t, len);
  90. COMPAT_SYSCALL_WRAP2(fchmod, unsigned int, fd, umode_t, mode);
  91. COMPAT_SYSCALL_WRAP2(getpriority, int, which, int, who);
  92. COMPAT_SYSCALL_WRAP3(setpriority, int, which, int, who, int, niceval);
  93. COMPAT_SYSCALL_WRAP3(syslog, int, type, char __user *, buf, int, len);
  94. COMPAT_SYSCALL_WRAP1(swapoff, const char __user *, specialfile);
  95. COMPAT_SYSCALL_WRAP1(fsync, unsigned int, fd);
  96. COMPAT_SYSCALL_WRAP2(setdomainname, char __user *, name, int, len);
  97. COMPAT_SYSCALL_WRAP1(newuname, struct new_utsname __user *, name);
  98. COMPAT_SYSCALL_WRAP3(mprotect, unsigned long, start, size_t, len, unsigned long, prot);
  99. COMPAT_SYSCALL_WRAP3(init_module, void __user *, umod, unsigned long, len, const char __user *, uargs);
  100. COMPAT_SYSCALL_WRAP2(delete_module, const char __user *, name_user, unsigned int, flags);
  101. COMPAT_SYSCALL_WRAP4(quotactl, unsigned int, cmd, const char __user *, special, qid_t, id, void __user *, addr);
  102. COMPAT_SYSCALL_WRAP1(getpgid, pid_t, pid);
  103. COMPAT_SYSCALL_WRAP1(fchdir, unsigned int, fd);
  104. COMPAT_SYSCALL_WRAP2(bdflush, int, func, long, data);
  105. COMPAT_SYSCALL_WRAP3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2);
  106. COMPAT_SYSCALL_WRAP1(s390_personality, unsigned int, personality);
  107. COMPAT_SYSCALL_WRAP5(llseek, unsigned int, fd, unsigned long, high, unsigned long, low, loff_t __user *, result, unsigned int, whence);
  108. COMPAT_SYSCALL_WRAP2(flock, unsigned int, fd, unsigned int, cmd);
  109. COMPAT_SYSCALL_WRAP3(msync, unsigned long, start, size_t, len, int, flags);
  110. COMPAT_SYSCALL_WRAP1(getsid, pid_t, pid);
  111. COMPAT_SYSCALL_WRAP1(fdatasync, unsigned int, fd);
  112. COMPAT_SYSCALL_WRAP2(mlock, unsigned long, start, size_t, len);
  113. COMPAT_SYSCALL_WRAP2(munlock, unsigned long, start, size_t, len);
  114. COMPAT_SYSCALL_WRAP1(mlockall, int, flags);
  115. COMPAT_SYSCALL_WRAP2(sched_setparam, pid_t, pid, struct sched_param __user *, param);
  116. COMPAT_SYSCALL_WRAP2(sched_getparam, pid_t, pid, struct sched_param __user *, param);
  117. COMPAT_SYSCALL_WRAP3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param);
  118. COMPAT_SYSCALL_WRAP1(sched_getscheduler, pid_t, pid);
  119. COMPAT_SYSCALL_WRAP1(sched_get_priority_max, int, policy);
  120. COMPAT_SYSCALL_WRAP1(sched_get_priority_min, int, policy);
  121. COMPAT_SYSCALL_WRAP5(mremap, unsigned long, addr, unsigned long, old_len, unsigned long, new_len, unsigned long, flags, unsigned long, new_addr);
  122. COMPAT_SYSCALL_WRAP3(poll, struct pollfd __user *, ufds, unsigned int, nfds, int, timeout);
  123. COMPAT_SYSCALL_WRAP5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, unsigned long, arg4, unsigned long, arg5);
  124. COMPAT_SYSCALL_WRAP2(getcwd, char __user *, buf, unsigned long, size);
  125. COMPAT_SYSCALL_WRAP2(capget, cap_user_header_t, header, cap_user_data_t, dataptr);
  126. COMPAT_SYSCALL_WRAP2(capset, cap_user_header_t, header, const cap_user_data_t, data);
  127. COMPAT_SYSCALL_WRAP3(lchown, const char __user *, filename, uid_t, user, gid_t, group);
  128. COMPAT_SYSCALL_WRAP2(setreuid, uid_t, ruid, uid_t, euid);
  129. COMPAT_SYSCALL_WRAP2(setregid, gid_t, rgid, gid_t, egid);
  130. COMPAT_SYSCALL_WRAP2(getgroups, int, gidsetsize, gid_t __user *, grouplist);
  131. COMPAT_SYSCALL_WRAP2(setgroups, int, gidsetsize, gid_t __user *, grouplist);
  132. COMPAT_SYSCALL_WRAP3(fchown, unsigned int, fd, uid_t, user, gid_t, group);
  133. COMPAT_SYSCALL_WRAP3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid);
  134. COMPAT_SYSCALL_WRAP3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid);
  135. COMPAT_SYSCALL_WRAP3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid);
  136. COMPAT_SYSCALL_WRAP3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid);
  137. COMPAT_SYSCALL_WRAP3(chown, const char __user *, filename, uid_t, user, gid_t, group);
  138. COMPAT_SYSCALL_WRAP1(setuid, uid_t, uid);
  139. COMPAT_SYSCALL_WRAP1(setgid, gid_t, gid);
  140. COMPAT_SYSCALL_WRAP1(setfsuid, uid_t, uid);
  141. COMPAT_SYSCALL_WRAP1(setfsgid, gid_t, gid);
  142. COMPAT_SYSCALL_WRAP2(pivot_root, const char __user *, new_root, const char __user *, put_old);
  143. COMPAT_SYSCALL_WRAP3(mincore, unsigned long, start, size_t, len, unsigned char __user *, vec);
  144. COMPAT_SYSCALL_WRAP3(madvise, unsigned long, start, size_t, len, int, behavior);
  145. COMPAT_SYSCALL_WRAP5(setxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags);
  146. COMPAT_SYSCALL_WRAP5(lsetxattr, const char __user *, path, const char __user *, name, const void __user *, value, size_t, size, int, flags);
  147. COMPAT_SYSCALL_WRAP5(fsetxattr, int, fd, const char __user *, name, const void __user *, value, size_t, size, int, flags);
  148. COMPAT_SYSCALL_WRAP3(getdents64, unsigned int, fd, struct linux_dirent64 __user *, dirent, unsigned int, count);
  149. COMPAT_SYSCALL_WRAP4(getxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size);
  150. COMPAT_SYSCALL_WRAP4(lgetxattr, const char __user *, path, const char __user *, name, void __user *, value, size_t, size);
  151. COMPAT_SYSCALL_WRAP4(fgetxattr, int, fd, const char __user *, name, void __user *, value, size_t, size);
  152. COMPAT_SYSCALL_WRAP3(listxattr, const char __user *, path, char __user *, list, size_t, size);
  153. COMPAT_SYSCALL_WRAP3(llistxattr, const char __user *, path, char __user *, list, size_t, size);
  154. COMPAT_SYSCALL_WRAP3(flistxattr, int, fd, char __user *, list, size_t, size);
  155. COMPAT_SYSCALL_WRAP2(removexattr, const char __user *, path, const char __user *, name);
  156. COMPAT_SYSCALL_WRAP2(lremovexattr, const char __user *, path, const char __user *, name);
  157. COMPAT_SYSCALL_WRAP2(fremovexattr, int, fd, const char __user *, name);
  158. COMPAT_SYSCALL_WRAP1(exit_group, int, error_code);
  159. COMPAT_SYSCALL_WRAP1(set_tid_address, int __user *, tidptr);
  160. COMPAT_SYSCALL_WRAP1(epoll_create, int, size);
  161. COMPAT_SYSCALL_WRAP4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event);
  162. COMPAT_SYSCALL_WRAP4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout);
  163. COMPAT_SYSCALL_WRAP1(timer_getoverrun, timer_t, timer_id);
  164. COMPAT_SYSCALL_WRAP1(timer_delete, compat_timer_t, compat_timer_id);
  165. COMPAT_SYSCALL_WRAP1(io_destroy, aio_context_t, ctx);
  166. COMPAT_SYSCALL_WRAP3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, struct io_event __user *, result);
  167. COMPAT_SYSCALL_WRAP1(mq_unlink, const char __user *, name);
  168. COMPAT_SYSCALL_WRAP5(add_key, const char __user *, tp, const char __user *, dsc, const void __user *, pld, size_t, len, key_serial_t, id);
  169. COMPAT_SYSCALL_WRAP4(request_key, const char __user *, tp, const char __user *, dsc, const char __user *, info, key_serial_t, id);
  170. COMPAT_SYSCALL_WRAP5(remap_file_pages, unsigned long, start, unsigned long, size, unsigned long, prot, unsigned long, pgoff, unsigned long, flags);
  171. COMPAT_SYSCALL_WRAP3(ioprio_set, int, which, int, who, int, ioprio);
  172. COMPAT_SYSCALL_WRAP2(ioprio_get, int, which, int, who);
  173. COMPAT_SYSCALL_WRAP3(inotify_add_watch, int, fd, const char __user *, path, u32, mask);
  174. COMPAT_SYSCALL_WRAP2(inotify_rm_watch, int, fd, __s32, wd);
  175. COMPAT_SYSCALL_WRAP3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode);
  176. COMPAT_SYSCALL_WRAP4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, unsigned, dev);
  177. COMPAT_SYSCALL_WRAP5(fchownat, int, dfd, const char __user *, filename, uid_t, user, gid_t, group, int, flag);
  178. COMPAT_SYSCALL_WRAP3(unlinkat, int, dfd, const char __user *, pathname, int, flag);
  179. COMPAT_SYSCALL_WRAP4(renameat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname);
  180. COMPAT_SYSCALL_WRAP5(linkat, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, int, flags);
  181. COMPAT_SYSCALL_WRAP3(symlinkat, const char __user *, oldname, int, newdfd, const char __user *, newname);
  182. COMPAT_SYSCALL_WRAP4(readlinkat, int, dfd, const char __user *, path, char __user *, buf, int, bufsiz);
  183. COMPAT_SYSCALL_WRAP3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode);
  184. COMPAT_SYSCALL_WRAP3(faccessat, int, dfd, const char __user *, filename, int, mode);
  185. COMPAT_SYSCALL_WRAP1(unshare, unsigned long, unshare_flags);
  186. 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);
  187. COMPAT_SYSCALL_WRAP4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags);
  188. COMPAT_SYSCALL_WRAP3(getcpu, unsigned __user *, cpu, unsigned __user *, node, struct getcpu_cache __user *, cache);
  189. COMPAT_SYSCALL_WRAP1(eventfd, unsigned int, count);
  190. COMPAT_SYSCALL_WRAP2(timerfd_create, int, clockid, int, flags);
  191. COMPAT_SYSCALL_WRAP2(eventfd2, unsigned int, count, int, flags);
  192. COMPAT_SYSCALL_WRAP1(inotify_init1, int, flags);
  193. COMPAT_SYSCALL_WRAP2(pipe2, int __user *, fildes, int, flags);
  194. COMPAT_SYSCALL_WRAP3(dup3, unsigned int, oldfd, unsigned int, newfd, int, flags);
  195. COMPAT_SYSCALL_WRAP1(epoll_create1, int, flags);
  196. COMPAT_SYSCALL_WRAP2(tkill, int, pid, int, sig);
  197. COMPAT_SYSCALL_WRAP3(tgkill, int, tgid, int, pid, int, sig);
  198. COMPAT_SYSCALL_WRAP5(perf_event_open, struct perf_event_attr __user *, attr_uptr, pid_t, pid, int, cpu, int, group_fd, unsigned long, flags);
  199. COMPAT_SYSCALL_WRAP5(clone, unsigned long, newsp, unsigned long, clone_flags, int __user *, parent_tidptr, int __user *, child_tidptr, int, tls_val);
  200. COMPAT_SYSCALL_WRAP2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags);
  201. COMPAT_SYSCALL_WRAP4(prlimit64, pid_t, pid, unsigned int, resource, const struct rlimit64 __user *, new_rlim, struct rlimit64 __user *, old_rlim);
  202. COMPAT_SYSCALL_WRAP5(name_to_handle_at, int, dfd, const char __user *, name, struct file_handle __user *, handle, int __user *, mnt_id, int, flag);
  203. COMPAT_SYSCALL_WRAP1(syncfs, int, fd);
  204. COMPAT_SYSCALL_WRAP2(setns, int, fd, int, nstype);
  205. COMPAT_SYSCALL_WRAP2(s390_runtime_instr, int, command, int, signum);
  206. COMPAT_SYSCALL_WRAP5(kcmp, pid_t, pid1, pid_t, pid2, int, type, unsigned long, idx1, unsigned long, idx2);
  207. COMPAT_SYSCALL_WRAP3(finit_module, int, fd, const char __user *, uargs, int, flags);
  208. COMPAT_SYSCALL_WRAP3(sched_setattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, flags);
  209. COMPAT_SYSCALL_WRAP4(sched_getattr, pid_t, pid, struct sched_attr __user *, attr, unsigned int, size, unsigned int, flags);
  210. COMPAT_SYSCALL_WRAP5(renameat2, int, olddfd, const char __user *, oldname, int, newdfd, const char __user *, newname, unsigned int, flags);