Commit 75a4958154f5d0028d5464f2479b4297d55cf4a3

Authored by Kyle McMartin
Committed by Matthew Wilcox
1 parent df570b9c28

[PARISC] Allow overriding personality with sys_personality

And now suddenly, linux32 works on parisc...

Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>

Showing 2 changed files with 47 additions and 2 deletions Side-by-side Diff

arch/parisc/kernel/sys_parisc.c
... ... @@ -31,6 +31,8 @@
31 31 #include <linux/shm.h>
32 32 #include <linux/smp_lock.h>
33 33 #include <linux/syscalls.h>
  34 +#include <linux/utsname.h>
  35 +#include <linux/personality.h>
34 36  
35 37 int sys_pipe(int __user *fildes)
36 38 {
... ... @@ -247,5 +249,48 @@
247 249 asmlinkage int sys_free_hugepages(unsigned long addr)
248 250 {
249 251 return -EINVAL;
  252 +}
  253 +
  254 +long parisc_personality(unsigned long personality)
  255 +{
  256 + long err;
  257 +
  258 + if (personality(current->personality) == PER_LINUX32
  259 + && personality == PER_LINUX)
  260 + personality = PER_LINUX32;
  261 +
  262 + err = sys_personality(personality);
  263 + if (err == PER_LINUX32)
  264 + err = PER_LINUX;
  265 +
  266 + return err;
  267 +}
  268 +
  269 +static inline int override_machine(char __user *mach) {
  270 +#ifdef CONFIG_COMPAT
  271 + if (personality(current->personality) == PER_LINUX32) {
  272 + if (__put_user(0, mach + 6) ||
  273 + __put_user(0, mach + 7))
  274 + return -EFAULT;
  275 + }
  276 +
  277 + return 0;
  278 +#else /*!CONFIG_COMPAT*/
  279 + return 0;
  280 +#endif /*CONFIG_COMPAT*/
  281 +}
  282 +
  283 +long parisc_newuname(struct new_utsname __user *utsname)
  284 +{
  285 + int err = 0;
  286 +
  287 + down_read(&uts_sem);
  288 + if (copy_to_user(utsname, &system_utsname, sizeof(*utsname)))
  289 + err = -EFAULT;
  290 + up_read(&uts_sem);
  291 +
  292 + err = override_machine(utsname->machine);
  293 +
  294 + return (long)err;
250 295 }
arch/parisc/kernel/syscall_table.S
... ... @@ -132,7 +132,7 @@
132 132 ENTRY_SAME(socketpair)
133 133 ENTRY_SAME(setpgid)
134 134 ENTRY_SAME(send)
135   - ENTRY_SAME(newuname)
  135 + ENTRY_OURS(newuname)
136 136 ENTRY_SAME(umask) /* 60 */
137 137 ENTRY_SAME(chroot)
138 138 ENTRY_SAME(ustat)
... ... @@ -221,7 +221,7 @@
221 221 ENTRY_SAME(fchdir)
222 222 ENTRY_SAME(bdflush)
223 223 ENTRY_SAME(sysfs) /* 135 */
224   - ENTRY_SAME(personality)
  224 + ENTRY_OURS(personality)
225 225 ENTRY_SAME(ni_syscall) /* for afs_syscall */
226 226 ENTRY_SAME(setfsuid)
227 227 ENTRY_SAME(setfsgid)