ARM: 7171/1: unwind: add unwind directives to bitops assembly macros

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>
This commit is contained in:
Will Deacon 2011-11-23 11:28:25 +01:00 committed by Russell King
parent c89cefed35
commit c36ef4b176
7 changed files with 28 additions and 22 deletions

View file

@ -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
@ -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
@ -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
@ -49,6 +61,8 @@
str r2, [r1, r0, lsl #2]
restore_irqs ip
mov pc, lr
UNWIND( .fnend )
ENDPROC(\name )
.endm
/**
@ -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
@ -73,5 +89,7 @@
moveq r0, #0
restore_irqs ip
mov pc, lr
UNWIND( .fnend )
ENDPROC(\name )
.endm
#endif

View file

@ -12,6 +12,4 @@
#include "bitops.h"
.text
ENTRY(_change_bit)
bitop eor
ENDPROC(_change_bit)
bitop _change_bit, eor

View file

@ -12,6 +12,4 @@
#include "bitops.h"
.text
ENTRY(_clear_bit)
bitop bic
ENDPROC(_clear_bit)
bitop _clear_bit, bic

View file

@ -12,6 +12,4 @@
#include "bitops.h"
.text
ENTRY(_set_bit)
bitop orr
ENDPROC(_set_bit)
bitop _set_bit, orr

View file

@ -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

View file

@ -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

View file

@ -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