diff options
author | Anton Blanchard <anton@samba.org> | 2007-03-20 15:48:34 +0100 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-04-27 13:13:28 +0200 |
commit | f13659e0b3907548402ce1f47bf866544b804260 (patch) | |
tree | 030fdf28172fb6ed9f3073a6c0a11b71b824e454 | |
parent | [POWERPC] Replace if-then-else with a switch statement (diff) | |
download | linux-f13659e0b3907548402ce1f47bf866544b804260.tar.xz linux-f13659e0b3907548402ce1f47bf866544b804260.zip |
[POWERPC] Fix WARN_ON when entering xmon
Whenever we enter xmon we get a WARN_ON out of the rtas code since it
thinks interrupts are still on:
Unable to handle kernel paging request for data at address 0x00000000
Faulting instruction address: 0xd000000000080008
cpu 0x3: Vector: 300 (Data Access) at [c0000000075dba00]
pc: d000000000080008: .doit+0x8/0x40 [oopser]
lr: c000000000077704: .sys_init_module+0x1664/0x1824
sp: c0000000075dbc80
msr: 9000000000009032
dar: 0
dsisr: 42000000
current = 0xc000000003fa64b0
paca = 0xc000000000694280
pid = 2260, comm = insmod
------------[ cut here ]------------
Badness at arch/powerpc/kernel/entry_64.S:651
Call Trace:
[C0000000075DAE70] [C00000000000EB64] .show_stack+0x68/0x1b0 (unreliable)
[C0000000075DAF10] [C000000000216254] .report_bug+0x94/0xe8
[C0000000075DAFA0] [C00000000047B140] __kprobes_text_start+0x178/0x584
[C0000000075DB040] [C0000000000044F4] program_check_common+0xf4/0x100
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/xmon/xmon.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index f12687d0354d..b481db1dacb4 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c @@ -330,18 +330,17 @@ static void release_output_lock(void) static int xmon_core(struct pt_regs *regs, int fromipi) { int cmd = 0; - unsigned long msr; struct bpt *bp; long recurse_jmp[JMP_BUF_LEN]; unsigned long offset; + unsigned long flags; #ifdef CONFIG_SMP int cpu; int secondary; unsigned long timeout; #endif - msr = mfmsr(); - mtmsr(msr & ~MSR_EE); /* disable interrupts */ + local_irq_save(flags); bp = in_breakpoint_table(regs->nip, &offset); if (bp != NULL) { @@ -516,7 +515,7 @@ static int xmon_core(struct pt_regs *regs, int fromipi) insert_cpu_bpts(); - mtmsr(msr); /* restore interrupt enable */ + local_irq_restore(flags); return cmd != 'X' && cmd != EOF; } |