ARM: 7440/1: kprobes: only test 'sub pc, pc, #1b-2b+8-2' on ARMv6
'sub pc, pc, #1b-2b+8-2' results in address<1:0> == '10'. sub pc, pc, #const (== ADR pc, #const) performs an interworking branch (BXWritePC()) on ARMv7+ and a simple branch (BranchWritePC()) on earlier versions. In ARM state, BXWritePC() is UNPREDICTABLE when address<1:0> == '10'. In ARM state on ARMv6+, BranchWritePC() ignores address<1:0>. Before ARMv6, BranchWritePC() is UNPREDICTABLE if address<1:0> != '00' So the instruction is UNPREDICTABLE both before and after v6. Acked-by: Jon Medhurst <tixy@yxit.co.uk> Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
fdeb8e35fd
commit
f8b435bb91
|
@ -187,8 +187,8 @@ void kprobe_arm_test_cases(void)
|
||||||
TEST_BF_R ("mov pc, r",0,2f,"")
|
TEST_BF_R ("mov pc, r",0,2f,"")
|
||||||
TEST_BF_RR("mov pc, r",0,2f,", asl r",1,0,"")
|
TEST_BF_RR("mov pc, r",0,2f,", asl r",1,0,"")
|
||||||
TEST_BB( "sub pc, pc, #1b-2b+8")
|
TEST_BB( "sub pc, pc, #1b-2b+8")
|
||||||
#if __LINUX_ARM_ARCH__ >= 6
|
#if __LINUX_ARM_ARCH__ == 6 && !defined(CONFIG_CPU_V7)
|
||||||
TEST_BB( "sub pc, pc, #1b-2b+8-2") /* UNPREDICTABLE before ARMv6 */
|
TEST_BB( "sub pc, pc, #1b-2b+8-2") /* UNPREDICTABLE before and after ARMv6 */
|
||||||
#endif
|
#endif
|
||||||
TEST_BB_R( "sub pc, pc, r",14, 1f-2f+8,"")
|
TEST_BB_R( "sub pc, pc, r",14, 1f-2f+8,"")
|
||||||
TEST_BB_R( "rsb pc, r",14,1f-2f+8,", pc")
|
TEST_BB_R( "rsb pc, r",14,1f-2f+8,", pc")
|
||||||
|
|
Loading…
Reference in New Issue