From: Martin Schwidefsky On Wed, 2006-08-30 at 14:43 +0200, Arnd Bergmann wrote: > This adds the new kernel_execve function on all architectures > that were using _syscall3() to implement execve. Doesn't compile for s390. Patch attached, issues fixed: 1) Include unistd.h for __NR_execve 2) The compiler warns about __arg2 and __arg3 assignments (watch out for the *const* - isn't C a lovely language ;-) 3) The inline assembly does not clobber register "1", nor the condition code. The call to kernel_execve does clobber both so it is not really a problem, but nit-picking is fun >:-) Cc: Arnd Bergmann Cc: Andi Kleen Cc: Paul Mackerras Cc: Benjamin Herrenschmidt Cc: Richard Henderson Cc: Ivan Kokshaysky Cc: Russell King Cc: Ian Molton Cc: Mikael Starvik Cc: David Howells Cc: Yoshinori Sato Cc: Hirokazu Takata Cc: Ralf Baechle Cc: Kyle McMartin Cc: Heiko Carstens Cc: Martin Schwidefsky Cc: Paul Mundt Cc: Kazumoto Kojima Cc: Richard Curnow Cc: William Lee Irwin III Cc: "David S. Miller" Cc: Jeff Dike Cc: Paolo 'Blaisorblade' Giarrusso Cc: Miles Bader Cc: Chris Zankel Cc: "Luck, Tony" Cc: Geert Uytterhoeven Cc: Roman Zippel Signed-off-by: Andrew Morton --- arch/s390/kernel/sys_s390.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff -puN arch/s390/kernel/sys_s390.c~provide-kernel_execve-on-all-architectures-fix arch/s390/kernel/sys_s390.c --- a/arch/s390/kernel/sys_s390.c~provide-kernel_execve-on-all-architectures-fix +++ a/arch/s390/kernel/sys_s390.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -273,14 +274,15 @@ s390_fadvise64_64(struct fadvise64_64_ar int kernel_execve(const char *filename, char *const argv[], char *const envp[]) { register const char *__arg1 asm("2") = filename; - register void *__arg2 asm("3") = argv; - register void *__arg3 asm("4") = envp; + register char *const*__arg2 asm("3") = argv; + register char *const*__arg3 asm("4") = envp; register long __svcres asm("2"); - asm volatile ("svc %b1" + asm volatile( + "svc %b1" : "=d" (__svcres) : "i" (__NR_execve), "0" (__arg1), "d" (__arg2), - "d" (__arg3) : "1", "cc", "memory"); + "d" (__arg3) : "memory"); return __svcres; } _