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: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
Родитель
80f506918f
Коммит
a771fe6e4e
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче