-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Jeff Dike
authored and
Linus Torvalds
committed
Feb 5, 2008
1 parent
c512406
commit 4670700
Showing
4 changed files
with
12 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: ca77b555c0aafa3070fbb67592abaaa1b8d31913 | ||
refs/heads/master: ee3d9bd4de1ed93d2a7ee41c331ed30a1c7b8acd |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,17 @@ | ||
/* | ||
* Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) | ||
* Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) | ||
* Licensed under the GPL | ||
*/ | ||
|
||
#include <signal.h> | ||
#include <sys/select.h> /* The only way I can see to get sigset_t */ | ||
#include <asm/unistd.h> | ||
#include "as-layout.h" | ||
#include "uml-config.h" | ||
#include "sysdep/stub.h" | ||
#include "sysdep/sigcontext.h" | ||
#include "sysdep/faultinfo.h" | ||
|
||
void __attribute__ ((__section__ (".__syscall_stub"))) | ||
stub_segv_handler(int sig) | ||
{ | ||
struct sigcontext *sc = (struct sigcontext *) (&sig + 1); | ||
int pid; | ||
|
||
GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA), sc); | ||
|
||
pid = stub_syscall0(__NR_getpid); | ||
stub_syscall2(__NR_kill, pid, SIGUSR1); | ||
|
||
/* Load pointer to sigcontext into esp, since we need to leave | ||
* the stack in its original form when we do the sigreturn here, by | ||
* hand. | ||
*/ | ||
__asm__ __volatile__("mov %0,%%esp ; movl %1, %%eax ; " | ||
"int $0x80" : : "a" (sc), "g" (__NR_sigreturn)); | ||
trap_myself(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,51 +1,22 @@ | ||
/* | ||
* Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) | ||
* Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) | ||
* Licensed under the GPL | ||
*/ | ||
|
||
#include <stddef.h> | ||
#include <signal.h> | ||
#include <asm/unistd.h> | ||
#include "as-layout.h" | ||
#include "uml-config.h" | ||
#include "sysdep/sigcontext.h" | ||
#include "sysdep/faultinfo.h" | ||
#include "sysdep/stub.h" | ||
|
||
/* Copied from sys-x86_64/signal.c - Can't find an equivalent definition | ||
* in the libc headers anywhere. | ||
*/ | ||
struct rt_sigframe | ||
{ | ||
char *pretcode; | ||
struct ucontext uc; | ||
struct siginfo info; | ||
}; | ||
|
||
/* Copied here from <linux/kernel.h> - we're userspace. */ | ||
#define container_of(ptr, type, member) ({ \ | ||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \ | ||
(type *)( (char *)__mptr - offsetof(type,member) );}) | ||
#include "sysdep/faultinfo.h" | ||
#include "sysdep/sigcontext.h" | ||
|
||
void __attribute__ ((__section__ (".__syscall_stub"))) | ||
stub_segv_handler(int sig) | ||
{ | ||
struct ucontext *uc; | ||
int pid; | ||
|
||
__asm__ __volatile__("movq %%rdx, %0" : "=g" (uc) :); | ||
GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA), | ||
&uc->uc_mcontext); | ||
|
||
pid = stub_syscall0(__NR_getpid); | ||
stub_syscall2(__NR_kill, pid, SIGUSR1); | ||
|
||
/* sys_sigreturn expects that the stack pointer will be 8 bytes into | ||
* the signal frame. So, we use the ucontext pointer, which we know | ||
* already, to get the signal frame pointer, and add 8 to that. | ||
*/ | ||
__asm__ __volatile__("movq %0, %%rsp; movq %1, %%rax ; syscall": : | ||
"g" ((unsigned long) | ||
container_of(uc, struct rt_sigframe, uc) + 8), | ||
"g" (__NR_rt_sigreturn)); | ||
trap_myself(); | ||
} | ||
|