um: switch stub_segv_handler to SA_SIGINFO variant, get rid of magic crap in there
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
Родитель
adcfb9852d
Коммит
9b25fcbdc6
|
@ -255,8 +255,8 @@ static int userspace_tramp(void *stack)
|
||||||
|
|
||||||
set_sigstack((void *) STUB_DATA, UM_KERN_PAGE_SIZE);
|
set_sigstack((void *) STUB_DATA, UM_KERN_PAGE_SIZE);
|
||||||
sigemptyset(&sa.sa_mask);
|
sigemptyset(&sa.sa_mask);
|
||||||
sa.sa_flags = SA_ONSTACK | SA_NODEFER;
|
sa.sa_flags = SA_ONSTACK | SA_NODEFER | SA_SIGINFO;
|
||||||
sa.sa_handler = (void *) v;
|
sa.sa_sigaction = (void *) v;
|
||||||
sa.sa_restorer = NULL;
|
sa.sa_restorer = NULL;
|
||||||
if (sigaction(SIGSEGV, &sa, NULL) < 0) {
|
if (sigaction(SIGSEGV, &sa, NULL) < 0) {
|
||||||
printk(UM_KERN_ERR "userspace_tramp - setting SIGSEGV "
|
printk(UM_KERN_ERR "userspace_tramp - setting SIGSEGV "
|
||||||
|
|
|
@ -10,7 +10,7 @@ endif
|
||||||
|
|
||||||
obj-y = bug.o bugs_$(BITS).o delay_$(BITS).o fault.o ksyms.o ldt.o \
|
obj-y = bug.o bugs_$(BITS).o delay_$(BITS).o fault.o ksyms.o ldt.o \
|
||||||
ptrace_$(BITS).o ptrace_user.o setjmp_$(BITS).o signal_$(BITS).o \
|
ptrace_$(BITS).o ptrace_user.o setjmp_$(BITS).o signal_$(BITS).o \
|
||||||
stub_$(BITS).o stub_segv_$(BITS).o syscalls_$(BITS).o \
|
stub_$(BITS).o stub_segv.o syscalls_$(BITS).o \
|
||||||
sys_call_table_$(BITS).o sysrq_$(BITS).o tls_$(BITS).o mem_$(BITS).o
|
sys_call_table_$(BITS).o sysrq_$(BITS).o tls_$(BITS).o mem_$(BITS).o
|
||||||
|
|
||||||
ifeq ($(CONFIG_X86_32),y)
|
ifeq ($(CONFIG_X86_32),y)
|
||||||
|
|
|
@ -1,5 +1,14 @@
|
||||||
|
#include <asm/unistd.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include "as-layout.h"
|
||||||
|
#include "stub-data.h"
|
||||||
|
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
#include "stub_32.h"
|
#include "stub_32.h"
|
||||||
#else
|
#else
|
||||||
#include "stub_64.h"
|
#include "stub_64.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern void stub_segv_handler(int, siginfo_t *, void *);
|
||||||
|
extern void stub_clone_handler(void);
|
||||||
|
|
|
@ -6,14 +6,7 @@
|
||||||
#ifndef __SYSDEP_STUB_H
|
#ifndef __SYSDEP_STUB_H
|
||||||
#define __SYSDEP_STUB_H
|
#define __SYSDEP_STUB_H
|
||||||
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/unistd.h>
|
|
||||||
#include "as-layout.h"
|
|
||||||
#include "stub-data.h"
|
|
||||||
|
|
||||||
extern void stub_segv_handler(int sig);
|
|
||||||
extern void stub_clone_handler(void);
|
|
||||||
|
|
||||||
#define STUB_SYSCALL_RET EAX
|
#define STUB_SYSCALL_RET EAX
|
||||||
#define STUB_MMAP_NR __NR_mmap2
|
#define STUB_MMAP_NR __NR_mmap2
|
||||||
|
|
|
@ -6,14 +6,7 @@
|
||||||
#ifndef __SYSDEP_STUB_H
|
#ifndef __SYSDEP_STUB_H
|
||||||
#define __SYSDEP_STUB_H
|
#define __SYSDEP_STUB_H
|
||||||
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <asm/unistd.h>
|
|
||||||
#include <sysdep/ptrace_user.h>
|
#include <sysdep/ptrace_user.h>
|
||||||
#include "as-layout.h"
|
|
||||||
#include "stub-data.h"
|
|
||||||
|
|
||||||
extern void stub_segv_handler(int sig);
|
|
||||||
extern void stub_clone_handler(void);
|
|
||||||
|
|
||||||
#define STUB_SYSCALL_RET PT_INDEX(RAX)
|
#define STUB_SYSCALL_RET PT_INDEX(RAX)
|
||||||
#define STUB_MMAP_NR __NR_mmap
|
#define STUB_MMAP_NR __NR_mmap
|
||||||
|
|
|
@ -3,18 +3,15 @@
|
||||||
* Licensed under the GPL
|
* Licensed under the GPL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <signal.h>
|
|
||||||
#include "as-layout.h"
|
|
||||||
#include "sysdep/stub.h"
|
#include "sysdep/stub.h"
|
||||||
#include "sysdep/faultinfo.h"
|
#include "sysdep/faultinfo.h"
|
||||||
#include "sysdep/sigcontext.h"
|
#include "sysdep/sigcontext.h"
|
||||||
|
|
||||||
void __attribute__ ((__section__ (".__syscall_stub")))
|
void __attribute__ ((__section__ (".__syscall_stub")))
|
||||||
stub_segv_handler(int sig)
|
stub_segv_handler(int sig, siginfo_t *info, void *p)
|
||||||
{
|
{
|
||||||
struct ucontext *uc;
|
struct ucontext *uc = p;
|
||||||
|
|
||||||
__asm__ __volatile__("movq %%rdx, %0" : "=g" (uc) :);
|
|
||||||
GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA),
|
GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA),
|
||||||
&uc->uc_mcontext);
|
&uc->uc_mcontext);
|
||||||
trap_myself();
|
trap_myself();
|
|
@ -1,17 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
|
||||||
* Licensed under the GPL
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "sysdep/stub.h"
|
|
||||||
#include "sysdep/sigcontext.h"
|
|
||||||
|
|
||||||
void __attribute__ ((__section__ (".__syscall_stub")))
|
|
||||||
stub_segv_handler(int sig)
|
|
||||||
{
|
|
||||||
struct sigcontext *sc = (struct sigcontext *) (&sig + 1);
|
|
||||||
|
|
||||||
GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA), sc);
|
|
||||||
|
|
||||||
trap_myself();
|
|
||||||
}
|
|
Загрузка…
Ссылка в новой задаче