diff options
Diffstat (limited to 'arch/ppc64/kernel/syscalls.c')
| -rw-r--r-- | arch/ppc64/kernel/syscalls.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/arch/ppc64/kernel/syscalls.c b/arch/ppc64/kernel/syscalls.c index f2865ff8d2f9..a8cbb202b8cd 100644 --- a/arch/ppc64/kernel/syscalls.c +++ b/arch/ppc64/kernel/syscalls.c | |||
| @@ -199,24 +199,33 @@ out: | |||
| 199 | return ret; | 199 | return ret; |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | static int __init set_fakeppc(char *str) | 202 | long ppc64_personality(unsigned long personality) |
| 203 | { | 203 | { |
| 204 | if (*str) | 204 | long ret; |
| 205 | return 0; | 205 | |
| 206 | init_task.personality = PER_LINUX32; | 206 | if (personality(current->personality) == PER_LINUX32 |
| 207 | return 1; | 207 | && personality == PER_LINUX) |
| 208 | personality = PER_LINUX32; | ||
| 209 | ret = sys_personality(personality); | ||
| 210 | if (ret == PER_LINUX32) | ||
| 211 | ret = PER_LINUX; | ||
| 212 | return ret; | ||
| 208 | } | 213 | } |
| 209 | __setup("fakeppc", set_fakeppc); | ||
| 210 | 214 | ||
| 211 | asmlinkage int sys_uname(struct old_utsname __user * name) | 215 | long ppc64_newuname(struct new_utsname __user * name) |
| 212 | { | 216 | { |
| 213 | int err = -EFAULT; | 217 | int err = 0; |
| 214 | 218 | ||
| 215 | down_read(&uts_sem); | 219 | down_read(&uts_sem); |
| 216 | if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) | 220 | if (copy_to_user(name, &system_utsname, sizeof(*name))) |
| 217 | err = 0; | 221 | err = -EFAULT; |
| 218 | up_read(&uts_sem); | 222 | up_read(&uts_sem); |
| 219 | 223 | if (!err && personality(current->personality) == PER_LINUX32) { | |
| 224 | /* change ppc64 to ppc */ | ||
| 225 | if (__put_user(0, name->machine + 3) | ||
| 226 | || __put_user(0, name->machine + 4)) | ||
| 227 | err = -EFAULT; | ||
| 228 | } | ||
| 220 | return err; | 229 | return err; |
| 221 | } | 230 | } |
| 222 | 231 | ||
