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