Skip to content

Commit

Permalink
ARM: 7171/1: unwind: add unwind directives to bitops assembly macros
Browse files Browse the repository at this point in the history
The bitops functions (e.g. _test_and_set_bit) on ARM do not have unwind
annotations and therefore the kernel cannot backtrace out of them on a
fatal error (for example, NULL pointer dereference).

This patch annotates the bitops assembly macros with UNWIND annotations
so that we can produce a meaningful backtrace on error. Callers of the
macros are modified to pass their function name as a macro parameter,
enforcing that the macros are used as standalone function implementations.

Acked-by: Dave Martin <dave.martin@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Will Deacon authored and Russell King committed Nov 26, 2011
1 parent c89cefe commit c36ef4b
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 22 deletions.
26 changes: 22 additions & 4 deletions arch/arm/lib/bitops.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
#include <asm/unwind.h>

#if __LINUX_ARM_ARCH__ >= 6
.macro bitop, instr
.macro bitop, name, instr
ENTRY( \name )
UNWIND( .fnstart )
ands ip, r1, #3
strneb r1, [ip] @ assert word-aligned
mov r2, #1
Expand All @@ -13,9 +17,13 @@
cmp r0, #0
bne 1b
bx lr
UNWIND( .fnend )
ENDPROC(\name )
.endm

.macro testop, instr, store
.macro testop, name, instr, store
ENTRY( \name )
UNWIND( .fnstart )
ands ip, r1, #3
strneb r1, [ip] @ assert word-aligned
mov r2, #1
Expand All @@ -34,9 +42,13 @@
cmp r0, #0
movne r0, #1
2: bx lr
UNWIND( .fnend )
ENDPROC(\name )
.endm
#else
.macro bitop, instr
.macro bitop, name, instr
ENTRY( \name )
UNWIND( .fnstart )
ands ip, r1, #3
strneb r1, [ip] @ assert word-aligned
and r2, r0, #31
Expand All @@ -49,6 +61,8 @@
str r2, [r1, r0, lsl #2]
restore_irqs ip
mov pc, lr
UNWIND( .fnend )
ENDPROC(\name )
.endm

/**
Expand All @@ -59,7 +73,9 @@
* Note: we can trivially conditionalise the store instruction
* to avoid dirtying the data cache.
*/
.macro testop, instr, store
.macro testop, name, instr, store
ENTRY( \name )
UNWIND( .fnstart )
ands ip, r1, #3
strneb r1, [ip] @ assert word-aligned
and r3, r0, #31
Expand All @@ -73,5 +89,7 @@
moveq r0, #0
restore_irqs ip
mov pc, lr
UNWIND( .fnend )
ENDPROC(\name )
.endm
#endif
4 changes: 1 addition & 3 deletions arch/arm/lib/changebit.S
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,4 @@
#include "bitops.h"
.text

ENTRY(_change_bit)
bitop eor
ENDPROC(_change_bit)
bitop _change_bit, eor
4 changes: 1 addition & 3 deletions arch/arm/lib/clearbit.S
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,4 @@
#include "bitops.h"
.text

ENTRY(_clear_bit)
bitop bic
ENDPROC(_clear_bit)
bitop _clear_bit, bic
4 changes: 1 addition & 3 deletions arch/arm/lib/setbit.S
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,4 @@
#include "bitops.h"
.text

ENTRY(_set_bit)
bitop orr
ENDPROC(_set_bit)
bitop _set_bit, orr
4 changes: 1 addition & 3 deletions arch/arm/lib/testchangebit.S
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,4 @@
#include "bitops.h"
.text

ENTRY(_test_and_change_bit)
testop eor, str
ENDPROC(_test_and_change_bit)
testop _test_and_change_bit, eor, str
4 changes: 1 addition & 3 deletions arch/arm/lib/testclearbit.S
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,4 @@
#include "bitops.h"
.text

ENTRY(_test_and_clear_bit)
testop bicne, strne
ENDPROC(_test_and_clear_bit)
testop _test_and_clear_bit, bicne, strne
4 changes: 1 addition & 3 deletions arch/arm/lib/testsetbit.S
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,4 @@
#include "bitops.h"
.text

ENTRY(_test_and_set_bit)
testop orreq, streq
ENDPROC(_test_and_set_bit)
testop _test_and_set_bit, orreq, streq

0 comments on commit c36ef4b

Please sign in to comment.