diff options
author | Jeff Dike <jdike@addtoit.com> | 2005-11-22 00:32:09 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-22 12:13:41 -0500 |
commit | 17d469715c6453e4994e6617e8f644bf10f38584 (patch) | |
tree | 0bfc17100309b888315c3cae02adfd1783c04774 /arch/um/include/sysdep-x86_64 | |
parent | e23181deec0d2a8be576faf9d71211abb84d5ccc (diff) |
[PATCH] uml: properly invoke x86_64 system calls
This patch makes stub_segv use the stub_syscall macros. This was needed
anyway, but the bug that prompted this was the discovery that gcc was storing
stuff in RCX, which is trashed across a system call. This is exactly the sort
of problem that the new macros fix.
There is a stub_syscall0 for getpid. stub_segv was changed to be a libc file,
and that caused some include changes.
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/um/include/sysdep-x86_64')
-rw-r--r-- | arch/um/include/sysdep-x86_64/stub.h | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/um/include/sysdep-x86_64/stub.h b/arch/um/include/sysdep-x86_64/stub.h index 2bd6e7a97286..c41689c13dc9 100644 --- a/arch/um/include/sysdep-x86_64/stub.h +++ b/arch/um/include/sysdep-x86_64/stub.h | |||
@@ -6,7 +6,6 @@ | |||
6 | #ifndef __SYSDEP_STUB_H | 6 | #ifndef __SYSDEP_STUB_H |
7 | #define __SYSDEP_STUB_H | 7 | #define __SYSDEP_STUB_H |
8 | 8 | ||
9 | #include <asm/ptrace.h> | ||
10 | #include <asm/unistd.h> | 9 | #include <asm/unistd.h> |
11 | #include <sysdep/ptrace_user.h> | 10 | #include <sysdep/ptrace_user.h> |
12 | 11 | ||
@@ -20,6 +19,17 @@ extern void stub_clone_handler(void); | |||
20 | #define __syscall_clobber "r11","rcx","memory" | 19 | #define __syscall_clobber "r11","rcx","memory" |
21 | #define __syscall "syscall" | 20 | #define __syscall "syscall" |
22 | 21 | ||
22 | static inline long stub_syscall0(long syscall) | ||
23 | { | ||
24 | long ret; | ||
25 | |||
26 | __asm__ volatile (__syscall | ||
27 | : "=a" (ret) | ||
28 | : "0" (syscall) : __syscall_clobber ); | ||
29 | |||
30 | return ret; | ||
31 | } | ||
32 | |||
23 | static inline long stub_syscall2(long syscall, long arg1, long arg2) | 33 | static inline long stub_syscall2(long syscall, long arg1, long arg2) |
24 | { | 34 | { |
25 | long ret; | 35 | long ret; |