spu_callbacks.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /*
  2. * System call callback functions for SPUs
  3. */
  4. #define DEBUG
  5. #include <linux/kallsyms.h>
  6. #include <linux/module.h>
  7. #include <linux/syscalls.h>
  8. #include <asm/spu.h>
  9. #include <asm/syscalls.h>
  10. #include <asm/unistd.h>
  11. /*
  12. * This table defines the system calls that an SPU can call.
  13. * It is currently a subset of the 64 bit powerpc system calls,
  14. * with the exact semantics.
  15. *
  16. * The reasons for disabling some of the system calls are:
  17. * 1. They interact with the way SPU syscalls are handled
  18. * and we can't let them execute ever:
  19. * restart_syscall, exit, for, execve, ptrace, ...
  20. * 2. They are deprecated and replaced by other means:
  21. * uselib, pciconfig_*, sysfs, ...
  22. * 3. They are somewhat interacting with the system in a way
  23. * we don't want an SPU to:
  24. * reboot, init_module, mount, kexec_load
  25. * 4. They are optional and we can't rely on them being
  26. * linked into the kernel. Unfortunately, the cond_syscall
  27. * helper does not work here as it does not add the necessary
  28. * opd symbols:
  29. * mbind, mq_open, ipc, ...
  30. */
  31. void *spu_syscall_table[] = {
  32. [__NR_restart_syscall] sys_ni_syscall, /* sys_restart_syscall */
  33. [__NR_exit] sys_ni_syscall, /* sys_exit */
  34. [__NR_fork] sys_ni_syscall, /* ppc_fork */
  35. [__NR_read] sys_read,
  36. [__NR_write] sys_write,
  37. [__NR_open] sys_open,
  38. [__NR_close] sys_close,
  39. [__NR_waitpid] sys_waitpid,
  40. [__NR_creat] sys_creat,
  41. [__NR_link] sys_link,
  42. [__NR_unlink] sys_unlink,
  43. [__NR_execve] sys_ni_syscall, /* sys_execve */
  44. [__NR_chdir] sys_chdir,
  45. [__NR_time] sys_time,
  46. [__NR_mknod] sys_mknod,
  47. [__NR_chmod] sys_chmod,
  48. [__NR_lchown] sys_lchown,
  49. [__NR_break] sys_ni_syscall,
  50. [__NR_oldstat] sys_ni_syscall,
  51. [__NR_lseek] sys_lseek,
  52. [__NR_getpid] sys_getpid,
  53. [__NR_mount] sys_ni_syscall, /* sys_mount */
  54. [__NR_umount] sys_ni_syscall,
  55. [__NR_setuid] sys_setuid,
  56. [__NR_getuid] sys_getuid,
  57. [__NR_stime] sys_stime,
  58. [__NR_ptrace] sys_ni_syscall, /* sys_ptrace */
  59. [__NR_alarm] sys_alarm,
  60. [__NR_oldfstat] sys_ni_syscall,
  61. [__NR_pause] sys_ni_syscall, /* sys_pause */
  62. [__NR_utime] sys_ni_syscall, /* sys_utime */
  63. [__NR_stty] sys_ni_syscall,
  64. [__NR_gtty] sys_ni_syscall,
  65. [__NR_access] sys_access,
  66. [__NR_nice] sys_nice,
  67. [__NR_ftime] sys_ni_syscall,
  68. [__NR_sync] sys_sync,
  69. [__NR_kill] sys_kill,
  70. [__NR_rename] sys_rename,
  71. [__NR_mkdir] sys_mkdir,
  72. [__NR_rmdir] sys_rmdir,
  73. [__NR_dup] sys_dup,
  74. [__NR_pipe] sys_pipe,
  75. [__NR_times] sys_times,
  76. [__NR_prof] sys_ni_syscall,
  77. [__NR_brk] sys_brk,
  78. [__NR_setgid] sys_setgid,
  79. [__NR_getgid] sys_getgid,
  80. [__NR_signal] sys_ni_syscall, /* sys_signal */
  81. [__NR_geteuid] sys_geteuid,
  82. [__NR_getegid] sys_getegid,
  83. [__NR_acct] sys_ni_syscall, /* sys_acct */
  84. [__NR_umount2] sys_ni_syscall, /* sys_umount */
  85. [__NR_lock] sys_ni_syscall,
  86. [__NR_ioctl] sys_ioctl,
  87. [__NR_fcntl] sys_fcntl,
  88. [__NR_mpx] sys_ni_syscall,
  89. [__NR_setpgid] sys_setpgid,
  90. [__NR_ulimit] sys_ni_syscall,
  91. [__NR_oldolduname] sys_ni_syscall,
  92. [__NR_umask] sys_umask,
  93. [__NR_chroot] sys_chroot,
  94. [__NR_ustat] sys_ni_syscall, /* sys_ustat */
  95. [__NR_dup2] sys_dup2,
  96. [__NR_getppid] sys_getppid,
  97. [__NR_getpgrp] sys_getpgrp,
  98. [__NR_setsid] sys_setsid,
  99. [__NR_sigaction] sys_ni_syscall,
  100. [__NR_sgetmask] sys_sgetmask,
  101. [__NR_ssetmask] sys_ssetmask,
  102. [__NR_setreuid] sys_setreuid,
  103. [__NR_setregid] sys_setregid,
  104. [__NR_sigsuspend] sys_ni_syscall,
  105. [__NR_sigpending] sys_ni_syscall,
  106. [__NR_sethostname] sys_sethostname,
  107. [__NR_setrlimit] sys_setrlimit,
  108. [__NR_getrlimit] sys_ni_syscall,
  109. [__NR_getrusage] sys_getrusage,
  110. [__NR_gettimeofday] sys_gettimeofday,
  111. [__NR_settimeofday] sys_settimeofday,
  112. [__NR_getgroups] sys_getgroups,
  113. [__NR_setgroups] sys_setgroups,
  114. [__NR_select] sys_ni_syscall,
  115. [__NR_symlink] sys_symlink,
  116. [__NR_oldlstat] sys_ni_syscall,
  117. [__NR_readlink] sys_readlink,
  118. [__NR_uselib] sys_ni_syscall, /* sys_uselib */
  119. [__NR_swapon] sys_ni_syscall, /* sys_swapon */
  120. [__NR_reboot] sys_ni_syscall, /* sys_reboot */
  121. [__NR_readdir] sys_ni_syscall,
  122. [__NR_mmap] sys_mmap,
  123. [__NR_munmap] sys_munmap,
  124. [__NR_truncate] sys_truncate,
  125. [__NR_ftruncate] sys_ftruncate,
  126. [__NR_fchmod] sys_fchmod,
  127. [__NR_fchown] sys_fchown,
  128. [__NR_getpriority] sys_getpriority,
  129. [__NR_setpriority] sys_setpriority,
  130. [__NR_profil] sys_ni_syscall,
  131. [__NR_statfs] sys_ni_syscall, /* sys_statfs */
  132. [__NR_fstatfs] sys_ni_syscall, /* sys_fstatfs */
  133. [__NR_ioperm] sys_ni_syscall,
  134. [__NR_socketcall] sys_socketcall,
  135. [__NR_syslog] sys_syslog,
  136. [__NR_setitimer] sys_setitimer,
  137. [__NR_getitimer] sys_getitimer,
  138. [__NR_stat] sys_newstat,
  139. [__NR_lstat] sys_newlstat,
  140. [__NR_fstat] sys_newfstat,
  141. [__NR_olduname] sys_ni_syscall,
  142. [__NR_iopl] sys_ni_syscall,
  143. [__NR_vhangup] sys_vhangup,
  144. [__NR_idle] sys_ni_syscall,
  145. [__NR_vm86] sys_ni_syscall,
  146. [__NR_wait4] sys_wait4,
  147. [__NR_swapoff] sys_ni_syscall, /* sys_swapoff */
  148. [__NR_sysinfo] sys_sysinfo,
  149. [__NR_ipc] sys_ni_syscall, /* sys_ipc */
  150. [__NR_fsync] sys_fsync,
  151. [__NR_sigreturn] sys_ni_syscall,
  152. [__NR_clone] sys_ni_syscall, /* ppc_clone */
  153. [__NR_setdomainname] sys_setdomainname,
  154. [__NR_uname] ppc_newuname,
  155. [__NR_modify_ldt] sys_ni_syscall,
  156. [__NR_adjtimex] sys_adjtimex,
  157. [__NR_mprotect] sys_mprotect,
  158. [__NR_sigprocmask] sys_ni_syscall,
  159. [__NR_create_module] sys_ni_syscall,
  160. [__NR_init_module] sys_ni_syscall, /* sys_init_module */
  161. [__NR_delete_module] sys_ni_syscall, /* sys_delete_module */
  162. [__NR_get_kernel_syms] sys_ni_syscall,
  163. [__NR_quotactl] sys_ni_syscall, /* sys_quotactl */
  164. [__NR_getpgid] sys_getpgid,
  165. [__NR_fchdir] sys_fchdir,
  166. [__NR_bdflush] sys_bdflush,
  167. [__NR_sysfs] sys_ni_syscall, /* sys_sysfs */
  168. [__NR_personality] ppc64_personality,
  169. [__NR_afs_syscall] sys_ni_syscall,
  170. [__NR_setfsuid] sys_setfsuid,
  171. [__NR_setfsgid] sys_setfsgid,
  172. [__NR__llseek] sys_llseek,
  173. [__NR_getdents] sys_getdents,
  174. [__NR__newselect] sys_select,
  175. [__NR_flock] sys_flock,
  176. [__NR_msync] sys_msync,
  177. [__NR_readv] sys_readv,
  178. [__NR_writev] sys_writev,
  179. [__NR_getsid] sys_getsid,
  180. [__NR_fdatasync] sys_fdatasync,
  181. [__NR__sysctl] sys_ni_syscall, /* sys_sysctl */
  182. [__NR_mlock] sys_mlock,
  183. [__NR_munlock] sys_munlock,
  184. [__NR_mlockall] sys_mlockall,
  185. [__NR_munlockall] sys_munlockall,
  186. [__NR_sched_setparam] sys_sched_setparam,
  187. [__NR_sched_getparam] sys_sched_getparam,
  188. [__NR_sched_setscheduler] sys_sched_setscheduler,
  189. [__NR_sched_getscheduler] sys_sched_getscheduler,
  190. [__NR_sched_yield] sys_sched_yield,
  191. [__NR_sched_get_priority_max] sys_sched_get_priority_max,
  192. [__NR_sched_get_priority_min] sys_sched_get_priority_min,
  193. [__NR_sched_rr_get_interval] sys_sched_rr_get_interval,
  194. [__NR_nanosleep] sys_nanosleep,
  195. [__NR_mremap] sys_mremap,
  196. [__NR_setresuid] sys_setresuid,
  197. [__NR_getresuid] sys_getresuid,
  198. [__NR_query_module] sys_ni_syscall,
  199. [__NR_poll] sys_poll,
  200. [__NR_nfsservctl] sys_ni_syscall, /* sys_nfsservctl */
  201. [__NR_setresgid] sys_setresgid,
  202. [__NR_getresgid] sys_getresgid,
  203. [__NR_prctl] sys_prctl,
  204. [__NR_rt_sigreturn] sys_ni_syscall, /* ppc64_rt_sigreturn */
  205. [__NR_rt_sigaction] sys_ni_syscall, /* sys_rt_sigaction */
  206. [__NR_rt_sigprocmask] sys_ni_syscall, /* sys_rt_sigprocmask */
  207. [__NR_rt_sigpending] sys_ni_syscall, /* sys_rt_sigpending */
  208. [__NR_rt_sigtimedwait] sys_ni_syscall, /* sys_rt_sigtimedwait */
  209. [__NR_rt_sigqueueinfo] sys_ni_syscall, /* sys_rt_sigqueueinfo */
  210. [__NR_rt_sigsuspend] sys_ni_syscall, /* sys_rt_sigsuspend */
  211. [__NR_pread64] sys_pread64,
  212. [__NR_pwrite64] sys_pwrite64,
  213. [__NR_chown] sys_chown,
  214. [__NR_getcwd] sys_getcwd,
  215. [__NR_capget] sys_capget,
  216. [__NR_capset] sys_capset,
  217. [__NR_sigaltstack] sys_ni_syscall, /* sys_sigaltstack */
  218. [__NR_sendfile] sys_sendfile64,
  219. [__NR_getpmsg] sys_ni_syscall,
  220. [__NR_putpmsg] sys_ni_syscall,
  221. [__NR_vfork] sys_ni_syscall, /* ppc_vfork */
  222. [__NR_ugetrlimit] sys_getrlimit,
  223. [__NR_readahead] sys_readahead,
  224. [192] sys_ni_syscall,
  225. [193] sys_ni_syscall,
  226. [194] sys_ni_syscall,
  227. [195] sys_ni_syscall,
  228. [196] sys_ni_syscall,
  229. [197] sys_ni_syscall,
  230. [__NR_pciconfig_read] sys_ni_syscall, /* sys_pciconfig_read */
  231. [__NR_pciconfig_write] sys_ni_syscall, /* sys_pciconfig_write */
  232. [__NR_pciconfig_iobase] sys_ni_syscall, /* sys_pciconfig_iobase */
  233. [__NR_multiplexer] sys_ni_syscall,
  234. [__NR_getdents64] sys_getdents64,
  235. [__NR_pivot_root] sys_pivot_root,
  236. [204] sys_ni_syscall,
  237. [__NR_madvise] sys_madvise,
  238. [__NR_mincore] sys_mincore,
  239. [__NR_gettid] sys_gettid,
  240. [__NR_tkill] sys_tkill,
  241. [__NR_setxattr] sys_setxattr,
  242. [__NR_lsetxattr] sys_lsetxattr,
  243. [__NR_fsetxattr] sys_fsetxattr,
  244. [__NR_getxattr] sys_getxattr,
  245. [__NR_lgetxattr] sys_lgetxattr,
  246. [__NR_fgetxattr] sys_fgetxattr,
  247. [__NR_listxattr] sys_listxattr,
  248. [__NR_llistxattr] sys_llistxattr,
  249. [__NR_flistxattr] sys_flistxattr,
  250. [__NR_removexattr] sys_removexattr,
  251. [__NR_lremovexattr] sys_lremovexattr,
  252. [__NR_fremovexattr] sys_fremovexattr,
  253. [__NR_futex] sys_futex,
  254. [__NR_sched_setaffinity] sys_sched_setaffinity,
  255. [__NR_sched_getaffinity] sys_sched_getaffinity,
  256. [__NR_tuxcall] sys_ni_syscall,
  257. [226] sys_ni_syscall,
  258. [__NR_io_setup] sys_io_setup,
  259. [__NR_io_destroy] sys_io_destroy,
  260. [__NR_io_getevents] sys_io_getevents,
  261. [__NR_io_submit] sys_io_submit,
  262. [__NR_io_cancel] sys_io_cancel,
  263. [__NR_set_tid_address] sys_ni_syscall, /* sys_set_tid_address */
  264. [__NR_fadvise64] sys_fadvise64,
  265. [__NR_exit_group] sys_ni_syscall, /* sys_exit_group */
  266. [__NR_lookup_dcookie] sys_ni_syscall, /* sys_lookup_dcookie */
  267. [__NR_epoll_create] sys_epoll_create,
  268. [__NR_epoll_ctl] sys_epoll_ctl,
  269. [__NR_epoll_wait] sys_epoll_wait,
  270. [__NR_remap_file_pages] sys_remap_file_pages,
  271. [__NR_timer_create] sys_timer_create,
  272. [__NR_timer_settime] sys_timer_settime,
  273. [__NR_timer_gettime] sys_timer_gettime,
  274. [__NR_timer_getoverrun] sys_timer_getoverrun,
  275. [__NR_timer_delete] sys_timer_delete,
  276. [__NR_clock_settime] sys_clock_settime,
  277. [__NR_clock_gettime] sys_clock_gettime,
  278. [__NR_clock_getres] sys_clock_getres,
  279. [__NR_clock_nanosleep] sys_clock_nanosleep,
  280. [__NR_swapcontext] sys_ni_syscall, /* ppc64_swapcontext */
  281. [__NR_tgkill] sys_tgkill,
  282. [__NR_utimes] sys_utimes,
  283. [__NR_statfs64] sys_statfs64,
  284. [__NR_fstatfs64] sys_fstatfs64,
  285. [254] sys_ni_syscall,
  286. [__NR_rtas] ppc_rtas,
  287. [256] sys_ni_syscall,
  288. [257] sys_ni_syscall,
  289. [258] sys_ni_syscall,
  290. [__NR_mbind] sys_ni_syscall, /* sys_mbind */
  291. [__NR_get_mempolicy] sys_ni_syscall, /* sys_get_mempolicy */
  292. [__NR_set_mempolicy] sys_ni_syscall, /* sys_set_mempolicy */
  293. [__NR_mq_open] sys_ni_syscall, /* sys_mq_open */
  294. [__NR_mq_unlink] sys_ni_syscall, /* sys_mq_unlink */
  295. [__NR_mq_timedsend] sys_ni_syscall, /* sys_mq_timedsend */
  296. [__NR_mq_timedreceive] sys_ni_syscall, /* sys_mq_timedreceive */
  297. [__NR_mq_notify] sys_ni_syscall, /* sys_mq_notify */
  298. [__NR_mq_getsetattr] sys_ni_syscall, /* sys_mq_getsetattr */
  299. [__NR_kexec_load] sys_ni_syscall, /* sys_kexec_load */
  300. [__NR_add_key] sys_ni_syscall, /* sys_add_key */
  301. [__NR_request_key] sys_ni_syscall, /* sys_request_key */
  302. [__NR_keyctl] sys_ni_syscall, /* sys_keyctl */
  303. [__NR_waitid] sys_ni_syscall, /* sys_waitid */
  304. [__NR_ioprio_set] sys_ni_syscall, /* sys_ioprio_set */
  305. [__NR_ioprio_get] sys_ni_syscall, /* sys_ioprio_get */
  306. [__NR_inotify_init] sys_ni_syscall, /* sys_inotify_init */
  307. [__NR_inotify_add_watch] sys_ni_syscall, /* sys_inotify_add_watch */
  308. [__NR_inotify_rm_watch] sys_ni_syscall, /* sys_inotify_rm_watch */
  309. [__NR_spu_run] sys_ni_syscall, /* sys_spu_run */
  310. [__NR_spu_create] sys_ni_syscall, /* sys_spu_create */
  311. [__NR_pselect6] sys_ni_syscall, /* sys_pselect */
  312. [__NR_ppoll] sys_ni_syscall, /* sys_ppoll */
  313. [__NR_unshare] sys_unshare,
  314. [__NR_splice] sys_splice,
  315. };
  316. long spu_sys_callback(struct spu_syscall_block *s)
  317. {
  318. long (*syscall)(u64 a1, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6);
  319. BUILD_BUG_ON(ARRAY_SIZE(spu_syscall_table) != __NR_syscalls);
  320. syscall = spu_syscall_table[s->nr_ret];
  321. if (s->nr_ret >= __NR_syscalls) {
  322. pr_debug("%s: invalid syscall #%ld", __FUNCTION__, s->nr_ret);
  323. return -ENOSYS;
  324. }
  325. #ifdef DEBUG
  326. print_symbol(KERN_DEBUG "SPU-syscall %s:", (unsigned long)syscall);
  327. printk("syscall%ld(%lx, %lx, %lx, %lx, %lx, %lx)\n",
  328. s->nr_ret,
  329. s->parm[0], s->parm[1], s->parm[2],
  330. s->parm[3], s->parm[4], s->parm[5]);
  331. #endif
  332. return syscall(s->parm[0], s->parm[1], s->parm[2],
  333. s->parm[3], s->parm[4], s->parm[5]);
  334. }
  335. EXPORT_SYMBOL_GPL(spu_sys_callback);