Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 8423
b: refs/heads/master
c: bb0bb3b
h: refs/heads/master
i:
  8421: 8c77daf
  8419: bbf7637
  8415: 3936d83
v: v3
  • Loading branch information
Paul Mackerras authored and Linus Torvalds committed Sep 10, 2005
1 parent 843a983 commit 7c3a6dd
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 6 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: 1e63bc7342c40f0f1dd83d80d368665bd06f4963
refs/heads/master: bb0bb3b6596cdb08adb0b72453cc67d48e139c2c
22 changes: 22 additions & 0 deletions trunk/arch/ppc/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,28 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
info.si_code = code;
info.si_addr = (void __user *) addr;
force_sig_info(signr, &info, current);

/*
* Init gets no signals that it doesn't have a handler for.
* That's all very well, but if it has caused a synchronous
* exception and we ignore the resulting signal, it will just
* generate the same exception over and over again and we get
* nowhere. Better to kill it and let the kernel panic.
*/
if (current->pid == 1) {
__sighandler_t handler;

spin_lock_irq(&current->sighand->siglock);
handler = current->sighand->action[signr-1].sa.sa_handler;
spin_unlock_irq(&current->sighand->siglock);
if (handler == SIG_DFL) {
/* init has generated a synchronous exception
and it doesn't have a handler for the signal */
printk(KERN_CRIT "init has generated signal %d "
"but has no handler for it\n", signr);
do_exit(signr);
}
}
}

/*
Expand Down
6 changes: 1 addition & 5 deletions trunk/arch/ppc/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,11 +278,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,

/* User mode accesses cause a SIGSEGV */
if (user_mode(regs)) {
info.si_signo = SIGSEGV;
info.si_errno = 0;
info.si_code = code;
info.si_addr = (void __user *) address;
force_sig_info(SIGSEGV, &info, current);
_exception(SIGSEGV, regs, code, address);
return 0;
}

Expand Down
1 change: 1 addition & 0 deletions trunk/include/asm-ppc/system.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ extern void *cacheable_memcpy(void *, const void *, unsigned int);
extern int do_page_fault(struct pt_regs *, unsigned long, unsigned long);
extern void bad_page_fault(struct pt_regs *, unsigned long, int);
extern void die(const char *, struct pt_regs *, long);
extern void _exception(int, struct pt_regs *, int, unsigned long);
#ifdef CONFIG_BOOKE_WDT
extern u32 booke_wdt_enabled;
extern u32 booke_wdt_period;
Expand Down

0 comments on commit 7c3a6dd

Please sign in to comment.