powerpc: Implement logging of unhandled signals
Subsystems (2)
PATCH 1/1 powerpc: Implement logging of unhandled signals
Implement exception-trace sysctl + support to print when a process is killed due to unhandled signals just as i386 and x86_64 does.
Just like on x86, it can be disabled by setting the sysctl variable debug.exception-trace, and the messages are rate limited to not create a DoS exposure.
arch/powerpc/kernel/traps.c +11 -1
@@ -172,11 +172,21 @@ int die(const char *str, struct pt_regsvoid _exception (int signr,struct pt_regs *regs,int code,unsigned long addr) {siginfo_t info; +char fmt32[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %08lx nip %08lx lr %08lx code %x\n" ; +char fmt64[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %016lx nip %016lx lr %016lx code %x\n" ;if (!user_mode (regs)) {if (die ("Exception in kernel mode" , regs, signr))return ; - } + }else if (show_unhandled_signals && +unhandled_signal (current, signr) && +printk_ratelimit ()) { +printk (regs->msr &MSR_SF ? fmt64 : fmt32, + current->comm, current->pid, signr, + addr, regs->nip, regs->link, code); + }memset (&info,0 ,sizeof (info)); info.si_signo = signr;
arch/powerpc/kernel/signal_64.c +15 -0
@@ -64,6 +64,11 @@ struct rt_sigframe {char abigap[288 ]; } __attribute__ ((aligned (16))); +static char fmt32[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %08lx nip %08lx lr %08lx\n" ; +static char fmt64[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %016lx nip %016lx lr %016lx\n" ; +/* * Set up the sigcontext for the signal frame. */
@@ -315,6 +320,11 @@ badframe:printk ("badframe in sys_rt_sigreturn, regs=%p uc=%p &uc->uc_mcontext=%p\n" , regs, uc, &uc->uc_mcontext);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (regs->msr &MSR_SF ? fmt64 : fmt32, + current->comm, current->pid,"rt_sigreturn" , + uc, regs->nip, regs->link); +force_sig (SIGSEGV , current);return 0 ; }
@@ -398,6 +408,11 @@ badframe:printk ("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n" , regs, frame, newsp);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (regs->msr &MSR_SF ? fmt64 : fmt32, + current->comm, current->pid,"setup_rt_frame" , + frame, regs->nip, regs->link); +force_sigsegv (signr, current);return 0 ; }
kernel/sysctl.c +1 -1
@@ -1221,7 +1221,7 @@ static ctl_table fs_table[] = { }; static ctl_table debug_table[] = { -#ifdef CONFIG_X86 +#if defined(CONFIG_X86) || defined(CONFIG_PPC) { .ctl_name = CTL_UNNUMBERED, .procname = "exception-trace",
arch/powerpc/kernel/signal_32.c +38 -0
@@ -705,11 +705,13 @@ int handle_rt_signal32(unsigned long sig {struct rt_sigframe __user *rt_sf;struct mcontext __user *frame; +void __user *addr;unsigned long newsp =0 ;/* Set up Signal Frame */ /* Put a Real Time Context onto stack */ rt_sf =get_sigframe (ka, regs,sizeof (*rt_sf)); + addr = rt_sf;if (unlikely (rt_sf ==NULL )) goto badframe;
@@ -728,6 +730,7 @@ int handle_rt_signal32(unsigned long sig/* Save user registers on the stack */ frame = &rt_sf->uc.uc_mcontext; + addr = frame;if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {if (save_user_regs (regs, frame,0 )) goto badframe;
@@ -742,6 +745,7 @@ int handle_rt_signal32(unsigned long sig/* create a stack frame for the caller of the handler */ newsp = ((unsigned long )rt_sf) - (__SIGNAL_FRAMESIZE +16 ); + addr = (void __user *)regs->gpr[1 ];if (put_user (regs->gpr[1 ], (u32 __user *)newsp)) goto badframe;
@@ -762,6 +766,12 @@ badframe:printk ("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n" , regs, frame, newsp);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in handle_rt_signal32: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + addr, regs->nip, regs->link); +force_sigsegv (sig, current);return 0 ; }
@@ -886,6 +896,12 @@ long sys_rt_sigreturn(int r3, int r4, inreturn 0 ; bad: +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in sys_rt_sigreturn: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + rt_sf, regs->nip, regs->link); +force_sig (SIGSEGV , current);return 0 ; }
@@ -967,6 +983,13 @@ int sys_debug_setcontext(struct ucontext* We kill the task with a SIGSEGV in this situation. */ if (do_setcontext (ctx, regs,1 )) { +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in " +"sys_debug_setcontext: %p nip %08lx " +"lr %08lx\n" , + current->comm, current->pid, + ctx, regs->nip, regs->link); +force_sig (SIGSEGV , current); goto out; }
@@ -1048,6 +1071,12 @@ badframe:printk ("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n" , regs, frame, newsp);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in handle_signal32: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + frame, regs->nip, regs->link); +force_sigsegv (sig, current);return 0 ; }
@@ -1061,12 +1090,14 @@ long sys_sigreturn(int r3, int r4, int rstruct sigcontext __user *sc;struct sigcontext sigctx;struct mcontext __user *sr; +void __user *addr;sigset_t set;/* Always make any pending restarted system calls return -EINTR */ current_thread_info ()->restart_block.fn = do_no_restart_syscall; sc = (struct sigcontext __user *)(regs->gpr[1 ] + __SIGNAL_FRAMESIZE); + addr = sc;if (copy_from_user (&sigctx, sc,sizeof (sigctx))) goto badframe;
@@ -1083,6 +1114,7 @@ long sys_sigreturn(int r3, int r4, int rrestore_sigmask (&set); sr = (struct mcontext __user *)from_user_ptr (sigctx.regs); + addr = sr;if (!access_ok (VERIFY_READ , sr,sizeof (*sr)) ||restore_user_regs (regs, sr,1 )) goto badframe;
@@ -1091,6 +1123,12 @@ long sys_sigreturn(int r3, int r4, int rreturn 0 ; badframe: +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in sys_sigreturn: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + addr, regs->nip, regs->link); +force_sig (SIGSEGV , current);return 0 ; }
arch/powerpc/kernel/signal.c +6 -0
@@ -16,6 +16,12 @@#include "signal.h" +/* Log an error when sending an unhandled signal to a process. Controlled +* through debug.exception-trace sysctl. +*/ + +int show_unhandled_signals =1 ; +/* * Allocate space for the signal frame */
Hi Olof,
arch/powerpc/kernel/traps.c int die(const char *str, struct pt_regs · line 178
Quoted 5 lines · On Mon, 1 Oct 2007 15:32:42 -0500 Olof Johansson <[email protected]> wrote:
arch/powerpc/kernel/traps.c +4
-0+char fmt32[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %08lx nip %08lx lr %08lx code %x\n" ; +char fmt64[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %016lx nip %016lx lr %016lx code %x\n" ;
const char ... ?
arch/powerpc/kernel/signal_64.c struct rt_sigframe { · line 70
Quoted 4 lines
arch/powerpc/kernel/signal_64.c +4
-0+static char fmt32[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %08lx nip %08lx lr %08lx\n" ; +static char fmt64[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %016lx nip %016lx lr %016lx\n" ;
again?
Signature · 3 lines
Cheers, Stephen Rothwell [email protected] http://www.canb.auug.org.au/~sfr/
Quoted 11 lines · Stephen Rothwell
Hi Olof,
arch/powerpc/kernel/traps.c int die(const char *str, struct pt_regs · line 178
Quoted 5 lines · On Mon, 1 Oct 2007 15:32:42 -0500 Olof Johansson <[email protected]> wrote:
arch/powerpc/kernel/traps.c +4
-0+char fmt32[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %08lx nip %08lx lr %08lx code %x\n" ; +char fmt64[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %016lx nip %016lx lr %016lx code %x\n" ;const char ... ?
Quoted 6 lines
arch/powerpc/kernel/signal_64.c struct rt_sigframe { · line 70
Quoted 4 lines
arch/powerpc/kernel/signal_64.c +4
-0+static char fmt32[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %08lx nip %08lx lr %08lx\n" ; +static char fmt64[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %016lx nip %016lx lr %016lx\n" ;again?
Yeah, sure.
Thanks,
-Olof
PATCH v2 1/1 powerpc: Implement logging of unhandled signals
In reply to Olof JohanssonImplement show_unhandled_signals sysctl + support to print when a process is killed due to unhandled signals just as i386 and x86_64 does.
---
Fixed the const char definitions, plus the two warnings that the change brought (printing a ptr as %lx without cast).
arch/powerpc/kernel/traps.c +11 -1
@@ -172,11 +172,21 @@ int die(const char *str, struct pt_regsvoid _exception (int signr,struct pt_regs *regs,int code,unsigned long addr) {siginfo_t info; +const char fmt32[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %08lx nip %08lx lr %08lx code %x\n" ; +const char fmt64[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %016lx nip %016lx lr %016lx code %x\n" ;if (!user_mode (regs)) {if (die ("Exception in kernel mode" , regs, signr))return ; - } + }else if (show_unhandled_signals && +unhandled_signal (current, signr) && +printk_ratelimit ()) { +printk (regs->msr &MSR_SF ? fmt64 : fmt32, + current->comm, current->pid, signr, + addr, regs->nip, regs->link, code); + }memset (&info,0 ,sizeof (info)); info.si_signo = signr;
arch/powerpc/kernel/signal_64.c +15 -0
@@ -64,6 +64,11 @@ struct rt_sigframe {char abigap[288 ]; } __attribute__ ((aligned (16))); +static const char fmt32[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %08lx nip %08lx lr %08lx\n" ; +static const char fmt64[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %016lx nip %016lx lr %016lx\n" ; +/* * Set up the sigcontext for the signal frame. */
@@ -315,6 +320,11 @@ badframe:printk ("badframe in sys_rt_sigreturn, regs=%p uc=%p &uc->uc_mcontext=%p\n" , regs, uc, &uc->uc_mcontext);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (regs->msr &MSR_SF ? fmt64 : fmt32, + current->comm, current->pid,"rt_sigreturn" , + (long )uc, regs->nip, regs->link); +force_sig (SIGSEGV , current);return 0 ; }
@@ -398,6 +408,11 @@ badframe:printk ("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n" , regs, frame, newsp);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (regs->msr &MSR_SF ? fmt64 : fmt32, + current->comm, current->pid,"setup_rt_frame" , + (long )frame, regs->nip, regs->link); +force_sigsegv (signr, current);return 0 ; }
kernel/sysctl.c +1 -1
@@ -1221,7 +1221,7 @@ static ctl_table fs_table[] = { }; static ctl_table debug_table[] = { -#ifdef CONFIG_X86 +#if defined(CONFIG_X86) || defined(CONFIG_PPC) { .ctl_name = CTL_UNNUMBERED, .procname = "exception-trace",
arch/powerpc/kernel/signal_32.c +38 -0
@@ -705,11 +705,13 @@ int handle_rt_signal32(unsigned long sig {struct rt_sigframe __user *rt_sf;struct mcontext __user *frame; +void __user *addr;unsigned long newsp =0 ;/* Set up Signal Frame */ /* Put a Real Time Context onto stack */ rt_sf =get_sigframe (ka, regs,sizeof (*rt_sf)); + addr = rt_sf;if (unlikely (rt_sf ==NULL )) goto badframe;
@@ -728,6 +730,7 @@ int handle_rt_signal32(unsigned long sig/* Save user registers on the stack */ frame = &rt_sf->uc.uc_mcontext; + addr = frame;if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {if (save_user_regs (regs, frame,0 )) goto badframe;
@@ -742,6 +745,7 @@ int handle_rt_signal32(unsigned long sig/* create a stack frame for the caller of the handler */ newsp = ((unsigned long )rt_sf) - (__SIGNAL_FRAMESIZE +16 ); + addr = (void __user *)regs->gpr[1 ];if (put_user (regs->gpr[1 ], (u32 __user *)newsp)) goto badframe;
@@ -762,6 +766,12 @@ badframe:printk ("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n" , regs, frame, newsp);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in handle_rt_signal32: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + addr, regs->nip, regs->link); +force_sigsegv (sig, current);return 0 ; }
@@ -886,6 +896,12 @@ long sys_rt_sigreturn(int r3, int r4, inreturn 0 ; bad: +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in sys_rt_sigreturn: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + rt_sf, regs->nip, regs->link); +force_sig (SIGSEGV , current);return 0 ; }
@@ -967,6 +983,13 @@ int sys_debug_setcontext(struct ucontext* We kill the task with a SIGSEGV in this situation. */ if (do_setcontext (ctx, regs,1 )) { +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in " +"sys_debug_setcontext: %p nip %08lx " +"lr %08lx\n" , + current->comm, current->pid, + ctx, regs->nip, regs->link); +force_sig (SIGSEGV , current); goto out; }
@@ -1048,6 +1071,12 @@ badframe:printk ("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n" , regs, frame, newsp);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in handle_signal32: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + frame, regs->nip, regs->link); +force_sigsegv (sig, current);return 0 ; }
@@ -1061,12 +1090,14 @@ long sys_sigreturn(int r3, int r4, int rstruct sigcontext __user *sc;struct sigcontext sigctx;struct mcontext __user *sr; +void __user *addr;sigset_t set;/* Always make any pending restarted system calls return -EINTR */ current_thread_info ()->restart_block.fn = do_no_restart_syscall; sc = (struct sigcontext __user *)(regs->gpr[1 ] + __SIGNAL_FRAMESIZE); + addr = sc;if (copy_from_user (&sigctx, sc,sizeof (sigctx))) goto badframe;
@@ -1083,6 +1114,7 @@ long sys_sigreturn(int r3, int r4, int rrestore_sigmask (&set); sr = (struct mcontext __user *)from_user_ptr (sigctx.regs); + addr = sr;if (!access_ok (VERIFY_READ , sr,sizeof (*sr)) ||restore_user_regs (regs, sr,1 )) goto badframe;
@@ -1091,6 +1123,12 @@ long sys_sigreturn(int r3, int r4, int rreturn 0 ; badframe: +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in sys_sigreturn: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + addr, regs->nip, regs->link); +force_sig (SIGSEGV , current);return 0 ; }
arch/powerpc/kernel/signal.c +6 -0
@@ -16,6 +16,12 @@#include "signal.h" +/* Log an error when sending an unhandled signal to a process. Controlled +* through debug.exception-trace sysctl. +*/ + +int show_unhandled_signals =1 ; +/* * Allocate space for the signal frame */
PATCH v3 1/1 powerpc: Implement logging of unhandled signals
Implement show_unhandled_signals sysctl + support to print when a process is killed due to unhandled signals just as i386 and x86_64 does.
Default to having it off, unlike x86 that defaults on.
arch/powerpc/kernel/traps.c +11 -1
@@ -172,11 +172,21 @@ int die(const char *str, struct pt_regsvoid _exception (int signr,struct pt_regs *regs,int code,unsigned long addr) {siginfo_t info; +const char fmt32[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %08lx nip %08lx lr %08lx code %x\n" ; +const char fmt64[] =KERN_INFO "%s[%d]: unhandled signal %d " \ +"at %016lx nip %016lx lr %016lx code %x\n" ;if (!user_mode (regs)) {if (die ("Exception in kernel mode" , regs, signr))return ; - } + }else if (show_unhandled_signals && +unhandled_signal (current, signr) && +printk_ratelimit ()) { +printk (regs->msr &MSR_SF ? fmt64 : fmt32, + current->comm, current->pid, signr, + addr, regs->nip, regs->link, code); + }memset (&info,0 ,sizeof (info)); info.si_signo = signr;
arch/powerpc/kernel/signal_64.c +15 -0
@@ -64,6 +64,11 @@ struct rt_sigframe {char abigap[288 ]; } __attribute__ ((aligned (16))); +static const char fmt32[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %08lx nip %08lx lr %08lx\n" ; +static const char fmt64[] =KERN_INFO \ +"%s[%d]: bad frame in %s: %016lx nip %016lx lr %016lx\n" ; +/* * Set up the sigcontext for the signal frame. */
@@ -315,6 +320,11 @@ badframe:printk ("badframe in sys_rt_sigreturn, regs=%p uc=%p &uc->uc_mcontext=%p\n" , regs, uc, &uc->uc_mcontext);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (regs->msr &MSR_SF ? fmt64 : fmt32, + current->comm, current->pid,"rt_sigreturn" , + (long )uc, regs->nip, regs->link); +force_sig (SIGSEGV , current);return 0 ; }
@@ -398,6 +408,11 @@ badframe:printk ("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n" , regs, frame, newsp);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (regs->msr &MSR_SF ? fmt64 : fmt32, + current->comm, current->pid,"setup_rt_frame" , + (long )frame, regs->nip, regs->link); +force_sigsegv (signr, current);return 0 ; }
kernel/sysctl.c +1 -1
@@ -1221,7 +1221,7 @@ static ctl_table fs_table[] = { }; static ctl_table debug_table[] = { -#ifdef CONFIG_X86 +#if defined(CONFIG_X86) || defined(CONFIG_PPC) { .ctl_name = CTL_UNNUMBERED, .procname = "exception-trace",
arch/powerpc/kernel/signal_32.c +38 -0
@@ -705,11 +705,13 @@ int handle_rt_signal32(unsigned long sig {struct rt_sigframe __user *rt_sf;struct mcontext __user *frame; +void __user *addr;unsigned long newsp =0 ;/* Set up Signal Frame */ /* Put a Real Time Context onto stack */ rt_sf =get_sigframe (ka, regs,sizeof (*rt_sf)); + addr = rt_sf;if (unlikely (rt_sf ==NULL )) goto badframe;
@@ -728,6 +730,7 @@ int handle_rt_signal32(unsigned long sig/* Save user registers on the stack */ frame = &rt_sf->uc.uc_mcontext; + addr = frame;if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {if (save_user_regs (regs, frame,0 )) goto badframe;
@@ -742,6 +745,7 @@ int handle_rt_signal32(unsigned long sig/* create a stack frame for the caller of the handler */ newsp = ((unsigned long )rt_sf) - (__SIGNAL_FRAMESIZE +16 ); + addr = (void __user *)regs->gpr[1 ];if (put_user (regs->gpr[1 ], (u32 __user *)newsp)) goto badframe;
@@ -762,6 +766,12 @@ badframe:printk ("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n" , regs, frame, newsp);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in handle_rt_signal32: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + addr, regs->nip, regs->link); +force_sigsegv (sig, current);return 0 ; }
@@ -886,6 +896,12 @@ long sys_rt_sigreturn(int r3, int r4, inreturn 0 ; bad: +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in sys_rt_sigreturn: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + rt_sf, regs->nip, regs->link); +force_sig (SIGSEGV , current);return 0 ; }
@@ -967,6 +983,13 @@ int sys_debug_setcontext(struct ucontext* We kill the task with a SIGSEGV in this situation. */ if (do_setcontext (ctx, regs,1 )) { +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in " +"sys_debug_setcontext: %p nip %08lx " +"lr %08lx\n" , + current->comm, current->pid, + ctx, regs->nip, regs->link); +force_sig (SIGSEGV , current); goto out; }
@@ -1048,6 +1071,12 @@ badframe:printk ("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n" , regs, frame, newsp);#endif +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in handle_signal32: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + frame, regs->nip, regs->link); +force_sigsegv (sig, current);return 0 ; }
@@ -1061,12 +1090,14 @@ long sys_sigreturn(int r3, int r4, int rstruct sigcontext __user *sc;struct sigcontext sigctx;struct mcontext __user *sr; +void __user *addr;sigset_t set;/* Always make any pending restarted system calls return -EINTR */ current_thread_info ()->restart_block.fn = do_no_restart_syscall; sc = (struct sigcontext __user *)(regs->gpr[1 ] + __SIGNAL_FRAMESIZE); + addr = sc;if (copy_from_user (&sigctx, sc,sizeof (sigctx))) goto badframe;
@@ -1083,6 +1114,7 @@ long sys_sigreturn(int r3, int r4, int rrestore_sigmask (&set); sr = (struct mcontext __user *)from_user_ptr (sigctx.regs); + addr = sr;if (!access_ok (VERIFY_READ , sr,sizeof (*sr)) ||restore_user_regs (regs, sr,1 )) goto badframe;
@@ -1091,6 +1123,12 @@ long sys_sigreturn(int r3, int r4, int rreturn 0 ; badframe: +if (show_unhandled_signals &&printk_ratelimit ()) +printk (KERN_INFO "%s[%d]: bad frame in sys_sigreturn: " +"%p nip %08lx lr %08lx\n" , + current->comm, current->pid, + addr, regs->nip, regs->link); +force_sig (SIGSEGV , current);return 0 ; }
arch/powerpc/kernel/signal.c +6 -0
@@ -16,6 +16,12 @@#include "signal.h" +/* Log an error when sending an unhandled signal to a process. Controlled +* through debug.exception-trace sysctl. +*/ + +int show_unhandled_signals =0 ; +/* * Allocate space for the signal frame */
Quoted 4 lines · Olof Johansson
Implement
show_unhandled_signalssysctl + support to print when a process is killed due to unhandled signals just as i386 andx86_64does.Default to having it off, unlike x86 that defaults on.
Why ? I'd like it on by default :-)
Ben.
Quoted 8 lines · Benjamin Herrenschmidt
Quoted 4 lines · Olof Johansson
Implement
show_unhandled_signalssysctl + support to print when a process is killed due to unhandled signals just as i386 andx86_64does.Default to having it off, unlike x86 that defaults on.
Why ? I'd like it on by default :-)
Paulus mentioned on IRC that he preferred it that way. I'll leave it up to the two of you to argue it out. I'd prefer on by default but I don't really care all that much as long as I can enable it with bootargs.
-Olof