Commit 007d88d042d7b71aa2c9fc615aef97888e20ddf3
Committed by
Paul Mackerras
1 parent
673aeb76d0
Exists in
master
and in
7 other branches
[POWERPC] Fix manual assembly WARN_ON() in enter_rtas().
When we switched over to the generic BUG mechanism we forgot to change the assembly code which open-codes a WARN_ON() in enter_rtas(), so the bug table got corrupted. This patch provides an EMIT_BUG_ENTRY macro for use in assembly code, and uses it in entry_64.S. Tested with CONFIG_DEBUG_BUGVERBOSE on ppc64 but not without -- I tried to turn it off but it wouldn't go away; I suspect Aunt Tillie probably needed it. This version gets __FILE__ and __LINE__ right in the assembly version -- rather than saying include/asm-powerpc/bug.h line 21 every time which is a little suboptimal. Signed-off-by: David Woodhouse <dwmw2@infradead.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
Showing 3 changed files with 32 additions and 11 deletions Side-by-side Diff
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/entry_64.S
... | ... | @@ -28,6 +28,7 @@ |
28 | 28 | #include <asm/asm-offsets.h> |
29 | 29 | #include <asm/cputable.h> |
30 | 30 | #include <asm/firmware.h> |
31 | +#include <asm/bug.h> | |
31 | 32 | |
32 | 33 | /* |
33 | 34 | * System calls. |
34 | 35 | |
... | ... | @@ -634,19 +635,15 @@ |
634 | 635 | li r0,0 |
635 | 636 | mtcr r0 |
636 | 637 | |
638 | +#ifdef CONFIG_BUG | |
637 | 639 | /* There is no way it is acceptable to get here with interrupts enabled, |
638 | 640 | * check it with the asm equivalent of WARN_ON |
639 | 641 | */ |
640 | 642 | lbz r0,PACASOFTIRQEN(r13) |
641 | 643 | 1: tdnei r0,0 |
642 | -.section __bug_table,"a" | |
643 | - .llong 1b,__LINE__ + 0x1000000, 1f, 2f | |
644 | -.previous | |
645 | -.section .rodata,"a" | |
646 | -1: .asciz __FILE__ | |
647 | -2: .asciz "enter_rtas" | |
648 | -.previous | |
649 | - | |
644 | + EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,BUGFLAG_WARNING | |
645 | +#endif | |
646 | + | |
650 | 647 | /* Hard-disable interrupts */ |
651 | 648 | mfmsr r6 |
652 | 649 | rldicl r7,r6,48,1 |
include/asm-powerpc/bug.h
... | ... | @@ -11,10 +11,31 @@ |
11 | 11 | #define BUG_OPCODE .long 0x00b00b00 /* For asm */ |
12 | 12 | #define BUG_ILLEGAL_INSTR "0x00b00b00" /* For BUG macro */ |
13 | 13 | |
14 | -#ifndef __ASSEMBLY__ | |
15 | - | |
16 | 14 | #ifdef CONFIG_BUG |
17 | 15 | |
16 | +#ifdef __ASSEMBLY__ | |
17 | +#ifdef CONFIG_DEBUG_BUGVERBOSE | |
18 | +.macro EMIT_BUG_ENTRY addr,file,line,flags | |
19 | + .section __bug_table,"a" | |
20 | +5001: PPC_LONG \addr, 5002f | |
21 | + .short \line, \flags | |
22 | + .org 5001b+BUG_ENTRY_SIZE | |
23 | + .previous | |
24 | + .section .rodata,"a" | |
25 | +5002: .asciz "\file" | |
26 | + .previous | |
27 | +.endm | |
28 | +#else | |
29 | + .macro EMIT_BUG_ENTRY addr,file,line,flags | |
30 | + .section __bug_table,"a" | |
31 | +5001: PPC_LONG \addr | |
32 | + .short \flags | |
33 | + .org 5001b+BUG_ENTRY_SIZE | |
34 | + .previous | |
35 | +.endm | |
36 | +#endif /* verbose */ | |
37 | + | |
38 | +#else /* !__ASSEMBLY__ */ | |
18 | 39 | /* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and |
19 | 40 | sizeof(struct bug_entry), respectively */ |
20 | 41 | #ifdef CONFIG_DEBUG_BUGVERBOSE |
21 | 42 | |
... | ... | @@ -91,8 +112,8 @@ |
91 | 112 | #define HAVE_ARCH_BUG |
92 | 113 | #define HAVE_ARCH_BUG_ON |
93 | 114 | #define HAVE_ARCH_WARN_ON |
94 | -#endif /* CONFIG_BUG */ | |
95 | 115 | #endif /* __ASSEMBLY __ */ |
116 | +#endif /* CONFIG_BUG */ | |
96 | 117 | |
97 | 118 | #include <asm-generic/bug.h> |
98 | 119 |