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

Commit a771fe6e authored by Catalin Marinas's avatar Catalin Marinas Committed by Russell King
Browse files

ARM: 5757/1: Thumb-2: Correct "mov.w pc, lr" instruction which is unpredictable



The 32-bit wide variant of "mov pc, reg" in Thumb-2 is unpredictable
causing improper handling of the undefined instructions not caught by
the kernel. This patch adds a movw_pc macro for such situations
(currently only used in call_fpe).

Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 80f50691
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -608,33 +608,33 @@ call_fpe:
 THUMB(	add	pc, r8			)
	nop

	W(mov)	pc, lr				@ CP#0
	movw_pc	lr				@ CP#0
	W(b)	do_fpe				@ CP#1 (FPE)
	W(b)	do_fpe				@ CP#2 (FPE)
	W(mov)	pc, lr				@ CP#3
	movw_pc	lr				@ CP#3
#ifdef CONFIG_CRUNCH
	b	crunch_task_enable		@ CP#4 (MaverickCrunch)
	b	crunch_task_enable		@ CP#5 (MaverickCrunch)
	b	crunch_task_enable		@ CP#6 (MaverickCrunch)
#else
	W(mov)	pc, lr				@ CP#4
	W(mov)	pc, lr				@ CP#5
	W(mov)	pc, lr				@ CP#6
	movw_pc	lr				@ CP#4
	movw_pc	lr				@ CP#5
	movw_pc	lr				@ CP#6
#endif
	W(mov)	pc, lr				@ CP#7
	W(mov)	pc, lr				@ CP#8
	W(mov)	pc, lr				@ CP#9
	movw_pc	lr				@ CP#7
	movw_pc	lr				@ CP#8
	movw_pc	lr				@ CP#9
#ifdef CONFIG_VFP
	W(b)	do_vfp				@ CP#10 (VFP)
	W(b)	do_vfp				@ CP#11 (VFP)
#else
	W(mov)	pc, lr				@ CP#10 (VFP)
	W(mov)	pc, lr				@ CP#11 (VFP)
	movw_pc	lr				@ CP#10 (VFP)
	movw_pc	lr				@ CP#11 (VFP)
#endif
	W(mov)	pc, lr				@ CP#12
	W(mov)	pc, lr				@ CP#13
	W(mov)	pc, lr				@ CP#14 (Debug)
	W(mov)	pc, lr				@ CP#15 (Control)
	movw_pc	lr				@ CP#12
	movw_pc	lr				@ CP#13
	movw_pc	lr				@ CP#14 (Debug)
	movw_pc	lr				@ CP#15 (Control)

#ifdef CONFIG_NEON
	.align	6
+15 −0
Original line number Diff line number Diff line
@@ -110,6 +110,13 @@
	mov	\rd, sp, lsr #13
	mov	\rd, \rd, lsl #13
	.endm

	@
	@ 32-bit wide "mov pc, reg"
	@
	.macro	movw_pc, reg
	mov	pc, \reg
	.endm
#else	/* CONFIG_THUMB2_KERNEL */
	.macro	svc_exit, rpsr
	clrex					@ clear the exclusive monitor
@@ -146,6 +153,14 @@
	lsr	\rd, \rd, #13
	mov	\rd, \rd, lsl #13
	.endm

	@
	@ 32-bit wide "mov pc, reg"
	@
	.macro	movw_pc, reg
	mov	pc, \reg
	nop
	.endm
#endif	/* !CONFIG_THUMB2_KERNEL */

/*