diff options
Diffstat (limited to 'arch/mips')
-rw-r--r-- | arch/mips/kernel/linux32.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/signal_n32.c | 4 | ||||
-rw-r--r-- | arch/mips/kernel/syscall.c | 56 | ||||
-rw-r--r-- | arch/mips/kernel/sysirix.c | 12 | ||||
-rw-r--r-- | arch/mips/sgi-ip22/ip22-reset.c | 3 | ||||
-rw-r--r-- | arch/mips/sgi-ip32/ip32-reset.c | 2 |
6 files changed, 57 insertions, 22 deletions
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 43b1162d714f..52cada45b353 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
@@ -1039,7 +1039,7 @@ asmlinkage long sys32_newuname(struct new_utsname __user * name) | |||
1039 | int ret = 0; | 1039 | int ret = 0; |
1040 | 1040 | ||
1041 | down_read(&uts_sem); | 1041 | down_read(&uts_sem); |
1042 | if (copy_to_user(name,&system_utsname,sizeof *name)) | 1042 | if (copy_to_user(name, utsname(), sizeof *name)) |
1043 | ret = -EFAULT; | 1043 | ret = -EFAULT; |
1044 | up_read(&uts_sem); | 1044 | up_read(&uts_sem); |
1045 | 1045 | ||
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index 50c17eaa7f25..477c5334ec1b 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
@@ -42,8 +42,6 @@ | |||
42 | 42 | ||
43 | #include "signal-common.h" | 43 | #include "signal-common.h" |
44 | 44 | ||
45 | extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); | ||
46 | |||
47 | /* | 45 | /* |
48 | * Including <asm/unistd.h> would give use the 64-bit syscall numbers ... | 46 | * Including <asm/unistd.h> would give use the 64-bit syscall numbers ... |
49 | */ | 47 | */ |
@@ -83,6 +81,8 @@ struct rt_sigframe_n32 { | |||
83 | #endif | 81 | #endif |
84 | }; | 82 | }; |
85 | 83 | ||
84 | extern void sigset_from_compat (sigset_t *set, compat_sigset_t *compat); | ||
85 | |||
86 | save_static_function(sysn32_rt_sigsuspend); | 86 | save_static_function(sysn32_rt_sigsuspend); |
87 | __attribute_used__ noinline static int | 87 | __attribute_used__ noinline static int |
88 | _sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | 88 | _sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) |
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index 9951240cc3fd..26e1a7e78d13 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c | |||
@@ -231,7 +231,7 @@ out: | |||
231 | */ | 231 | */ |
232 | asmlinkage int sys_uname(struct old_utsname __user * name) | 232 | asmlinkage int sys_uname(struct old_utsname __user * name) |
233 | { | 233 | { |
234 | if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) | 234 | if (name && !copy_to_user(name, utsname(), sizeof (*name))) |
235 | return 0; | 235 | return 0; |
236 | return -EFAULT; | 236 | return -EFAULT; |
237 | } | 237 | } |
@@ -248,16 +248,21 @@ asmlinkage int sys_olduname(struct oldold_utsname __user * name) | |||
248 | if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname))) | 248 | if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname))) |
249 | return -EFAULT; | 249 | return -EFAULT; |
250 | 250 | ||
251 | error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); | 251 | error = __copy_to_user(&name->sysname, &utsname()->sysname, |
252 | error -= __put_user(0,name->sysname+__OLD_UTS_LEN); | 252 | __OLD_UTS_LEN); |
253 | error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); | 253 | error -= __put_user(0, name->sysname + __OLD_UTS_LEN); |
254 | error -= __put_user(0,name->nodename+__OLD_UTS_LEN); | 254 | error -= __copy_to_user(&name->nodename, &utsname()->nodename, |
255 | error -= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); | 255 | __OLD_UTS_LEN); |
256 | error -= __put_user(0,name->release+__OLD_UTS_LEN); | 256 | error -= __put_user(0, name->nodename + __OLD_UTS_LEN); |
257 | error -= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); | 257 | error -= __copy_to_user(&name->release, &utsname()->release, |
258 | error -= __put_user(0,name->version+__OLD_UTS_LEN); | 258 | __OLD_UTS_LEN); |
259 | error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); | 259 | error -= __put_user(0, name->release + __OLD_UTS_LEN); |
260 | error = __put_user(0,name->machine+__OLD_UTS_LEN); | 260 | error -= __copy_to_user(&name->version, &utsname()->version, |
261 | __OLD_UTS_LEN); | ||
262 | error -= __put_user(0, name->version + __OLD_UTS_LEN); | ||
263 | error -= __copy_to_user(&name->machine, &utsname()->machine, | ||
264 | __OLD_UTS_LEN); | ||
265 | error = __put_user(0, name->machine + __OLD_UTS_LEN); | ||
261 | error = error ? -EFAULT : 0; | 266 | error = error ? -EFAULT : 0; |
262 | 267 | ||
263 | return error; | 268 | return error; |
@@ -401,3 +406,32 @@ asmlinkage void bad_stack(void) | |||
401 | { | 406 | { |
402 | do_exit(SIGSEGV); | 407 | do_exit(SIGSEGV); |
403 | } | 408 | } |
409 | |||
410 | /* | ||
411 | * Do a system call from kernel instead of calling sys_execve so we | ||
412 | * end up with proper pt_regs. | ||
413 | */ | ||
414 | int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | ||
415 | { | ||
416 | register unsigned long __a0 asm("$4") = (unsigned long) filename; | ||
417 | register unsigned long __a1 asm("$5") = (unsigned long) argv; | ||
418 | register unsigned long __a2 asm("$6") = (unsigned long) envp; | ||
419 | register unsigned long __a3 asm("$7"); | ||
420 | unsigned long __v0; | ||
421 | |||
422 | __asm__ volatile (" \n" | ||
423 | " .set noreorder \n" | ||
424 | " li $2, %5 # __NR_execve \n" | ||
425 | " syscall \n" | ||
426 | " move %0, $2 \n" | ||
427 | " .set reorder \n" | ||
428 | : "=&r" (__v0), "=r" (__a3) | ||
429 | : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_execve) | ||
430 | : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", | ||
431 | "memory"); | ||
432 | |||
433 | if (__a3 == 0) | ||
434 | return __v0; | ||
435 | |||
436 | return -__v0; | ||
437 | } | ||
diff --git a/arch/mips/kernel/sysirix.c b/arch/mips/kernel/sysirix.c index 1137dd6ea7aa..11bb97174972 100644 --- a/arch/mips/kernel/sysirix.c +++ b/arch/mips/kernel/sysirix.c | |||
@@ -884,7 +884,7 @@ asmlinkage int irix_getdomainname(char __user *name, int len) | |||
884 | down_read(&uts_sem); | 884 | down_read(&uts_sem); |
885 | if (len > __NEW_UTS_LEN) | 885 | if (len > __NEW_UTS_LEN) |
886 | len = __NEW_UTS_LEN; | 886 | len = __NEW_UTS_LEN; |
887 | err = copy_to_user(name, system_utsname.domainname, len) ? -EFAULT : 0; | 887 | err = copy_to_user(name, utsname()->domainname, len) ? -EFAULT : 0; |
888 | up_read(&uts_sem); | 888 | up_read(&uts_sem); |
889 | 889 | ||
890 | return err; | 890 | return err; |
@@ -1127,11 +1127,11 @@ struct iuname { | |||
1127 | asmlinkage int irix_uname(struct iuname __user *buf) | 1127 | asmlinkage int irix_uname(struct iuname __user *buf) |
1128 | { | 1128 | { |
1129 | down_read(&uts_sem); | 1129 | down_read(&uts_sem); |
1130 | if (copy_from_user(system_utsname.sysname, buf->sysname, 65) | 1130 | if (copy_from_user(utsname()->sysname, buf->sysname, 65) |
1131 | || copy_from_user(system_utsname.nodename, buf->nodename, 65) | 1131 | || copy_from_user(utsname()->nodename, buf->nodename, 65) |
1132 | || copy_from_user(system_utsname.release, buf->release, 65) | 1132 | || copy_from_user(utsname()->release, buf->release, 65) |
1133 | || copy_from_user(system_utsname.version, buf->version, 65) | 1133 | || copy_from_user(utsname()->version, buf->version, 65) |
1134 | || copy_from_user(system_utsname.machine, buf->machine, 65)) { | 1134 | || copy_from_user(utsname()->machine, buf->machine, 65)) { |
1135 | return -EFAULT; | 1135 | return -EFAULT; |
1136 | } | 1136 | } |
1137 | up_read(&uts_sem); | 1137 | up_read(&uts_sem); |
diff --git a/arch/mips/sgi-ip22/ip22-reset.c b/arch/mips/sgi-ip22/ip22-reset.c index 8134220ed600..7a941ecff3bb 100644 --- a/arch/mips/sgi-ip22/ip22-reset.c +++ b/arch/mips/sgi-ip22/ip22-reset.c | |||
@@ -123,7 +123,8 @@ static inline void power_button(void) | |||
123 | if (machine_state & MACHINE_PANICED) | 123 | if (machine_state & MACHINE_PANICED) |
124 | return; | 124 | return; |
125 | 125 | ||
126 | if ((machine_state & MACHINE_SHUTTING_DOWN) || kill_proc(1,SIGINT,1)) { | 126 | if ((machine_state & MACHINE_SHUTTING_DOWN) || |
127 | kill_cad_pid(SIGINT, 1)) { | ||
127 | /* No init process or button pressed twice. */ | 128 | /* No init process or button pressed twice. */ |
128 | sgi_machine_power_off(); | 129 | sgi_machine_power_off(); |
129 | } | 130 | } |
diff --git a/arch/mips/sgi-ip32/ip32-reset.c b/arch/mips/sgi-ip32/ip32-reset.c index 79ddb4605659..fd0932b2d521 100644 --- a/arch/mips/sgi-ip32/ip32-reset.c +++ b/arch/mips/sgi-ip32/ip32-reset.c | |||
@@ -120,7 +120,7 @@ static inline void ip32_power_button(void) | |||
120 | if (has_panicked) | 120 | if (has_panicked) |
121 | return; | 121 | return; |
122 | 122 | ||
123 | if (shuting_down || kill_proc(1, SIGINT, 1)) { | 123 | if (shuting_down || kill_cad_pid(SIGINT, 1)) { |
124 | /* No init process or button pressed twice. */ | 124 | /* No init process or button pressed twice. */ |
125 | ip32_machine_power_off(); | 125 | ip32_machine_power_off(); |
126 | } | 126 | } |