Commit 75a4958154f5d0028d5464f2479b4297d55cf4a3
Committed by
Matthew Wilcox
1 parent
df570b9c28
Exists in
master
and in
7 other branches
[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) |