Arnd Bergmann | 2dd1493 | 2006-03-23 00:00:09 +0100 | [diff] [blame] | 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, |
David Woodhouse | 5a4fa16 | 2006-05-23 07:46:38 -0700 | [diff] [blame] | 261 | [224] sys_ni_syscall, |
Arnd Bergmann | 2dd1493 | 2006-03-23 00:00:09 +0100 | [diff] [blame] | 262 | [__NR_tuxcall] sys_ni_syscall, |
| 263 | [226] sys_ni_syscall, |
| 264 | [__NR_io_setup] sys_io_setup, |
| 265 | [__NR_io_destroy] sys_io_destroy, |
| 266 | [__NR_io_getevents] sys_io_getevents, |
| 267 | [__NR_io_submit] sys_io_submit, |
| 268 | [__NR_io_cancel] sys_io_cancel, |
| 269 | [__NR_set_tid_address] sys_ni_syscall, /* sys_set_tid_address */ |
| 270 | [__NR_fadvise64] sys_fadvise64, |
| 271 | [__NR_exit_group] sys_ni_syscall, /* sys_exit_group */ |
| 272 | [__NR_lookup_dcookie] sys_ni_syscall, /* sys_lookup_dcookie */ |
| 273 | [__NR_epoll_create] sys_epoll_create, |
| 274 | [__NR_epoll_ctl] sys_epoll_ctl, |
| 275 | [__NR_epoll_wait] sys_epoll_wait, |
| 276 | [__NR_remap_file_pages] sys_remap_file_pages, |
| 277 | [__NR_timer_create] sys_timer_create, |
| 278 | [__NR_timer_settime] sys_timer_settime, |
| 279 | [__NR_timer_gettime] sys_timer_gettime, |
| 280 | [__NR_timer_getoverrun] sys_timer_getoverrun, |
| 281 | [__NR_timer_delete] sys_timer_delete, |
| 282 | [__NR_clock_settime] sys_clock_settime, |
| 283 | [__NR_clock_gettime] sys_clock_gettime, |
| 284 | [__NR_clock_getres] sys_clock_getres, |
| 285 | [__NR_clock_nanosleep] sys_clock_nanosleep, |
| 286 | [__NR_swapcontext] sys_ni_syscall, /* ppc64_swapcontext */ |
| 287 | [__NR_tgkill] sys_tgkill, |
| 288 | [__NR_utimes] sys_utimes, |
| 289 | [__NR_statfs64] sys_statfs64, |
| 290 | [__NR_fstatfs64] sys_fstatfs64, |
| 291 | [254] sys_ni_syscall, |
| 292 | [__NR_rtas] ppc_rtas, |
| 293 | [256] sys_ni_syscall, |
| 294 | [257] sys_ni_syscall, |
| 295 | [258] sys_ni_syscall, |
| 296 | [__NR_mbind] sys_ni_syscall, /* sys_mbind */ |
| 297 | [__NR_get_mempolicy] sys_ni_syscall, /* sys_get_mempolicy */ |
| 298 | [__NR_set_mempolicy] sys_ni_syscall, /* sys_set_mempolicy */ |
| 299 | [__NR_mq_open] sys_ni_syscall, /* sys_mq_open */ |
| 300 | [__NR_mq_unlink] sys_ni_syscall, /* sys_mq_unlink */ |
| 301 | [__NR_mq_timedsend] sys_ni_syscall, /* sys_mq_timedsend */ |
| 302 | [__NR_mq_timedreceive] sys_ni_syscall, /* sys_mq_timedreceive */ |
| 303 | [__NR_mq_notify] sys_ni_syscall, /* sys_mq_notify */ |
| 304 | [__NR_mq_getsetattr] sys_ni_syscall, /* sys_mq_getsetattr */ |
| 305 | [__NR_kexec_load] sys_ni_syscall, /* sys_kexec_load */ |
| 306 | [__NR_add_key] sys_ni_syscall, /* sys_add_key */ |
| 307 | [__NR_request_key] sys_ni_syscall, /* sys_request_key */ |
| 308 | [__NR_keyctl] sys_ni_syscall, /* sys_keyctl */ |
| 309 | [__NR_waitid] sys_ni_syscall, /* sys_waitid */ |
| 310 | [__NR_ioprio_set] sys_ni_syscall, /* sys_ioprio_set */ |
| 311 | [__NR_ioprio_get] sys_ni_syscall, /* sys_ioprio_get */ |
| 312 | [__NR_inotify_init] sys_ni_syscall, /* sys_inotify_init */ |
| 313 | [__NR_inotify_add_watch] sys_ni_syscall, /* sys_inotify_add_watch */ |
| 314 | [__NR_inotify_rm_watch] sys_ni_syscall, /* sys_inotify_rm_watch */ |
| 315 | [__NR_spu_run] sys_ni_syscall, /* sys_spu_run */ |
| 316 | [__NR_spu_create] sys_ni_syscall, /* sys_spu_create */ |
| 317 | [__NR_pselect6] sys_ni_syscall, /* sys_pselect */ |
| 318 | [__NR_ppoll] sys_ni_syscall, /* sys_ppoll */ |
| 319 | [__NR_unshare] sys_unshare, |
Dave Jones | cfff5b2 | 2006-03-31 23:53:09 -0500 | [diff] [blame] | 320 | [__NR_splice] sys_splice, |
Arnd Bergmann | 23b2527 | 2006-04-18 15:24:16 +0200 | [diff] [blame] | 321 | [__NR_tee] sys_tee, |
Jens Axboe | 912d35f | 2006-04-26 10:59:21 +0200 | [diff] [blame] | 322 | [__NR_vmsplice] sys_vmsplice, |
Andreas Schwab | 2833c28 | 2006-04-27 15:46:42 +0200 | [diff] [blame] | 323 | [__NR_openat] sys_openat, |
| 324 | [__NR_mkdirat] sys_mkdirat, |
| 325 | [__NR_mknodat] sys_mknodat, |
| 326 | [__NR_fchownat] sys_fchownat, |
| 327 | [__NR_futimesat] sys_futimesat, |
| 328 | [__NR_newfstatat] sys_newfstatat, |
| 329 | [__NR_unlinkat] sys_unlinkat, |
| 330 | [__NR_renameat] sys_renameat, |
| 331 | [__NR_linkat] sys_linkat, |
| 332 | [__NR_symlinkat] sys_symlinkat, |
| 333 | [__NR_readlinkat] sys_readlinkat, |
| 334 | [__NR_fchmodat] sys_fchmodat, |
| 335 | [__NR_faccessat] sys_faccessat, |
Arnd Bergmann | 2dd1493 | 2006-03-23 00:00:09 +0100 | [diff] [blame] | 336 | }; |
| 337 | |
| 338 | long spu_sys_callback(struct spu_syscall_block *s) |
| 339 | { |
| 340 | long (*syscall)(u64 a1, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6); |
| 341 | |
Arnd Bergmann | 23b2527 | 2006-04-18 15:24:16 +0200 | [diff] [blame] | 342 | if (s->nr_ret >= ARRAY_SIZE(spu_syscall_table)) { |
Arnd Bergmann | 2dd1493 | 2006-03-23 00:00:09 +0100 | [diff] [blame] | 343 | pr_debug("%s: invalid syscall #%ld", __FUNCTION__, s->nr_ret); |
| 344 | return -ENOSYS; |
| 345 | } |
| 346 | |
David Woodhouse | b471f55 | 2006-05-23 07:46:39 -0700 | [diff] [blame^] | 347 | syscall = spu_syscall_table[s->nr_ret]; |
| 348 | |
Arnd Bergmann | 2dd1493 | 2006-03-23 00:00:09 +0100 | [diff] [blame] | 349 | #ifdef DEBUG |
| 350 | print_symbol(KERN_DEBUG "SPU-syscall %s:", (unsigned long)syscall); |
| 351 | printk("syscall%ld(%lx, %lx, %lx, %lx, %lx, %lx)\n", |
| 352 | s->nr_ret, |
| 353 | s->parm[0], s->parm[1], s->parm[2], |
| 354 | s->parm[3], s->parm[4], s->parm[5]); |
| 355 | #endif |
| 356 | |
| 357 | return syscall(s->parm[0], s->parm[1], s->parm[2], |
| 358 | s->parm[3], s->parm[4], s->parm[5]); |
| 359 | } |
| 360 | EXPORT_SYMBOL_GPL(spu_sys_callback); |