aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/sys-x86_64
diff options
context:
space:
mode:
authorJeff Dike <jdike@addtoit.com>2005-11-22 00:32:09 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-22 12:13:41 -0500
commit17d469715c6453e4994e6617e8f644bf10f38584 (patch)
tree0bfc17100309b888315c3cae02adfd1783c04774 /arch/um/sys-x86_64
parente23181deec0d2a8be576faf9d71211abb84d5ccc (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/Makefile2
-rw-r--r--arch/um/sys-x86_64/stub_segv.c20
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 \
12obj-y := ksyms.o 12obj-y := ksyms.o
13obj-$(CONFIG_MODULES) += module.o um_module.o 13obj-$(CONFIG_MODULES) += module.o um_module.o
14 14
15USER_OBJS := ptrace_user.o sigcontext.o 15USER_OBJS := ptrace_user.o sigcontext.o stub_segv.o
16 16
17SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c ldt.c memcpy.S \ 17SYMLINKS = 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")))
31stub_segv_handler(int sig) 31stub_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}