Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 83189
b: refs/heads/master
c: ee3d9bd
h: refs/heads/master
i:
  83187: d569bab
v: v3
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed Feb 5, 2008
1 parent c512406 commit 4670700
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 59 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ca77b555c0aafa3070fbb67592abaaa1b8d31913
refs/heads/master: ee3d9bd4de1ed93d2a7ee41c331ed30a1c7b8acd
11 changes: 4 additions & 7 deletions trunk/arch/um/os-Linux/skas/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ static int ptrace_dump_regs(int pid)
* Signals that are OK to receive in the stub - we'll just continue it.
* SIGWINCH will happen when UML is inside a detached screen.
*/
#define STUB_SIG_MASK ((1 << SIGVTALRM) | (1 << SIGWINCH))
#define STUB_SIG_MASK (1 << SIGVTALRM)

/* Signals that the stub will finish with - anything else is an error */
#define STUB_DONE_MASK ((1 << SIGUSR1) | (1 << SIGTRAP))
#define STUB_DONE_MASK (1 << SIGTRAP)

void wait_stub_done(int pid)
{
Expand Down Expand Up @@ -179,6 +179,7 @@ static int userspace_tramp(void *stack)
ptrace(PTRACE_TRACEME, 0, 0, 0);

signal(SIGTERM, SIG_DFL);
signal(SIGWINCH, SIG_IGN);
err = set_interval();
if (err)
panic("userspace_tramp - setting timer failed, errno = %d\n",
Expand Down Expand Up @@ -222,11 +223,7 @@ static int userspace_tramp(void *stack)

set_sigstack((void *) STUB_DATA, UM_KERN_PAGE_SIZE);
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGIO);
sigaddset(&sa.sa_mask, SIGWINCH);
sigaddset(&sa.sa_mask, SIGVTALRM);
sigaddset(&sa.sa_mask, SIGUSR1);
sa.sa_flags = SA_ONSTACK;
sa.sa_flags = SA_ONSTACK | SA_NODEFER;
sa.sa_handler = (void *) v;
sa.sa_restorer = NULL;
if (sigaction(SIGSEGV, &sa, NULL) < 0)
Expand Down
19 changes: 2 additions & 17 deletions trunk/arch/um/sys-i386/stub_segv.c
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();
}
39 changes: 5 additions & 34 deletions trunk/arch/um/sys-x86_64/stub_segv.c
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();
}

0 comments on commit 4670700

Please sign in to comment.