Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) |
| 3 | * Licensed under the GPL |
| 4 | */ |
| 5 | |
Jeff Dike | 17d4697 | 2005-11-21 21:32:09 -0800 | [diff] [blame] | 6 | #include <signal.h> |
| 7 | #include <sys/select.h> /* The only way I can see to get sigset_t */ |
Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 8 | #include <asm/unistd.h> |
| 9 | #include "uml-config.h" |
Jeff Dike | 17d4697 | 2005-11-21 21:32:09 -0800 | [diff] [blame] | 10 | #include "sysdep/stub.h" |
Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 11 | #include "sysdep/sigcontext.h" |
| 12 | #include "sysdep/faultinfo.h" |
| 13 | |
| 14 | void __attribute__ ((__section__ (".__syscall_stub"))) |
| 15 | stub_segv_handler(int sig) |
| 16 | { |
| 17 | struct sigcontext *sc = (struct sigcontext *) (&sig + 1); |
Jeff Dike | 17d4697 | 2005-11-21 21:32:09 -0800 | [diff] [blame] | 18 | int pid; |
Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 19 | |
| 20 | GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA), |
| 21 | sc); |
| 22 | |
Jeff Dike | 17d4697 | 2005-11-21 21:32:09 -0800 | [diff] [blame] | 23 | pid = stub_syscall0(__NR_getpid); |
| 24 | stub_syscall2(__NR_kill, pid, SIGUSR1); |
| 25 | |
Bodo Stroesser | 9057e9d | 2005-07-28 21:16:06 -0700 | [diff] [blame] | 26 | /* Load pointer to sigcontext into esp, since we need to leave |
Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 27 | * the stack in its original form when we do the sigreturn here, by |
| 28 | * hand. |
| 29 | */ |
Jeff Dike | fb30d64 | 2006-04-18 22:21:44 -0700 | [diff] [blame] | 30 | __asm__ __volatile__("mov %0,%%esp ; movl %1, %%eax ; " |
| 31 | "int $0x80" : : "a" (sc), "g" (__NR_sigreturn)); |
Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 32 | } |