diff options
author | Anton Blanchard <anton@samba.org> | 2007-03-20 10:48:34 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-04-27 07:13:28 -0400 |
commit | f13659e0b3907548402ce1f47bf866544b804260 (patch) | |
tree | 030fdf28172fb6ed9f3073a6c0a11b71b824e454 | |
parent | e7273d2a0841612794dff43328d461beee95c986 (diff) |
[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) | |||
330 | static int xmon_core(struct pt_regs *regs, int fromipi) | 330 | static int xmon_core(struct pt_regs *regs, int fromipi) |
331 | { | 331 | { |
332 | int cmd = 0; | 332 | int cmd = 0; |
333 | unsigned long msr; | ||
334 | struct bpt *bp; | 333 | struct bpt *bp; |
335 | long recurse_jmp[JMP_BUF_LEN]; | 334 | long recurse_jmp[JMP_BUF_LEN]; |
336 | unsigned long offset; | 335 | unsigned long offset; |
336 | unsigned long flags; | ||
337 | #ifdef CONFIG_SMP | 337 | #ifdef CONFIG_SMP |
338 | int cpu; | 338 | int cpu; |
339 | int secondary; | 339 | int secondary; |
340 | unsigned long timeout; | 340 | unsigned long timeout; |
341 | #endif | 341 | #endif |
342 | 342 | ||
343 | msr = mfmsr(); | 343 | local_irq_save(flags); |
344 | mtmsr(msr & ~MSR_EE); /* disable interrupts */ | ||
345 | 344 | ||
346 | bp = in_breakpoint_table(regs->nip, &offset); | 345 | bp = in_breakpoint_table(regs->nip, &offset); |
347 | if (bp != NULL) { | 346 | if (bp != NULL) { |
@@ -516,7 +515,7 @@ static int xmon_core(struct pt_regs *regs, int fromipi) | |||
516 | 515 | ||
517 | insert_cpu_bpts(); | 516 | insert_cpu_bpts(); |
518 | 517 | ||
519 | mtmsr(msr); /* restore interrupt enable */ | 518 | local_irq_restore(flags); |
520 | 519 | ||
521 | return cmd != 'X' && cmd != EOF; | 520 | return cmd != 'X' && cmd != EOF; |
522 | } | 521 | } |