summaryrefslogtreecommitdiffstats
path: root/arch/ppc64/kernel/syscalls.c
diff options
context:
space:
mode:
authorPaul Mackerras2005-06-08 13:59:15 +0200
committerLinus Torvalds2005-06-09 01:24:15 +0200
commitce10d979053379553757c3b178a138facaddff82 (patch)
treece88ba988eebab6cafb1ed34feedbcb13aa926e3 /arch/ppc64/kernel/syscalls.c
parentMerge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/davem/tg3-2.6 (diff)
downloadkernel-qcow2-linux-ce10d979053379553757c3b178a138facaddff82.tar.gz
kernel-qcow2-linux-ce10d979053379553757c3b178a138facaddff82.tar.xz
kernel-qcow2-linux-ce10d979053379553757c3b178a138facaddff82.zip
[PATCH] ppc64: Fix PER_LINUX32 behaviour
This patch fixes some bugs in the ppc64 PER_LINUX32 implementation, noted by Juergen Kreileder: * uname(2) doesn't respect PER_LINUX32, it returns 'ppc64' instead of 'ppc' * Child processes of a PER_LINUX32 process don't inherit PER_LINUX32 Along the way I took the opportunity to move things around so that sys_ppc32.c only has 32-bit syscall emulation functions and to remove the obsolete "fakeppc" command line option. Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/ppc64/kernel/syscalls.c')
-rw-r--r--arch/ppc64/kernel/syscalls.c33
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:
return ret;
}
-static int __init set_fakeppc(char *str)
+long ppc64_personality(unsigned long personality)
{
- if (*str)
- return 0;
- init_task.personality = PER_LINUX32;
- return 1;
+ long ret;
+
+ if (personality(current->personality) == PER_LINUX32
+ && personality == PER_LINUX)
+ personality = PER_LINUX32;
+ ret = sys_personality(personality);
+ if (ret == PER_LINUX32)
+ ret = PER_LINUX;
+ return ret;
}
-__setup("fakeppc", set_fakeppc);
-asmlinkage int sys_uname(struct old_utsname __user * name)
+long ppc64_newuname(struct new_utsname __user * name)
{
- int err = -EFAULT;
-
+ int err = 0;
+
down_read(&uts_sem);
- if (name && !copy_to_user(name, &system_utsname, sizeof (*name)))
- err = 0;
+ if (copy_to_user(name, &system_utsname, sizeof(*name)))
+ err = -EFAULT;
up_read(&uts_sem);
-
+ if (!err && personality(current->personality) == PER_LINUX32) {
+ /* change ppc64 to ppc */
+ if (__put_user(0, name->machine + 3)
+ || __put_user(0, name->machine + 4))
+ err = -EFAULT;
+ }
return err;
}