shim_syscalls.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046
  1. /* Copyright (C) 2014 Stony Brook University
  2. This file is part of Graphene Library OS.
  3. Graphene Library OS is free software: you can redistribute it and/or
  4. modify it under the terms of the GNU Lesser General Public License
  5. as published by the Free Software Foundation, either version 3 of the
  6. License, or (at your option) any later version.
  7. Graphene Library OS is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  13. /*
  14. * shim_syscalls.c
  15. *
  16. * This file contains macros to redirect all system calls to the system call
  17. * table in library OS.
  18. */
  19. #include <asm/prctl.h>
  20. #include <asm/unistd.h>
  21. #include <errno.h>
  22. #include <pal.h>
  23. #include <pal_error.h>
  24. #include <shim_internal.h>
  25. #include <shim_profile.h>
  26. #include <shim_table.h>
  27. #include <shim_thread.h>
  28. #include <shim_tls.h>
  29. #include <shim_unistd.h>
  30. #include <shim_utils.h>
  31. long int if_call_defined(long int sys_no) {
  32. return shim_table[sys_no] != 0;
  33. }
  34. DEFINE_PROFILE_CATEGORY(syscall, );
  35. //////////////////////////////////////////////////
  36. // Mappings from system calls to shim calls
  37. ///////////////////////////////////////////////////
  38. /*
  39. Missing, but need to be added:
  40. * clone
  41. * semctl
  42. from 'man unimplemented':
  43. NOT IMPLEMENTED in kernel (always return -ENOSYS)
  44. NAME
  45. afs_syscall, break, ftime, getpmsg, gtty, lock, madvise1, mpx, prof,
  46. profil, putpmsg, security, stty, tuxcall, ulimit, vserver -
  47. unimplemented system calls
  48. SYNOPSIS
  49. Unimplemented system calls.
  50. DESCRIPTION
  51. These system calls are not implemented in the Linux 2.6.22 kernel.
  52. RETURN VALUE
  53. These system calls always return -1 and set errno to ENOSYS.
  54. NOTES
  55. Note that ftime(3), profil(3) and ulimit(3) are implemented as library
  56. functions.
  57. Some system calls, like alloc_hugepages(2), free_hugepages(2), ioperm(2),
  58. iopl(2), and vm86(2) only exist on certain architectures.
  59. Some system calls, like ipc(2), create_module(2), init_module(2), and
  60. delete_module(2) only exist when the Linux kernel was built with support
  61. for them.
  62. SEE ALSO
  63. syscalls(2)
  64. COLOPHON
  65. This page is part of release 3.24 of the Linux man-pages project. A
  66. description of the project, and information about reporting bugs, can
  67. be found at http://www.kernel.org/doc/man-pages/.
  68. Linux 2007-07-05 UNIMPLEMENTED(2)
  69. Also missing from shim:
  70. * epoll_ctl_old
  71. * epoll_wait_old
  72. According to kernel man pages, glibc does not provide wrappers for
  73. every system call (append to this list as you come accross more):
  74. * io_setup
  75. * ioprio_get
  76. * ioprio_set
  77. * sysctl
  78. * getdents
  79. * tkill
  80. * tgkill
  81. Also not in libc (append to this list as you come accross more):
  82. * add_key: (removed in Changelog.17)
  83. * request_key: (removed in Changelog.17)
  84. * keyctl: (removed in Changelog.17)
  85. Although these are Linux system calls, they are not present in
  86. libc but can be found rather in libkeyutils. When linking,
  87. -lkeyutils should be specified to the linker.x
  88. There are probably other things of note, so put them here as you
  89. come across them.
  90. */
  91. /* Please move implemented system call to sys/ directory and name them as the
  92. * most important system call */
  93. /* read: sys/shim_open.c */
  94. DEFINE_SHIM_SYSCALL(read, 3, shim_do_read, size_t, int, fd, void*, buf, size_t, count)
  95. /* write: sys/shim_open.c */
  96. DEFINE_SHIM_SYSCALL(write, 3, shim_do_write, size_t, int, fd, const void*, buf, size_t, count)
  97. /* open: sys/shim_open.c */
  98. DEFINE_SHIM_SYSCALL(open, 3, shim_do_open, int, const char*, file, int, flags, mode_t, mode)
  99. /* close: sys/shim_open.c */
  100. DEFINE_SHIM_SYSCALL(close, 1, shim_do_close, int, int, fd)
  101. /* stat: sys/shim_stat.c */
  102. DEFINE_SHIM_SYSCALL(stat, 2, shim_do_stat, int, const char*, file, struct stat*, statbuf)
  103. /* fstat: sys/shim_stat.c */
  104. DEFINE_SHIM_SYSCALL(fstat, 2, shim_do_fstat, int, int, fd, struct stat*, statbuf)
  105. /* lstat: sys/shim_lstat.c */
  106. /* for now we don't support symbolic link, so lstat will work exactly the same
  107. as stat. */
  108. DEFINE_SHIM_SYSCALL(lstat, 2, shim_do_lstat, int, const char*, file, struct stat*, statbuf)
  109. /* poll: sys/shim_poll.c */
  110. DEFINE_SHIM_SYSCALL(poll, 3, shim_do_poll, int, struct pollfd*, fds, nfds_t, nfds, int, timeout)
  111. /* lseek: sys/shim_open.c */
  112. DEFINE_SHIM_SYSCALL(lseek, 3, shim_do_lseek, off_t, int, fd, off_t, offset, int, origin)
  113. /* mmap: sys/shim_mmap.c */
  114. DEFINE_SHIM_SYSCALL(mmap, 6, shim_do_mmap, void*, void*, addr, size_t, length, int, prot, int,
  115. flags, int, fd, off_t, offset)
  116. /* mprotect: sys/shim_mmap.c */
  117. DEFINE_SHIM_SYSCALL(mprotect, 3, shim_do_mprotect, int, void*, addr, size_t, len, int, prot)
  118. /* munmap: sys/shim_mmap.c */
  119. DEFINE_SHIM_SYSCALL(munmap, 2, shim_do_munmap, int, void*, addr, size_t, len)
  120. DEFINE_SHIM_SYSCALL(brk, 1, shim_do_brk, void*, void*, brk)
  121. /* rt_sigaction: sys/shim_sigaction.c */
  122. DEFINE_SHIM_SYSCALL(rt_sigaction, 4, shim_do_sigaction, int, int, signum,
  123. const struct __kernel_sigaction*, act, struct __kernel_sigaction*, oldact,
  124. size_t, sigsetsize)
  125. /* rt_sigprocmask: sys/shim_sigaction.c */
  126. DEFINE_SHIM_SYSCALL(rt_sigprocmask, 3, shim_do_sigprocmask, int, int, how, const __sigset_t*, set,
  127. __sigset_t*, oldset)
  128. /* rt_sigreturn: sys/shim_sigaction.c */
  129. DEFINE_SHIM_SYSCALL(rt_sigreturn, 1, shim_do_sigreturn, int, int, __unused)
  130. /* ioctl: sys/shim_ioctl.c */
  131. DEFINE_SHIM_SYSCALL(ioctl, 3, shim_do_ioctl, int, int, fd, int, cmd, unsigned long, arg)
  132. /* pread64 : sys/shim_open.c */
  133. DEFINE_SHIM_SYSCALL(pread64, 4, shim_do_pread64, size_t, int, fd, char*, buf, size_t, count, loff_t,
  134. pos)
  135. /* pwrite64 : sys/shim_open.c */
  136. DEFINE_SHIM_SYSCALL(pwrite64, 4, shim_do_pwrite64, size_t, int, fd, char*, buf, size_t, count,
  137. loff_t, pos)
  138. /* readv : sys/shim_wrappers.c */
  139. DEFINE_SHIM_SYSCALL(readv, 3, shim_do_readv, ssize_t, int, fd, const struct iovec*, vec, int, vlen)
  140. /* writev : sys/shim_wrappers.c */
  141. DEFINE_SHIM_SYSCALL(writev, 3, shim_do_writev, ssize_t, int, fd, const struct iovec*, vec, int,
  142. vlen)
  143. /* access: sys/shim_access.c */
  144. DEFINE_SHIM_SYSCALL(access, 2, shim_do_access, int, const char*, file, mode_t, mode)
  145. /* pipe: sys/shim_pipe.c */
  146. DEFINE_SHIM_SYSCALL(pipe, 1, shim_do_pipe, int, int*, fildes)
  147. /* select : sys/shim_poll.c*/
  148. DEFINE_SHIM_SYSCALL(select, 5, shim_do_select, int, int, nfds, fd_set*, readfds, fd_set*, writefds,
  149. fd_set*, errorfds, struct __kernel_timeval*, timeout)
  150. /* sched_yield: sys/shim_sched.c */
  151. DEFINE_SHIM_SYSCALL(sched_yield, 0, shim_do_sched_yield, int)
  152. SHIM_SYSCALL_PASSTHROUGH(mremap, 5, void*, void*, addr, size_t, old_len, size_t, new_len, int,
  153. flags, void*, new_addr)
  154. SHIM_SYSCALL_PASSTHROUGH(msync, 3, int, void*, start, size_t, len, int, flags)
  155. /* mincore: sys/shim_mmap.c */
  156. DEFINE_SHIM_SYSCALL(mincore, 3, shim_do_mincore, int, void*, start, size_t, len, unsigned char*,
  157. vec)
  158. SHIM_SYSCALL_PASSTHROUGH(madvise, 3, int, void*, start, size_t, len, int, behavior)
  159. SHIM_SYSCALL_PASSTHROUGH(shmget, 3, int, key_t, key, size_t, size, int, shmflg)
  160. SHIM_SYSCALL_PASSTHROUGH(shmat, 3, void*, int, shmid, const void*, shmaddr, int, shmflg)
  161. SHIM_SYSCALL_PASSTHROUGH(shmctl, 3, int, int, shmid, int, cmd, struct shmid_ds*, buf)
  162. /* dup: sys/shim_dup.c */
  163. DEFINE_SHIM_SYSCALL(dup, 1, shim_do_dup, int, int, fd)
  164. /* dup2: sys/shim_dup.c */
  165. DEFINE_SHIM_SYSCALL(dup2, 2, shim_do_dup2, int, int, oldfd, int, newfd)
  166. /* pause: sys/shim_sleep.c */
  167. DEFINE_SHIM_SYSCALL(pause, 0, shim_do_pause, int)
  168. /* nanosleep: sys/shim_sleep.c */
  169. DEFINE_SHIM_SYSCALL(nanosleep, 2, shim_do_nanosleep, int, const struct __kernel_timespec*, rqtp,
  170. struct __kernel_timespec*, rmtp)
  171. /* getitimer: sys/shim_alarm.c */
  172. DEFINE_SHIM_SYSCALL(getitimer, 2, shim_do_getitimer, int, int, which, struct __kernel_itimerval*,
  173. value)
  174. /* alarm: sys/shim_alarm.c */
  175. DEFINE_SHIM_SYSCALL(alarm, 1, shim_do_alarm, int, unsigned int, seconds)
  176. /* setitimer: sys/shim_alarm.c */
  177. DEFINE_SHIM_SYSCALL(setitimer, 3, shim_do_setitimer, int, int, which, struct __kernel_itimerval*,
  178. value, struct __kernel_itimerval*, ovalue)
  179. /* getpid: sys/shim_getpid.c */
  180. DEFINE_SHIM_SYSCALL(getpid, 0, shim_do_getpid, pid_t)
  181. /* sendfile: sys/shim_fs.c */
  182. DEFINE_SHIM_SYSCALL(sendfile, 4, shim_do_sendfile, ssize_t, int, out_fd, int, in_fd, off_t*, offset,
  183. size_t, count)
  184. /* socket: sys/shim_socket.c */
  185. DEFINE_SHIM_SYSCALL(socket, 3, shim_do_socket, int, int, family, int, type, int, protocol)
  186. /* connect: sys/shim_socket.c */
  187. DEFINE_SHIM_SYSCALL(connect, 3, shim_do_connect, int, int, sockfd, struct sockaddr*, addr, int,
  188. addrlen)
  189. /* accept: sys/shim_socket.c */
  190. DEFINE_SHIM_SYSCALL(accept, 3, shim_do_accept, int, int, fd, struct sockaddr*, addr, socklen_t*,
  191. addrlen)
  192. /* sendto: sys/shim_socket.c */
  193. DEFINE_SHIM_SYSCALL(sendto, 6, shim_do_sendto, ssize_t, int, fd, const void*, buf, size_t, len, int,
  194. flags, const struct sockaddr*, dest_addr, socklen_t, addrlen)
  195. /* recvfrom : sys/shim_socket.c */
  196. DEFINE_SHIM_SYSCALL(recvfrom, 6, shim_do_recvfrom, ssize_t, int, fd, void*, buf, size_t, len, int,
  197. flags, struct sockaddr*, addr, socklen_t*, addrlen)
  198. /* bind: sys/shim_socket.c */
  199. DEFINE_SHIM_SYSCALL(bind, 3, shim_do_bind, int, int, sockfd, struct sockaddr*, addr, socklen_t,
  200. addrlen)
  201. /* listen: sys/shim_socket.c */
  202. DEFINE_SHIM_SYSCALL(listen, 2, shim_do_listen, int, int, sockfd, int, backlog)
  203. /* sendmsg: sys/shim_socket.c */
  204. DEFINE_SHIM_SYSCALL(sendmsg, 3, shim_do_sendmsg, ssize_t, int, fd, struct msghdr*, msg, int, flags)
  205. /* recvmsg: sys/shim_socket.c */
  206. DEFINE_SHIM_SYSCALL(recvmsg, 3, shim_do_recvmsg, ssize_t, int, fd, struct msghdr*, msg, int, flags)
  207. /* shutdown: sys/shim_socket.c */
  208. DEFINE_SHIM_SYSCALL(shutdown, 2, shim_do_shutdown, int, int, sockfd, int, how)
  209. /* getsockname: sys/shim_socket.c */
  210. DEFINE_SHIM_SYSCALL(getsockname, 3, shim_do_getsockname, int, int, sockfd, struct sockaddr*, addr,
  211. int*, addrlen)
  212. /* getpeername: sys/shim_socket.c */
  213. DEFINE_SHIM_SYSCALL(getpeername, 3, shim_do_getpeername, int, int, sockfd, struct sockaddr*, addr,
  214. int*, addrlen)
  215. /* socketpair: sys/shim_pipe.c */
  216. DEFINE_SHIM_SYSCALL(socketpair, 4, shim_do_socketpair, int, int, domain, int, type, int, protocol,
  217. int*, sv)
  218. /* setsockopt: sys/shim_socket.c */
  219. DEFINE_SHIM_SYSCALL(setsockopt, 5, shim_do_setsockopt, int, int, fd, int, level, int, optname,
  220. char*, optval, int, optlen)
  221. /* getsockopt: sys/shim_socket.c */
  222. DEFINE_SHIM_SYSCALL(getsockopt, 5, shim_do_getsockopt, int, int, fd, int, level, int, optname,
  223. char*, optval, int*, optlen)
  224. /* clone: sys/shim_clone.c */
  225. DEFINE_SHIM_SYSCALL(clone, 5, shim_do_clone, int, int, flags, void*, user_stack_addr, int*,
  226. parent_tidptr, int*, child_tidptr, void*, tls)
  227. /* fork: sys/shim_fork.c */
  228. DEFINE_SHIM_SYSCALL(fork, 0, shim_do_fork, int)
  229. /* vfork: sys/shim_vfork.c */
  230. DEFINE_SHIM_SYSCALL(vfork, 0, shim_do_vfork, int)
  231. /* execve: sys/shim_exec.c */
  232. DEFINE_SHIM_SYSCALL(execve, 3, shim_do_execve, int, const char*, file, const char**, argv,
  233. const char**, envp)
  234. /* exit: sys/shim_exit.c */
  235. DEFINE_SHIM_SYSCALL(exit, 1, shim_do_exit, int, int, error_code)
  236. /* wait4: sys/shim_wait.c */
  237. DEFINE_SHIM_SYSCALL(wait4, 4, shim_do_wait4, pid_t, pid_t, pid, int*, stat_addr, int, option,
  238. struct __kernel_rusage*, ru)
  239. /* kill: sys/shim_sigaction.c */
  240. DEFINE_SHIM_SYSCALL(kill, 2, shim_do_kill, int, pid_t, pid, int, sig)
  241. /* uname: sys/shim_uname.c */
  242. DEFINE_SHIM_SYSCALL(uname, 1, shim_do_uname, int, struct old_utsname*, buf)
  243. /* semget: sys/shim_semget.c */
  244. DEFINE_SHIM_SYSCALL(semget, 3, shim_do_semget, int, key_t, key, int, nsems, int, semflg)
  245. /* semop: sys/shim_semget.c */
  246. DEFINE_SHIM_SYSCALL(semop, 3, shim_do_semop, int, int, semid, struct sembuf*, sops, unsigned int,
  247. nsops)
  248. /* semctl: sys/shim_semctl.c */
  249. DEFINE_SHIM_SYSCALL(semctl, 4, shim_do_semctl, int, int, semid, int, semnum, int, cmd,
  250. unsigned long, arg)
  251. SHIM_SYSCALL_PASSTHROUGH(shmdt, 1, int, const void*, shmaddr)
  252. /* msgget: sys/shim_msgget.c */
  253. DEFINE_SHIM_SYSCALL(msgget, 2, shim_do_msgget, int, key_t, key, int, msgflg)
  254. /* msgsnd: sys/shim_msgget.c */
  255. DEFINE_SHIM_SYSCALL(msgsnd, 4, shim_do_msgsnd, int, int, msqid, const void*, msgp, size_t, msgsz,
  256. int, msgflg)
  257. /* msgrcv: sys/shim_msgget.c */
  258. DEFINE_SHIM_SYSCALL(msgrcv, 5, shim_do_msgrcv, int, int, msqid, void*, msgp, size_t, msgsz, long,
  259. msgtyp, int, msgflg)
  260. /* msgctl: sys/shim_msgget.c */
  261. DEFINE_SHIM_SYSCALL(msgctl, 3, shim_do_msgctl, int, int, msqid, int, cmd, struct msqid_ds*, buf)
  262. /* fcntl: sys/shim_fcntl.c */
  263. DEFINE_SHIM_SYSCALL(fcntl, 3, shim_do_fcntl, int, int, fd, int, cmd, unsigned long, arg)
  264. SHIM_SYSCALL_PASSTHROUGH(flock, 2, int, int, fd, int, cmd)
  265. /* fsync: sys/shim_open.c */
  266. DEFINE_SHIM_SYSCALL(fsync, 1, shim_do_fsync, int, int, fd)
  267. /* fdatasync: sys/shim_open.c */
  268. DEFINE_SHIM_SYSCALL(fdatasync, 1, shim_do_fdatasync, int, int, fd)
  269. /* truncate: sys/shim_open.c */
  270. DEFINE_SHIM_SYSCALL(truncate, 2, shim_do_truncate, int, const char*, path, loff_t, length)
  271. /* ftruncate: sys/shim_open.c */
  272. DEFINE_SHIM_SYSCALL(ftruncate, 2, shim_do_ftruncate, int, int, fd, loff_t, length)
  273. /* getdents: sys/shim_open.c */
  274. DEFINE_SHIM_SYSCALL(getdents, 3, shim_do_getdents, size_t, int, fd, struct linux_dirent*, buf,
  275. size_t, count)
  276. /* getcwd: sys/shim_getcwd.c */
  277. DEFINE_SHIM_SYSCALL(getcwd, 2, shim_do_getcwd, int, char*, buf, size_t, size)
  278. /* chdir: sys/shim_getcwd.c */
  279. DEFINE_SHIM_SYSCALL(chdir, 1, shim_do_chdir, int, const char*, filename)
  280. /* fchdir: sys/shim_getcwd.c */
  281. DEFINE_SHIM_SYSCALL(fchdir, 1, shim_do_fchdir, int, int, fd)
  282. /* rename: sys/shim_fs.c */
  283. DEFINE_SHIM_SYSCALL(rename, 2, shim_do_rename, int, const char*, oldname, const char*, newname)
  284. /* mkdir: sys/shim_fs.c */
  285. DEFINE_SHIM_SYSCALL(mkdir, 2, shim_do_mkdir, int, const char*, pathname, int, mode)
  286. /* rmdir: sys/shim_fs.c */
  287. DEFINE_SHIM_SYSCALL(rmdir, 1, shim_do_rmdir, int, const char*, pathname)
  288. DEFINE_SHIM_SYSCALL(creat, 2, shim_do_creat, int, const char*, path, mode_t, mode)
  289. SHIM_SYSCALL_PASSTHROUGH(link, 2, int, const char*, oldname, const char*, newname)
  290. /* unlink: sys/shim_fs.c */
  291. DEFINE_SHIM_SYSCALL(unlink, 1, shim_do_unlink, int, const char*, file)
  292. SHIM_SYSCALL_PASSTHROUGH(symlink, 2, int, const char*, old, const char*, new)
  293. /* readlink: sys/shim_stat.c */
  294. DEFINE_SHIM_SYSCALL(readlink, 3, shim_do_readlink, int, const char*, path, char*, buf, size_t,
  295. bufsize)
  296. DEFINE_SHIM_SYSCALL(chmod, 2, shim_do_chmod, int, const char*, filename, mode_t, mode)
  297. DEFINE_SHIM_SYSCALL(fchmod, 2, shim_do_fchmod, int, int, fd, mode_t, mode)
  298. DEFINE_SHIM_SYSCALL(chown, 3, shim_do_chown, int, const char*, filename, uid_t, user, gid_t, group)
  299. DEFINE_SHIM_SYSCALL(fchown, 3, shim_do_fchown, int, int, fd, uid_t, user, gid_t, group)
  300. SHIM_SYSCALL_PASSTHROUGH(lchown, 3, int, const char*, filename, uid_t, user, gid_t, group)
  301. DEFINE_SHIM_SYSCALL(umask, 1, shim_do_umask, mode_t, mode_t, mask)
  302. DEFINE_SHIM_SYSCALL(gettimeofday, 2, shim_do_gettimeofday, int, struct __kernel_timeval*, tv,
  303. struct __kernel_timezone*, tz)
  304. /* getrlimit: sys/shim_getrlimit.c */
  305. DEFINE_SHIM_SYSCALL(getrlimit, 2, shim_do_getrlimit, int, int, resource, struct __kernel_rlimit*,
  306. rlim)
  307. int shim_do_getrusage(int who, struct __kernel_rusage* ru) {
  308. __UNUSED(who);
  309. memset(ru, 0, sizeof(struct __kernel_rusage));
  310. return -ENOSYS;
  311. }
  312. DEFINE_SHIM_SYSCALL(getrusage, 2, shim_do_getrusage, int, int, who, struct __kernel_rusage*, ru)
  313. SHIM_SYSCALL_PASSTHROUGH(sysinfo, 1, int, struct sysinfo*, info)
  314. SHIM_SYSCALL_PASSTHROUGH(times, 1, int, struct tms*, tbuf)
  315. SHIM_SYSCALL_PASSTHROUGH(ptrace, 4, int, long, request, pid_t, pid, void*, addr, void*, data)
  316. /* getuid: sys/shim_getpid.c */
  317. DEFINE_SHIM_SYSCALL(getuid, 0, shim_do_getuid, uid_t)
  318. SHIM_SYSCALL_PASSTHROUGH(syslog, 3, int, int, type, char*, buf, int, len)
  319. /* getgid: sys/shim_getgid.c */
  320. DEFINE_SHIM_SYSCALL(getgid, 0, shim_do_getgid, gid_t)
  321. /* setuid: sys/shim_getpid.c */
  322. DEFINE_SHIM_SYSCALL(setuid, 1, shim_do_setuid, int, uid_t, uid)
  323. /* setgid: sys/shim_getpid.c */
  324. DEFINE_SHIM_SYSCALL(setgid, 1, shim_do_setgid, int, gid_t, gid)
  325. /* setgroups: sys/shim_getpid.c */
  326. DEFINE_SHIM_SYSCALL(setgroups, 2, shim_do_setgroups, int, int, gidsetsize, gid_t*, grouplist)
  327. /* getgroups: sys/shim_getpid.c */
  328. DEFINE_SHIM_SYSCALL(getgroups, 2, shim_do_getgroups, int, int, gidsetsize, gid_t*, grouplist)
  329. /* geteuid: sys/shim_getpid.c */
  330. DEFINE_SHIM_SYSCALL(geteuid, 0, shim_do_geteuid, uid_t)
  331. /* getegid: sys/shim_getpid.c */
  332. DEFINE_SHIM_SYSCALL(getegid, 0, shim_do_getegid, gid_t)
  333. /* getpgid: sys/shim_getpid.c */
  334. DEFINE_SHIM_SYSCALL(setpgid, 2, shim_do_setpgid, int, pid_t, pid, pid_t, pgid)
  335. /* getppid: sys/shim_getpid.c */
  336. DEFINE_SHIM_SYSCALL(getppid, 0, shim_do_getppid, pid_t)
  337. /* getpgrp: sys/shim_getpid.c */
  338. DEFINE_SHIM_SYSCALL(getpgrp, 0, shim_do_getpgrp, pid_t)
  339. /* setsid: sys/shim_getpid.c */
  340. DEFINE_SHIM_SYSCALL(setsid, 0, shim_do_setsid, int)
  341. SHIM_SYSCALL_PASSTHROUGH(setreuid, 2, int, uid_t, ruid, uid_t, euid)
  342. SHIM_SYSCALL_PASSTHROUGH(setregid, 2, int, gid_t, rgid, gid_t, egid)
  343. SHIM_SYSCALL_PASSTHROUGH(setresuid, 3, int, uid_t, ruid, uid_t, euid, uid_t, suid)
  344. SHIM_SYSCALL_PASSTHROUGH(getresuid, 3, int, uid_t*, ruid, uid_t*, euid, uid_t*, suid)
  345. SHIM_SYSCALL_PASSTHROUGH(setresgid, 3, int, gid_t, rgid, gid_t, egid, gid_t, sgid)
  346. SHIM_SYSCALL_PASSTHROUGH(getresgid, 3, int, gid_t*, rgid, gid_t*, egid, gid_t*, sgid)
  347. DEFINE_SHIM_SYSCALL(getpgid, 1, shim_do_getpgid, int, pid_t, pid)
  348. SHIM_SYSCALL_PASSTHROUGH(setfsuid, 1, int, uid_t, uid)
  349. SHIM_SYSCALL_PASSTHROUGH(setfsgid, 1, int, gid_t, gid)
  350. DEFINE_SHIM_SYSCALL(getsid, 1, shim_do_getsid, int, pid_t, pid)
  351. SHIM_SYSCALL_PASSTHROUGH(capget, 2, int, cap_user_header_t, header, cap_user_data_t, dataptr)
  352. SHIM_SYSCALL_PASSTHROUGH(capset, 2, int, cap_user_header_t, header, const cap_user_data_t, data)
  353. DEFINE_SHIM_SYSCALL(rt_sigpending, 2, shim_do_sigpending, int, __sigset_t*, set, size_t, sigsetsize)
  354. SHIM_SYSCALL_PASSTHROUGH(rt_sigtimedwait, 4, int, const __sigset_t*, uthese, siginfo_t*, uinfo,
  355. const struct timespec*, uts, size_t, sigsetsize)
  356. SHIM_SYSCALL_PASSTHROUGH(rt_sigqueueinfo, 3, int, int, pid, int, sig, siginfo_t*, uinfo)
  357. DEFINE_SHIM_SYSCALL(rt_sigsuspend, 1, shim_do_sigsuspend, int, const __sigset_t*, mask)
  358. DEFINE_SHIM_SYSCALL(sigaltstack, 2, shim_do_sigaltstack, int, const stack_t*, ss, stack_t*, oss)
  359. SHIM_SYSCALL_PASSTHROUGH(utime, 2, int, char*, filename, struct utimbuf*, times)
  360. SHIM_SYSCALL_PASSTHROUGH(mknod, 3, int, const char*, filename, int, mode, unsigned, dev)
  361. SHIM_SYSCALL_PASSTHROUGH(uselib, 1, int, const char*, library)
  362. SHIM_SYSCALL_PASSTHROUGH(personality, 1, int, unsigned int, personality)
  363. SHIM_SYSCALL_PASSTHROUGH(ustat, 2, int, unsigned, dev, struct __kernel_ustat*, ubuf)
  364. SHIM_SYSCALL_PASSTHROUGH(statfs, 2, int, const char*, path, struct statfs*, buf)
  365. SHIM_SYSCALL_PASSTHROUGH(fstatfs, 2, int, int, fd, struct statfs*, buf)
  366. SHIM_SYSCALL_PASSTHROUGH(sysfs, 3, int, int, option, unsigned long, arg1, unsigned long, arg2)
  367. SHIM_SYSCALL_PASSTHROUGH(getpriority, 2, int, int, which, int, who)
  368. SHIM_SYSCALL_PASSTHROUGH(setpriority, 3, int, int, which, int, who, int, niceval)
  369. SHIM_SYSCALL_PASSTHROUGH(sched_setparam, 2, int, pid_t, pid, struct __kernel_sched_param*, param)
  370. SHIM_SYSCALL_PASSTHROUGH(sched_getparam, 2, int, pid_t, pid, struct __kernel_sched_param*, param)
  371. SHIM_SYSCALL_PASSTHROUGH(sched_setscheduler, 3, int, pid_t, pid, int, policy,
  372. struct __kernel_sched_param*, param)
  373. SHIM_SYSCALL_PASSTHROUGH(sched_getscheduler, 1, int, pid_t, pid)
  374. SHIM_SYSCALL_PASSTHROUGH(sched_get_priority_max, 1, int, int, policy)
  375. SHIM_SYSCALL_PASSTHROUGH(sched_get_priority_min, 1, int, int, policy)
  376. SHIM_SYSCALL_PASSTHROUGH(sched_rr_get_interval, 2, int, pid_t, pid, struct timespec*, interval)
  377. SHIM_SYSCALL_PASSTHROUGH(mlock, 2, int, void*, start, size_t, len)
  378. SHIM_SYSCALL_PASSTHROUGH(munlock, 2, int, void*, start, size_t, len)
  379. SHIM_SYSCALL_PASSTHROUGH(mlockall, 1, int, int, flags)
  380. SHIM_SYSCALL_PASSTHROUGH(munlockall, 0, int)
  381. SHIM_SYSCALL_PASSTHROUGH(vhangup, 0, int)
  382. SHIM_SYSCALL_PASSTHROUGH(modify_ldt, 3, int, int, func, void*, ptr, unsigned long, bytecount)
  383. SHIM_SYSCALL_PASSTHROUGH(pivot_root, 2, int, const char*, new_root, const char*, put_old)
  384. SHIM_SYSCALL_PASSTHROUGH(_sysctl, 1, int, struct __kernel_sysctl_args*, args)
  385. SHIM_SYSCALL_PASSTHROUGH(prctl, 5, int, int, option, unsigned long, arg2, unsigned long, arg3,
  386. unsigned long, arg4, unsigned long, arg5)
  387. DEFINE_SHIM_SYSCALL(arch_prctl, 2, shim_do_arch_prctl, void*, int, code, void*, addr)
  388. void* shim_do_arch_prctl(int code, void* addr) {
  389. /* We only support set fs. Die loudly if we see anything else. */
  390. assert(code == ARCH_SET_FS || code == ARCH_GET_FS);
  391. switch (code) {
  392. case ARCH_SET_FS:
  393. if (!addr)
  394. return (void*)-EINVAL;
  395. populate_tls(addr, true);
  396. debug("set tcb to %p\n", (void*)addr);
  397. return NULL;
  398. case ARCH_GET_FS:
  399. return (void*)DkSegmentRegister(PAL_SEGMENT_FS, NULL) ?: (void*)-PAL_ERRNO;
  400. }
  401. return (void*)-ENOSYS;
  402. }
  403. SHIM_SYSCALL_PASSTHROUGH(adjtimex, 1, int, struct ____kernel_timex*, txc_p)
  404. /* setrlimit: sys/shim_getrlimit.c */
  405. DEFINE_SHIM_SYSCALL(setrlimit, 2, shim_do_setrlimit, int, int, resource, struct __kernel_rlimit*,
  406. rlim)
  407. /* chroot: sys/shim_isolate.c */
  408. DEFINE_SHIM_SYSCALL(chroot, 1, shim_do_chroot, int, const char*, filename)
  409. SHIM_SYSCALL_PASSTHROUGH(sync, 0, int)
  410. SHIM_SYSCALL_PASSTHROUGH(acct, 1, int, const char*, name)
  411. SHIM_SYSCALL_PASSTHROUGH(settimeofday, 2, int, struct timeval*, tv, struct __kernel_timezone*, tz)
  412. SHIM_SYSCALL_PASSTHROUGH(mount, 5, int, char*, dev_name, char*, dir_name, char*, type,
  413. unsigned long, flags, void*, data)
  414. SHIM_SYSCALL_PASSTHROUGH(umount2, 2, int, const char*, target, int, flags)
  415. SHIM_SYSCALL_PASSTHROUGH(swapon, 2, int, const char*, specialfile, int, swap_flags)
  416. SHIM_SYSCALL_PASSTHROUGH(swapoff, 1, int, const char*, specialfile)
  417. SHIM_SYSCALL_PASSTHROUGH(reboot, 4, int, int, magic1, int, magic2, int, cmd, void*, arg)
  418. SHIM_SYSCALL_PASSTHROUGH(sethostname, 2, int, char*, name, int, len)
  419. SHIM_SYSCALL_PASSTHROUGH(setdomainname, 2, int, char*, name, int, len)
  420. SHIM_SYSCALL_PASSTHROUGH(iopl, 1, int, int, level)
  421. SHIM_SYSCALL_PASSTHROUGH(ioperm, 3, int, unsigned long, from, unsigned long, num, int, on)
  422. SHIM_SYSCALL_PASSTHROUGH(create_module, 2, int, const char*, name, size_t, size)
  423. SHIM_SYSCALL_PASSTHROUGH(init_module, 3, int, void*, umod, unsigned long, len, const char*, uargs)
  424. SHIM_SYSCALL_PASSTHROUGH(delete_module, 2, int, const char*, name_user, unsigned int, flags)
  425. /*
  426. SHIM_SYSCALL_PASSTHROUGH (get_kernel_syms, 1, int, struct kernel_sym *, table)
  427. */
  428. SHIM_SYSCALL_PASSTHROUGH(query_module, 5, int, const char*, name, int, which, void*, buf, size_t,
  429. bufsize, size_t*, retsize)
  430. SHIM_SYSCALL_PASSTHROUGH(quotactl, 4, int, int, cmd, const char*, special, qid_t, id, void*, addr)
  431. /*
  432. SHIM_SYSCALL_PASSTHROUGH (nfsservctl, 3, int, int, cmd, struct nfsctl_arg *,
  433. arg, void *, res)
  434. */
  435. /* shim_getpmsg MISSING
  436. TODO: getpmsg syscall is not implemented (kernel always returns -ENOSYS),
  437. how should we handle this?*/
  438. /* shim_putpmsg MISSING
  439. TODO: putpmsg syscall is not implemented (kernel always returns -ENOSYS),
  440. how should we handle this?*/
  441. /* shim_afs_syscall MISSING
  442. TODO: afs_syscall is not implemented (kernel always returns -ENOSYS),
  443. how should we handle this?*/
  444. /* shim_tuxcall MISSING
  445. TODO: tuxcall syscall is not implemented (kernel always returns -ENOSYS),
  446. how should we handle this?*/
  447. /* shim_security MISSING
  448. TODO: security syscall is not implemented (kernel always returns -ENOSYS),
  449. how should we handle this?*/
  450. /* gettid: sys/shim_getpid.c */
  451. DEFINE_SHIM_SYSCALL(gettid, 0, shim_do_gettid, pid_t)
  452. SHIM_SYSCALL_PASSTHROUGH(readahead, 3, int, int, fd, loff_t, offset, size_t, count)
  453. SHIM_SYSCALL_PASSTHROUGH(setxattr, 5, int, const char*, path, const char*, name, const void*, value,
  454. size_t, size, int, flags)
  455. SHIM_SYSCALL_PASSTHROUGH(lsetxattr, 5, int, const char*, path, const char*, name, const void*,
  456. value, size_t, size, int, flags)
  457. SHIM_SYSCALL_PASSTHROUGH(fsetxattr, 5, int, int, fd, const char*, name, const void*, value, size_t,
  458. size, int, flags)
  459. SHIM_SYSCALL_PASSTHROUGH(getxattr, 4, int, const char*, path, const char*, name, void*, value,
  460. size_t, size)
  461. SHIM_SYSCALL_PASSTHROUGH(lgetxattr, 4, int, const char*, path, const char*, name, void*, value,
  462. size_t, size)
  463. SHIM_SYSCALL_PASSTHROUGH(fgetxattr, 4, int, int, fd, const char*, name, void*, value, size_t, size)
  464. SHIM_SYSCALL_PASSTHROUGH(listxattr, 3, int, const char*, path, char*, list, size_t, size)
  465. SHIM_SYSCALL_PASSTHROUGH(llistxattr, 3, int, const char*, path, char*, list, size_t, size)
  466. SHIM_SYSCALL_PASSTHROUGH(flistxattr, 3, int, int, fd, char*, list, size_t, size)
  467. SHIM_SYSCALL_PASSTHROUGH(removexattr, 2, int, const char*, path, const char*, name)
  468. SHIM_SYSCALL_PASSTHROUGH(lremovexattr, 2, int, const char*, path, const char*, name)
  469. SHIM_SYSCALL_PASSTHROUGH(fremovexattr, 2, int, int, fd, const char*, name)
  470. DEFINE_SHIM_SYSCALL(tkill, 2, shim_do_tkill, int, pid_t, pid, int, sig)
  471. DEFINE_SHIM_SYSCALL(time, 1, shim_do_time, time_t, time_t*, tloc)
  472. /* futex: sys/shim_futex.c */
  473. DEFINE_SHIM_SYSCALL(futex, 6, shim_do_futex, int, int*, uaddr, int, op, int, val, void*, utime,
  474. int*, uaddr2, int, val3)
  475. SHIM_SYSCALL_PASSTHROUGH(sched_setaffinity, 3, int, pid_t, pid, size_t, len, __kernel_cpu_set_t*,
  476. user_mask_ptr)
  477. DEFINE_SHIM_SYSCALL(sched_getaffinity, 3, shim_do_sched_getaffinity, int, pid_t, pid, size_t, len,
  478. __kernel_cpu_set_t*, user_mask_ptr)
  479. SHIM_SYSCALL_PASSTHROUGH(set_thread_area, 1, int, struct user_desc*, u_info)
  480. /* no glibc wrapper */
  481. SHIM_SYSCALL_PASSTHROUGH(io_setup, 2, int, unsigned, nr_reqs, aio_context_t*, ctx)
  482. SHIM_SYSCALL_PASSTHROUGH(io_destroy, 1, int, aio_context_t, ctx)
  483. SHIM_SYSCALL_PASSTHROUGH(io_getevents, 5, int, aio_context_t, ctx_id, long, min_nr, long, nr,
  484. struct io_event*, events, struct timespec*, timeout)
  485. SHIM_SYSCALL_PASSTHROUGH(io_submit, 3, int, aio_context_t, ctx_id, long, nr, struct iocb**, iocbpp)
  486. SHIM_SYSCALL_PASSTHROUGH(io_cancel, 3, int, aio_context_t, ctx_id, struct iocb*, iocb,
  487. struct io_event*, result)
  488. SHIM_SYSCALL_PASSTHROUGH(get_thread_area, 1, int, struct user_desc*, u_info)
  489. SHIM_SYSCALL_PASSTHROUGH(lookup_dcookie, 3, int, unsigned long, cookie64, char*, buf, size_t, len)
  490. DEFINE_SHIM_SYSCALL(epoll_create, 1, shim_do_epoll_create, int, int, size)
  491. /* shim_epoll_ctl_old MISSING
  492. TODO: epoll_ctl_old syscall is not implemented (kernel always returns -ENOSYS),
  493. how should we handle this?*/
  494. /* shim_epoll_wait_old MISSING
  495. TODO: epoll_wait_old syscall is not implemented (kernel always returns -ENOSYS),
  496. how should we handle this?*/
  497. SHIM_SYSCALL_PASSTHROUGH(remap_file_pages, 5, int, void*, start, size_t, size, int, prot, ssize_t,
  498. pgoff, int, flags)
  499. /* getdents64: sys/shim_open.c */
  500. DEFINE_SHIM_SYSCALL(getdents64, 3, shim_do_getdents64, size_t, int, fd, struct linux_dirent64*, buf,
  501. size_t, count)
  502. /* set_tid_address: sys/shim_getpid.c */
  503. DEFINE_SHIM_SYSCALL(set_tid_address, 1, shim_do_set_tid_address, int, int*, tidptr)
  504. SHIM_SYSCALL_PASSTHROUGH(restart_syscall, 0, int)
  505. /* semtimedop: sys/shim_semget.c */
  506. DEFINE_SHIM_SYSCALL(semtimedop, 4, shim_do_semtimedop, int, int, semid, struct sembuf*, sops,
  507. unsigned int, nsops, const struct timespec*, timeout)
  508. SHIM_SYSCALL_PASSTHROUGH(fadvise64, 4, int, int, fd, loff_t, offset, size_t, len, int, advice)
  509. SHIM_SYSCALL_PASSTHROUGH(timer_create, 3, int, clockid_t, which_clock, struct sigevent*,
  510. timer_event_spec, timer_t*, created_timer_id)
  511. SHIM_SYSCALL_PASSTHROUGH(timer_settime, 4, int, timer_t, timer_id, int, flags,
  512. const struct __kernel_itimerspec*, new_setting,
  513. struct __kernel_itimerspec*, old_setting)
  514. SHIM_SYSCALL_PASSTHROUGH(timer_gettime, 2, int, timer_t, timer_id, struct __kernel_itimerspec*,
  515. setting)
  516. SHIM_SYSCALL_PASSTHROUGH(timer_getoverrun, 1, int, timer_t, timer_id)
  517. SHIM_SYSCALL_PASSTHROUGH(timer_delete, 1, int, timer_t, timer_id)
  518. SHIM_SYSCALL_PASSTHROUGH(clock_settime, 2, int, clockid_t, which_clock, const struct timespec*, tp)
  519. /* clock_gettime: sys/shim_time.c */
  520. DEFINE_SHIM_SYSCALL(clock_gettime, 2, shim_do_clock_gettime, int, clockid_t, which_clock,
  521. struct timespec*, tp)
  522. DEFINE_SHIM_SYSCALL(clock_getres, 2, shim_do_clock_getres, int, clockid_t, which_clock,
  523. struct timespec*, tp)
  524. SHIM_SYSCALL_PASSTHROUGH(clock_nanosleep, 4, int, clockid_t, which_clock, int, flags,
  525. const struct timespec*, rqtp, struct timespec*, rmtp)
  526. /* exit_group: sys/shim_exit.c */
  527. DEFINE_SHIM_SYSCALL(exit_group, 1, shim_do_exit_group, int, int, error_code)
  528. DEFINE_SHIM_SYSCALL(epoll_wait, 4, shim_do_epoll_wait, int, int, epfd, struct __kernel_epoll_event*,
  529. events, int, maxevents, int, timeout_ms)
  530. DEFINE_SHIM_SYSCALL(epoll_ctl, 4, shim_do_epoll_ctl, int, int, epfd, int, op, int, fd,
  531. struct __kernel_epoll_event*, event)
  532. DEFINE_SHIM_SYSCALL(tgkill, 3, shim_do_tgkill, int, pid_t, tgid, pid_t, pid, int, sig)
  533. SHIM_SYSCALL_PASSTHROUGH(utimes, 2, int, char*, filename, struct timeval*, utimes)
  534. /* shim_vserver MISSING
  535. TODO: vserver syscall is not implemented (kernel always returns -ENOSYS),
  536. how should we handle this?*/
  537. SHIM_SYSCALL_PASSTHROUGH(mbind, 6, int, void*, start, unsigned long, len, int, mode, unsigned long*,
  538. nmask, unsigned long, maxnode, int, flags)
  539. SHIM_SYSCALL_PASSTHROUGH(set_mempolicy, 3, int, int, mode, unsigned long*, nmask, unsigned long,
  540. maxnode)
  541. SHIM_SYSCALL_PASSTHROUGH(get_mempolicy, 5, int, int*, policy, unsigned long*, nmask, unsigned long,
  542. maxnode, unsigned long, addr, unsigned long, flags)
  543. SHIM_SYSCALL_PASSTHROUGH(mq_open, 4, int, const char*, name, int, oflag, mode_t, mode,
  544. struct __kernel_mq_attr*, attr)
  545. SHIM_SYSCALL_PASSTHROUGH(mq_unlink, 1, int, const char*, name)
  546. SHIM_SYSCALL_PASSTHROUGH(mq_timedsend, 5, int, __kernel_mqd_t, mqdes, const char*, msg_ptr, size_t,
  547. msg_len, unsigned int, msg_prio, const struct timespec*, abs_timeout)
  548. SHIM_SYSCALL_PASSTHROUGH(mq_timedreceive, 5, int, __kernel_mqd_t, mqdes, char*, msg_ptr, size_t,
  549. msg_len, unsigned int*, msg_prio, const struct timespec*, abs_timeout)
  550. SHIM_SYSCALL_PASSTHROUGH(mq_notify, 2, int, __kernel_mqd_t, mqdes, const struct sigevent*,
  551. notification)
  552. SHIM_SYSCALL_PASSTHROUGH(mq_getsetattr, 3, int, __kernel_mqd_t, mqdes,
  553. const struct __kernel_mq_attr*, mqstat, struct __kernel_mq_attr*, omqstat)
  554. /*
  555. SHIM_SYSCALL_PASSTHROUGH (kexec_load, 4, int, unsigned long, entry,
  556. unsigned long, nr_segments, struct kexec_segment *,
  557. segments, unsigned long, flags)
  558. */
  559. SHIM_SYSCALL_PASSTHROUGH(waitid, 5, int, int, which, pid_t, pid, siginfo_t*, infop, int, options,
  560. struct __kernel_rusage*, ru)
  561. /*
  562. SHIM_SYSCALL_PASSTHROUGH (add_key, 5, int, const char *, type, const char *,
  563. description, const void *, payload, size_t, plen,
  564. key_serial_t, destringid)
  565. */
  566. /*
  567. SHIM_SYSCALL_PASSTHROUGH (request_key, 4, int, const char *, type,
  568. const char *, description, const char *, callout_info,
  569. key_serial_t, destringid)
  570. */
  571. /*
  572. SHIM_SYSCALL_PASSTHROUGH (keyctl, 5, int, int, cmd, unsigned long, arg2,
  573. unsigned long, arg3, unsigned long, arg4,
  574. unsigned long, arg5)
  575. */
  576. SHIM_SYSCALL_PASSTHROUGH(ioprio_set, 3, int, int, which, int, who, int, ioprio)
  577. SHIM_SYSCALL_PASSTHROUGH(ioprio_get, 2, int, int, which, int, who)
  578. SHIM_SYSCALL_PASSTHROUGH(inotify_init, 0, int)
  579. SHIM_SYSCALL_PASSTHROUGH(inotify_add_watch, 3, int, int, fd, const char*, path, unsigned int, mask)
  580. SHIM_SYSCALL_PASSTHROUGH(inotify_rm_watch, 2, int, int, fd, unsigned int, wd)
  581. SHIM_SYSCALL_PASSTHROUGH(migrate_pages, 4, int, pid_t, pid, unsigned long, maxnode,
  582. const unsigned long*, from, const unsigned long*, to)
  583. /* openat: sys/shim_open.c */
  584. DEFINE_SHIM_SYSCALL(openat, 4, shim_do_openat, int, int, dfd, const char*, filename, int, flags,
  585. int, mode)
  586. /* mkdirat: sys/shim_fs.c */
  587. DEFINE_SHIM_SYSCALL(mkdirat, 3, shim_do_mkdirat, int, int, dfd, const char*, pathname, int, mode)
  588. SHIM_SYSCALL_PASSTHROUGH(mknodat, 4, int, int, dfd, const char*, filename, int, mode, unsigned, dev)
  589. DEFINE_SHIM_SYSCALL(fchownat, 5, shim_do_fchownat, int, int, dfd, const char*, filename, uid_t,
  590. user, gid_t, group, int, flag)
  591. SHIM_SYSCALL_PASSTHROUGH(futimesat, 3, int, int, dfd, const char*, filename, struct timeval*,
  592. utimes)
  593. /* fstatat: sys/shim_stat.c */
  594. DEFINE_SHIM_SYSCALL(newfstatat, 4, shim_do_newfstatat, int, int, dfd, const char*, filename,
  595. struct stat*, statbuf, int, flag)
  596. /* unlinkat: sys/shim_fs.c */
  597. DEFINE_SHIM_SYSCALL(unlinkat, 3, shim_do_unlinkat, int, int, dfd, const char*, pathname, int, flag)
  598. /* renameat: sys/shim_fs.c */
  599. DEFINE_SHIM_SYSCALL(renameat, 4, shim_do_renameat, int, int, olddfd, const char*, oldname, int,
  600. newdfd, const char*, newname)
  601. SHIM_SYSCALL_PASSTHROUGH(linkat, 5, int, int, olddfd, const char*, oldname, int, newdfd,
  602. const char*, newname, int, flags)
  603. SHIM_SYSCALL_PASSTHROUGH(symlinkat, 3, int, const char*, oldname, int, newdfd, const char*, newname)
  604. SHIM_SYSCALL_PASSTHROUGH(readlinkat, 4, int, int, dfd, const char*, path, char*, buf, int, bufsiz)
  605. /* fchmodat: sys/shim_fs.c */
  606. DEFINE_SHIM_SYSCALL(fchmodat, 3, shim_do_fchmodat, int, int, dfd, const char*, filename, mode_t,
  607. mode)
  608. /* faccessat: sys/shim_access.c */
  609. DEFINE_SHIM_SYSCALL(faccessat, 3, shim_do_faccessat, int, int, dfd, const char*, filename, int,
  610. mode)
  611. /* pselect6: sys/shim_poll.c */
  612. DEFINE_SHIM_SYSCALL(pselect6, 6, shim_do_pselect6, int, int, nfds, fd_set*, readfds, fd_set*,
  613. writefds, fd_set*, errorfds, const struct __kernel_timespec*, tsp,
  614. const __sigset_t*, sigmask)
  615. /* ppoll: sys/shim_poll.c */
  616. DEFINE_SHIM_SYSCALL(ppoll, 5, shim_do_ppoll, int, struct pollfd*, fds, int, nfds, struct timespec*,
  617. tsp, const __sigset_t*, sigmask, size_t, sigsetsize)
  618. SHIM_SYSCALL_PASSTHROUGH(unshare, 1, int, int, unshare_flags)
  619. /* set_robust_list: sys/shim_futex.c */
  620. DEFINE_SHIM_SYSCALL(set_robust_list, 2, shim_do_set_robust_list, int, struct robust_list_head*,
  621. head, size_t, len)
  622. /* get_roubust_list: sys/shim_futex.c */
  623. DEFINE_SHIM_SYSCALL(get_robust_list, 3, shim_do_get_robust_list, int, pid_t, pid,
  624. struct robust_list_head**, head, size_t*, len)
  625. SHIM_SYSCALL_PASSTHROUGH(splice, 6, int, int, fd_in, loff_t*, off_in, int, fd_out, loff_t*, off_out,
  626. size_t, len, int, flags)
  627. SHIM_SYSCALL_PASSTHROUGH(tee, 4, int, int, fdin, int, fdout, size_t, len, unsigned int, flags)
  628. SHIM_SYSCALL_PASSTHROUGH(sync_file_range, 4, int, int, fd, loff_t, offset, loff_t, nbytes, int,
  629. flags)
  630. SHIM_SYSCALL_PASSTHROUGH(vmsplice, 4, int, int, fd, const struct iovec*, iov, unsigned long,
  631. nr_segs, int, flags)
  632. SHIM_SYSCALL_PASSTHROUGH(move_pages, 6, int, pid_t, pid, unsigned long, nr_pages, void**, pages,
  633. const int*, nodes, int*, status, int, flags)
  634. SHIM_SYSCALL_PASSTHROUGH(utimensat, 4, int, int, dfd, const char*, filename, struct timespec*,
  635. utimes, int, flags)
  636. DEFINE_SHIM_SYSCALL(epoll_pwait, 6, shim_do_epoll_pwait, int, int, epfd,
  637. struct __kernel_epoll_event*, events, int, maxevents, int, timeout_ms,
  638. const __sigset_t*, sigmask, size_t, sigsetsize)
  639. SHIM_SYSCALL_PASSTHROUGH(signalfd, 3, int, int, ufd, __sigset_t*, user_mask, size_t, sizemask)
  640. SHIM_SYSCALL_PASSTHROUGH(timerfd_create, 2, int, int, clockid, int, flags)
  641. SHIM_SYSCALL_PASSTHROUGH(eventfd, 1, int, int, count)
  642. SHIM_SYSCALL_PASSTHROUGH(fallocate, 4, int, int, fd, int, mode, loff_t, offset, loff_t, len)
  643. SHIM_SYSCALL_PASSTHROUGH(timerfd_settime, 4, int, int, ufd, int, flags,
  644. const struct __kernel_itimerspec*, utmr, struct __kernel_itimerspec*, otmr)
  645. SHIM_SYSCALL_PASSTHROUGH(timerfd_gettime, 2, int, int, ufd, struct __kernel_itimerspec*, otmr)
  646. /* accept4: sys/shim_socket.c */
  647. DEFINE_SHIM_SYSCALL(accept4, 4, shim_do_accept4, int, int, sockfd, struct sockaddr*, addr,
  648. socklen_t*, addrlen, int, flags)
  649. SHIM_SYSCALL_PASSTHROUGH(signalfd4, 4, int, int, ufd, __sigset_t*, user_mask, size_t, sizemask, int,
  650. flags)
  651. SHIM_SYSCALL_PASSTHROUGH(eventfd2, 2, int, int, count, int, flags)
  652. /* epoll_create1: sys/shim_epoll.c */
  653. DEFINE_SHIM_SYSCALL(epoll_create1, 1, shim_do_epoll_create1, int, int, flags)
  654. /* dup3: sys/shim_dup.c */
  655. DEFINE_SHIM_SYSCALL(dup3, 3, shim_do_dup3, int, int, oldfd, int, newfd, int, flags)
  656. /* pipe2: sys/shim_pipe.c */
  657. DEFINE_SHIM_SYSCALL(pipe2, 2, shim_do_pipe2, int, int*, fildes, int, flags)
  658. SHIM_SYSCALL_PASSTHROUGH(inotify_init1, 1, int, int, flags)
  659. SHIM_SYSCALL_PASSTHROUGH(preadv, 5, int, unsigned long, fd, const struct iovec*, vec, unsigned long,
  660. vlen, unsigned long, pos_l, unsigned long, pos_h)
  661. SHIM_SYSCALL_PASSTHROUGH(pwritev, 5, int, unsigned long, fd, const struct iovec*, vec,
  662. unsigned long, vlen, unsigned long, pos_l, unsigned long, pos_h)
  663. SHIM_SYSCALL_PASSTHROUGH(rt_tgsigqueueinfo, 4, int, pid_t, tgid, pid_t, pid, int, sig, siginfo_t*,
  664. uinfo)
  665. SHIM_SYSCALL_PASSTHROUGH(perf_event_open, 5, int, struct perf_event_attr*, attr_uptr, pid_t, pid,
  666. int, cpu, int, group_fd, int, flags)
  667. DEFINE_SHIM_SYSCALL(recvmmsg, 5, shim_do_recvmmsg, ssize_t, int, fd, struct mmsghdr*, msg, size_t,
  668. vlen, int, flags, struct __kernel_timespec*, timeout)
  669. SHIM_SYSCALL_PASSTHROUGH(fanotify_init, 2, int, int, flags, int, event_f_flags)
  670. SHIM_SYSCALL_PASSTHROUGH(fanotify_mark, 5, int, int, fanotify_fd, int, flags, unsigned long, mask,
  671. int, fd, const char*, pathname)
  672. DEFINE_SHIM_SYSCALL(prlimit64, 4, shim_do_prlimit64, int, pid_t, pid, int, resource,
  673. const struct __kernel_rlimit64*, new_rlim, struct __kernel_rlimit64*, old_rlim)
  674. SHIM_SYSCALL_PASSTHROUGH(name_to_handle_at, 5, int, int, dfd, const char*, name,
  675. struct linux_file_handle*, handle, int*, mnt_id, int, flag)
  676. SHIM_SYSCALL_PASSTHROUGH(open_by_handle_at, 3, int, int, mountdirfd, struct linux_file_handle*,
  677. handle, int, flags)
  678. SHIM_SYSCALL_PASSTHROUGH(clock_adjtime, 2, int, clockid_t, which_clock, struct timex*, tx)
  679. SHIM_SYSCALL_PASSTHROUGH(syncfs, 1, int, int, fd)
  680. DEFINE_SHIM_SYSCALL(sendmmsg, 4, shim_do_sendmmsg, ssize_t, int, fd, struct mmsghdr*, msg, size_t,
  681. vlen, int, flags)
  682. SHIM_SYSCALL_PASSTHROUGH(setns, 2, int, int, fd, int, nstype)
  683. SHIM_SYSCALL_PASSTHROUGH(getcpu, 3, int, unsigned*, cpu, unsigned*, node, struct getcpu_cache*,
  684. cache)
  685. /* libos calls */
  686. DEFINE_SHIM_SYSCALL(msgpersist, 2, shim_do_msgpersist, int, int, msqid, int, cmd)
  687. DEFINE_SHIM_SYSCALL(benchmark_rpc, 4, shim_do_benchmark_rpc, int, pid_t, pid, int, times,
  688. const void*, buf, size_t, size)
  689. DEFINE_SHIM_SYSCALL(send_rpc, 3, shim_do_send_rpc, size_t, pid_t, pid, const void*, buf, size_t,
  690. size)
  691. DEFINE_SHIM_SYSCALL(recv_rpc, 3, shim_do_recv_rpc, size_t, pid_t*, pid, void*, buf, size_t, size)
  692. DEFINE_SHIM_SYSCALL(checkpoint, 1, shim_do_checkpoint, int, const char*, filename)