diff options
Diffstat (limited to 'arch/mips')
| -rw-r--r-- | arch/mips/kernel/sysirix.c | 60 |
1 files changed, 27 insertions, 33 deletions
diff --git a/arch/mips/kernel/sysirix.c b/arch/mips/kernel/sysirix.c index 7ae4af476974..ed7c0e3c2f85 100644 --- a/arch/mips/kernel/sysirix.c +++ b/arch/mips/kernel/sysirix.c | |||
| @@ -73,32 +73,30 @@ asmlinkage int irix_sysmp(struct pt_regs *regs) | |||
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | /* The prctl commands. */ | 75 | /* The prctl commands. */ |
| 76 | #define PR_MAXPROCS 1 /* Tasks/user. */ | 76 | #define PR_MAXPROCS 1 /* Tasks/user. */ |
| 77 | #define PR_ISBLOCKED 2 /* If blocked, return 1. */ | 77 | #define PR_ISBLOCKED 2 /* If blocked, return 1. */ |
| 78 | #define PR_SETSTACKSIZE 3 /* Set largest task stack size. */ | 78 | #define PR_SETSTACKSIZE 3 /* Set largest task stack size. */ |
| 79 | #define PR_GETSTACKSIZE 4 /* Get largest task stack size. */ | 79 | #define PR_GETSTACKSIZE 4 /* Get largest task stack size. */ |
| 80 | #define PR_MAXPPROCS 5 /* Num parallel tasks. */ | 80 | #define PR_MAXPPROCS 5 /* Num parallel tasks. */ |
| 81 | #define PR_UNBLKONEXEC 6 /* When task exec/exit's, unblock. */ | 81 | #define PR_UNBLKONEXEC 6 /* When task exec/exit's, unblock. */ |
| 82 | #define PR_SETEXITSIG 8 /* When task exit's, set signal. */ | 82 | #define PR_SETEXITSIG 8 /* When task exit's, set signal. */ |
| 83 | #define PR_RESIDENT 9 /* Make task unswappable. */ | 83 | #define PR_RESIDENT 9 /* Make task unswappable. */ |
| 84 | #define PR_ATTACHADDR 10 /* (Re-)Connect a vma to a task. */ | 84 | #define PR_ATTACHADDR 10 /* (Re-)Connect a vma to a task. */ |
| 85 | #define PR_DETACHADDR 11 /* Disconnect a vma from a task. */ | 85 | #define PR_DETACHADDR 11 /* Disconnect a vma from a task. */ |
| 86 | #define PR_TERMCHILD 12 /* When parent sleeps with fishes, kill child. */ | 86 | #define PR_TERMCHILD 12 /* Kill child if the parent dies. */ |
| 87 | #define PR_GETSHMASK 13 /* Get the sproc() share mask. */ | 87 | #define PR_GETSHMASK 13 /* Get the sproc() share mask. */ |
| 88 | #define PR_GETNSHARE 14 /* Number of share group members. */ | 88 | #define PR_GETNSHARE 14 /* Number of share group members. */ |
| 89 | #define PR_COREPID 15 /* Add task pid to name when it core. */ | 89 | #define PR_COREPID 15 /* Add task pid to name when it core. */ |
| 90 | #define PR_ATTACHADDRPERM 16 /* (Re-)Connect vma, with specified prot. */ | 90 | #define PR_ATTACHADDRPERM 16 /* (Re-)Connect vma, with specified prot. */ |
| 91 | #define PR_PTHREADEXIT 17 /* Kill a pthread without prejudice. */ | 91 | #define PR_PTHREADEXIT 17 /* Kill a pthread, only for IRIX 6.[234] */ |
| 92 | 92 | ||
| 93 | asmlinkage int irix_prctl(struct pt_regs *regs) | 93 | asmlinkage int irix_prctl(unsigned option, ...) |
| 94 | { | 94 | { |
| 95 | unsigned long cmd; | 95 | va_list args; |
| 96 | int error = 0, base = 0; | 96 | int error = 0; |
| 97 | 97 | ||
| 98 | if (regs->regs[2] == 1000) | 98 | va_start(args, option); |
| 99 | base = 1; | 99 | switch (option) { |
| 100 | cmd = regs->regs[base + 4]; | ||
| 101 | switch (cmd) { | ||
| 102 | case PR_MAXPROCS: | 100 | case PR_MAXPROCS: |
| 103 | printk("irix_prctl[%s:%d]: Wants PR_MAXPROCS\n", | 101 | printk("irix_prctl[%s:%d]: Wants PR_MAXPROCS\n", |
| 104 | current->comm, current->pid); | 102 | current->comm, current->pid); |
| @@ -111,7 +109,7 @@ asmlinkage int irix_prctl(struct pt_regs *regs) | |||
| 111 | printk("irix_prctl[%s:%d]: Wants PR_ISBLOCKED\n", | 109 | printk("irix_prctl[%s:%d]: Wants PR_ISBLOCKED\n", |
| 112 | current->comm, current->pid); | 110 | current->comm, current->pid); |
| 113 | read_lock(&tasklist_lock); | 111 | read_lock(&tasklist_lock); |
| 114 | task = find_task_by_pid(regs->regs[base + 5]); | 112 | task = find_task_by_pid(va_arg(args, pid_t)); |
| 115 | error = -ESRCH; | 113 | error = -ESRCH; |
| 116 | if (error) | 114 | if (error) |
| 117 | error = (task->run_list.next != NULL); | 115 | error = (task->run_list.next != NULL); |
| @@ -121,7 +119,7 @@ asmlinkage int irix_prctl(struct pt_regs *regs) | |||
| 121 | } | 119 | } |
| 122 | 120 | ||
| 123 | case PR_SETSTACKSIZE: { | 121 | case PR_SETSTACKSIZE: { |
| 124 | long value = regs->regs[base + 5]; | 122 | long value = va_arg(args, long); |
| 125 | 123 | ||
| 126 | printk("irix_prctl[%s:%d]: Wants PR_SETSTACKSIZE<%08lx>\n", | 124 | printk("irix_prctl[%s:%d]: Wants PR_SETSTACKSIZE<%08lx>\n", |
| 127 | current->comm, current->pid, (unsigned long) value); | 125 | current->comm, current->pid, (unsigned long) value); |
| @@ -222,17 +220,13 @@ asmlinkage int irix_prctl(struct pt_regs *regs) | |||
| 222 | error = -EINVAL; | 220 | error = -EINVAL; |
| 223 | break; | 221 | break; |
| 224 | 222 | ||
| 225 | case PR_PTHREADEXIT: | ||
| 226 | printk("irix_prctl[%s:%d]: Wants PR_PTHREADEXIT\n", | ||
| 227 | current->comm, current->pid); | ||
| 228 | do_exit(regs->regs[base + 5]); | ||
| 229 | |||
| 230 | default: | 223 | default: |
| 231 | printk("irix_prctl[%s:%d]: Non-existant opcode %d\n", | 224 | printk("irix_prctl[%s:%d]: Non-existant opcode %d\n", |
| 232 | current->comm, current->pid, (int)cmd); | 225 | current->comm, current->pid, option); |
| 233 | error = -EINVAL; | 226 | error = -EINVAL; |
| 234 | break; | 227 | break; |
| 235 | } | 228 | } |
| 229 | va_end(args); | ||
| 236 | 230 | ||
| 237 | return error; | 231 | return error; |
| 238 | } | 232 | } |
