Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c36ef4b1 authored by Will Deacon's avatar Will Deacon Committed by Russell King
Browse files

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: default avatarDave Martin <dave.martin@linaro.org>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent c89cefed
Loading
Loading
Loading
Loading
+22 −4
Original line number Diff line number Diff line
#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
+1 −3
Original line number Diff line number Diff line
@@ -12,6 +12,4 @@
#include "bitops.h"
                .text

ENTRY(_change_bit)
	bitop	eor
ENDPROC(_change_bit)
bitop	_change_bit, eor
+1 −3
Original line number Diff line number Diff line
@@ -12,6 +12,4 @@
#include "bitops.h"
                .text

ENTRY(_clear_bit)
	bitop	bic
ENDPROC(_clear_bit)
bitop	_clear_bit, bic
+1 −3
Original line number Diff line number Diff line
@@ -12,6 +12,4 @@
#include "bitops.h"
		.text

ENTRY(_set_bit)
	bitop	orr
ENDPROC(_set_bit)
bitop	_set_bit, orr
+1 −3
Original line number Diff line number Diff line
@@ -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
Loading