12dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann/* 22dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * System call callback functions for SPUs 32dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann */ 42dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann 5c70d4ca52b1390dd2603535600c948cbdb0b9ec9Jeremy Kerr#undef DEBUG 62dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann 72dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann#include <linux/kallsyms.h> 84b16f8e2d6d64249f0ed3ca7fe2a319d0dde2719Paul Gortmaker#include <linux/export.h> 92dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann#include <linux/syscalls.h> 102dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann 112dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann#include <asm/spu.h> 122dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann#include <asm/syscalls.h> 132dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann#include <asm/unistd.h> 142dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann 152dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann/* 162dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * This table defines the system calls that an SPU can call. 172dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * It is currently a subset of the 64 bit powerpc system calls, 182dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * with the exact semantics. 192dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * 202dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * The reasons for disabling some of the system calls are: 212dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * 1. They interact with the way SPU syscalls are handled 222dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * and we can't let them execute ever: 232dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * restart_syscall, exit, for, execve, ptrace, ... 242dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * 2. They are deprecated and replaced by other means: 252dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * uselib, pciconfig_*, sysfs, ... 262dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * 3. They are somewhat interacting with the system in a way 272dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * we don't want an SPU to: 282dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * reboot, init_module, mount, kexec_load 292dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * 4. They are optional and we can't rely on them being 302dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * linked into the kernel. Unfortunately, the cond_syscall 312dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * helper does not work here as it does not add the necessary 322dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * opd symbols: 332dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann * mbind, mq_open, ipc, ... 342dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann */ 352dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann 361238819a41b6e38e1560afe8f33bbc815671b4f7Sebastian Siewiorstatic void *spu_syscall_table[] = { 3772abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define SYSCALL(func) sys_ni_syscall, 3872abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define COMPAT_SYS(func) sys_ni_syscall, 3972abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define PPC_SYS(func) sys_ni_syscall, 4072abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define OLDSYS(func) sys_ni_syscall, 4172abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define SYS32ONLY(func) sys_ni_syscall, 4272abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define SYSX(f, f3264, f32) sys_ni_syscall, 4372abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab 4472abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define SYSCALL_SPU(func) sys_##func, 4572abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define COMPAT_SYS_SPU(func) sys_##func, 4672abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define PPC_SYS_SPU(func) ppc_##func, 4772abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#define SYSX_SPU(f, f3264, f32) f, 4872abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab 4972abd54035a3d71fd8f02596e659257e8bba16caAndreas Schwab#include <asm/systbl.h> 502dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann}; 512dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann 522dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmannlong spu_sys_callback(struct spu_syscall_block *s) 532dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann{ 542dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann long (*syscall)(u64 a1, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6); 552dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann 5623b2527d5eae89841eb66b46e80ec91980493ddaArnd Bergmann if (s->nr_ret >= ARRAY_SIZE(spu_syscall_table)) { 57fe333321e2a71f706b794d55b6a3dcb5ab240f65Ingo Molnar pr_debug("%s: invalid syscall #%lld", __func__, s->nr_ret); 582dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann return -ENOSYS; 592dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann } 602dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann 61b471f55427ee94d6de2b33b88a7409f8cbc6b5dcDavid Woodhouse syscall = spu_syscall_table[s->nr_ret]; 62b471f55427ee94d6de2b33b88a7409f8cbc6b5dcDavid Woodhouse 632dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann#ifdef DEBUG 642dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann print_symbol(KERN_DEBUG "SPU-syscall %s:", (unsigned long)syscall); 652dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann printk("syscall%ld(%lx, %lx, %lx, %lx, %lx, %lx)\n", 662dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann s->nr_ret, 672dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann s->parm[0], s->parm[1], s->parm[2], 682dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann s->parm[3], s->parm[4], s->parm[5]); 692dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann#endif 702dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann 712dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann return syscall(s->parm[0], s->parm[1], s->parm[2], 722dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann s->parm[3], s->parm[4], s->parm[5]); 732dd14934c9138c562d93c501e88c6d6f061eb8baArnd Bergmann} 742dd14934c9138c562d93c501e88c6d6f061eb8baArnd BergmannEXPORT_SYMBOL_GPL(spu_sys_callback); 75