Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.18 73 lines 1.8 kB view raw
1/* 2 * Copyright (C) 2002 - 2003 Jeff Dike (jdike@addtoit.com) 3 * Licensed under the GPL 4 */ 5 6#include <signal.h> 7#include <errno.h> 8#include "user_util.h" 9#include "kern_util.h" 10#include "task.h" 11#include "sigcontext.h" 12#include "skas.h" 13#include "ptrace_user.h" 14#include "sysdep/ptrace.h" 15#include "sysdep/ptrace_user.h" 16#include "os.h" 17 18void sig_handler_common_skas(int sig, void *sc_ptr) 19{ 20 struct sigcontext *sc = sc_ptr; 21 struct skas_regs *r; 22 void (*handler)(int, union uml_pt_regs *); 23 int save_errno = errno; 24 int save_user; 25 26 /* This is done because to allow SIGSEGV to be delivered inside a SEGV 27 * handler. This can happen in copy_user, and if SEGV is disabled, 28 * the process will die. 29 * XXX Figure out why this is better than SA_NODEFER 30 */ 31 if(sig == SIGSEGV) 32 change_sig(SIGSEGV, 1); 33 34 r = &TASK_REGS(get_current())->skas; 35 save_user = r->is_user; 36 r->is_user = 0; 37 if ( sig == SIGFPE || sig == SIGSEGV || 38 sig == SIGBUS || sig == SIGILL || 39 sig == SIGTRAP ) { 40 GET_FAULTINFO_FROM_SC(r->faultinfo, sc); 41 } 42 43 change_sig(SIGUSR1, 1); 44 45 handler = sig_info[sig]; 46 47 /* unblock SIGALRM, SIGVTALRM, SIGIO if sig isn't IRQ signal */ 48 if (sig != SIGIO && sig != SIGWINCH && 49 sig != SIGVTALRM && sig != SIGALRM) 50 unblock_signals(); 51 52 handler(sig, (union uml_pt_regs *) r); 53 54 errno = save_errno; 55 r->is_user = save_user; 56} 57 58extern int ptrace_faultinfo; 59 60void user_signal(int sig, union uml_pt_regs *regs, int pid) 61{ 62 void (*handler)(int, union uml_pt_regs *); 63 int segv = ((sig == SIGFPE) || (sig == SIGSEGV) || (sig == SIGBUS) || 64 (sig == SIGILL) || (sig == SIGTRAP)); 65 66 if (segv) 67 get_skas_faultinfo(pid, &regs->skas.faultinfo); 68 69 handler = sig_info[sig]; 70 handler(sig, (union uml_pt_regs *) regs); 71 72 unblock_signals(); 73}