aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/sys-i386/stub_segv.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/sys-i386/stub_segv.c')
-rw-r--r--arch/um/sys-i386/stub_segv.c19
1 files changed, 2 insertions, 17 deletions
diff --git a/arch/um/sys-i386/stub_segv.c b/arch/um/sys-i386/stub_segv.c
index b3999cb76bfd..28ccf737a79f 100644
--- a/arch/um/sys-i386/stub_segv.c
+++ b/arch/um/sys-i386/stub_segv.c
@@ -1,32 +1,17 @@
1/* 1/*
2 * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) 2 * Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3 * Licensed under the GPL 3 * Licensed under the GPL
4 */ 4 */
5 5
6#include <signal.h>
7#include <sys/select.h> /* The only way I can see to get sigset_t */
8#include <asm/unistd.h>
9#include "as-layout.h"
10#include "uml-config.h"
11#include "sysdep/stub.h" 6#include "sysdep/stub.h"
12#include "sysdep/sigcontext.h" 7#include "sysdep/sigcontext.h"
13#include "sysdep/faultinfo.h"
14 8
15void __attribute__ ((__section__ (".__syscall_stub"))) 9void __attribute__ ((__section__ (".__syscall_stub")))
16stub_segv_handler(int sig) 10stub_segv_handler(int sig)
17{ 11{
18 struct sigcontext *sc = (struct sigcontext *) (&sig + 1); 12 struct sigcontext *sc = (struct sigcontext *) (&sig + 1);
19 int pid;
20 13
21 GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA), sc); 14 GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA), sc);
22 15
23 pid = stub_syscall0(__NR_getpid); 16 trap_myself();
24 stub_syscall2(__NR_kill, pid, SIGUSR1);
25
26 /* Load pointer to sigcontext into esp, since we need to leave
27 * the stack in its original form when we do the sigreturn here, by
28 * hand.
29 */
30 __asm__ __volatile__("mov %0,%%esp ; movl %1, %%eax ; "
31 "int $0x80" : : "a" (sc), "g" (__NR_sigreturn));
32} 17}