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/sys-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/sys-x86_64')
-rw-r--r-- | arch/um/sys-x86_64/Makefile | 2 | ||||
-rw-r--r-- | arch/um/sys-x86_64/stub_segv.c | 20 |
2 files changed, 11 insertions, 11 deletions
diff --git a/arch/um/sys-x86_64/Makefile b/arch/um/sys-x86_64/Makefile index ea977df395a1..00b2025427df 100644 --- a/arch/um/sys-x86_64/Makefile +++ b/arch/um/sys-x86_64/Makefile | |||
@@ -12,7 +12,7 @@ lib-y = bitops.o bugs.o csum-partial.o delay.o fault.o ldt.o mem.o memcpy.o \ | |||
12 | obj-y := ksyms.o | 12 | obj-y := ksyms.o |
13 | obj-$(CONFIG_MODULES) += module.o um_module.o | 13 | obj-$(CONFIG_MODULES) += module.o um_module.o |
14 | 14 | ||
15 | USER_OBJS := ptrace_user.o sigcontext.o | 15 | USER_OBJS := ptrace_user.o sigcontext.o stub_segv.o |
16 | 16 | ||
17 | SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c ldt.c memcpy.S \ | 17 | SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c ldt.c memcpy.S \ |
18 | thunk.S module.c | 18 | thunk.S module.c |
diff --git a/arch/um/sys-x86_64/stub_segv.c b/arch/um/sys-x86_64/stub_segv.c index d1e53bdf2e85..a27099533198 100644 --- a/arch/um/sys-x86_64/stub_segv.c +++ b/arch/um/sys-x86_64/stub_segv.c | |||
@@ -3,14 +3,14 @@ | |||
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <asm/signal.h> | 6 | #include <stddef.h> |
7 | #include <signal.h> | ||
7 | #include <linux/compiler.h> | 8 | #include <linux/compiler.h> |
8 | #include <asm/unistd.h> | 9 | #include <asm/unistd.h> |
9 | #include <asm/ucontext.h> | ||
10 | #include "uml-config.h" | 10 | #include "uml-config.h" |
11 | #include "sysdep/sigcontext.h" | 11 | #include "sysdep/sigcontext.h" |
12 | #include "sysdep/faultinfo.h" | 12 | #include "sysdep/faultinfo.h" |
13 | #include <stddef.h> | 13 | #include "sysdep/stub.h" |
14 | 14 | ||
15 | /* Copied from sys-x86_64/signal.c - Can't find an equivalent definition | 15 | /* Copied from sys-x86_64/signal.c - Can't find an equivalent definition |
16 | * in the libc headers anywhere. | 16 | * in the libc headers anywhere. |
@@ -31,21 +31,21 @@ void __attribute__ ((__section__ (".__syscall_stub"))) | |||
31 | stub_segv_handler(int sig) | 31 | stub_segv_handler(int sig) |
32 | { | 32 | { |
33 | struct ucontext *uc; | 33 | struct ucontext *uc; |
34 | int pid; | ||
34 | 35 | ||
35 | __asm__("movq %%rdx, %0" : "=g" (uc) :); | 36 | __asm__("movq %%rdx, %0" : "=g" (uc) :); |
36 | GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA), | 37 | GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA), |
37 | &uc->uc_mcontext); | 38 | &uc->uc_mcontext); |
38 | 39 | ||
39 | __asm__("movq %0, %%rax ; syscall": : "g" (__NR_getpid)); | 40 | pid = stub_syscall0(__NR_getpid); |
40 | __asm__("movq %%rax, %%rdi ; movq %0, %%rax ; movq %1, %%rsi ;" | 41 | stub_syscall2(__NR_kill, pid, SIGUSR1); |
41 | "syscall": : "g" (__NR_kill), "g" (SIGUSR1) : | 42 | |
42 | "%rdi", "%rax", "%rsi"); | ||
43 | /* sys_sigreturn expects that the stack pointer will be 8 bytes into | 43 | /* sys_sigreturn expects that the stack pointer will be 8 bytes into |
44 | * the signal frame. So, we use the ucontext pointer, which we know | 44 | * the signal frame. So, we use the ucontext pointer, which we know |
45 | * already, to get the signal frame pointer, and add 8 to that. | 45 | * already, to get the signal frame pointer, and add 8 to that. |
46 | */ | 46 | */ |
47 | __asm__("movq %0, %%rsp": : | 47 | __asm__("movq %0, %%rsp; movq %1, %%rax ; syscall": : |
48 | "g" ((unsigned long) container_of(uc, struct rt_sigframe, | 48 | "g" ((unsigned long) container_of(uc, struct rt_sigframe, |
49 | uc) + 8)); | 49 | uc) + 8), |
50 | __asm__("movq %0, %%rax ; syscall" : : "g" (__NR_rt_sigreturn)); | 50 | "g" (__NR_rt_sigreturn)); |
51 | } | 51 | } |