diff options
| author | Nicholas Piggin <npiggin@gmail.com> | 2016-11-08 07:14:44 -0500 |
|---|---|---|
| committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-11-18 06:40:42 -0500 |
| commit | 6f44b20ee9b4130345c189c0c90ef6604bcd8005 (patch) | |
| tree | ce6427611a8af1e7c99f297933c7d09b18140bac /arch/powerpc/kernel/traps.c | |
| parent | 43c9127d94d62a232ed33ed2eab8a08657ce5472 (diff) | |
powerpc: Fix graceful debugger recovery
When exiting xmon with 'x' (exit and recover), oops_begin bails
out immediately, but die then calls __die() and oops_end(), which
cause a lot of bad things to happen.
If the debugger was attached then went to graceful recovery, exit
from die() immediately.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
| -rw-r--r-- | arch/powerpc/kernel/traps.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 91d278c9ab28..13ca8b687e88 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
| @@ -122,9 +122,6 @@ static unsigned long oops_begin(struct pt_regs *regs) | |||
| 122 | int cpu; | 122 | int cpu; |
| 123 | unsigned long flags; | 123 | unsigned long flags; |
| 124 | 124 | ||
| 125 | if (debugger(regs)) | ||
| 126 | return 1; | ||
| 127 | |||
| 128 | oops_enter(); | 125 | oops_enter(); |
| 129 | 126 | ||
| 130 | /* racy, but better than risking deadlock. */ | 127 | /* racy, but better than risking deadlock. */ |
| @@ -227,8 +224,12 @@ NOKPROBE_SYMBOL(__die); | |||
| 227 | 224 | ||
| 228 | void die(const char *str, struct pt_regs *regs, long err) | 225 | void die(const char *str, struct pt_regs *regs, long err) |
| 229 | { | 226 | { |
| 230 | unsigned long flags = oops_begin(regs); | 227 | unsigned long flags; |
| 228 | |||
| 229 | if (debugger(regs)) | ||
| 230 | return; | ||
| 231 | 231 | ||
| 232 | flags = oops_begin(regs); | ||
| 232 | if (__die(str, regs, err)) | 233 | if (__die(str, regs, err)) |
| 233 | err = 0; | 234 | err = 0; |
| 234 | oops_end(flags, regs, err); | 235 | oops_end(flags, regs, err); |
