aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ppc64/kernel/syscalls.c
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2005-06-08 07:59:15 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-08 19:24:15 -0400
commitce10d979053379553757c3b178a138facaddff82 (patch)
treece88ba988eebab6cafb1ed34feedbcb13aa926e3 /arch/ppc64/kernel/syscalls.c
parentfee02f80e68abbcc45ed3c5dd5ed09d04a284791 (diff)
[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 f2865ff8d2f..a8cbb202b8c 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
202static int __init set_fakeppc(char *str) 202long 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
211asmlinkage int sys_uname(struct old_utsname __user * name) 215long 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