Message ID | 1364871884-28252-1-git-send-email-kpark3469@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, 2013-04-02 at 12:04 +0900, kpark3469@gmail.com wrote: > From: Sahara <keun-o.park@windriver.com> > > If kprobe tests run on ARMv6k or ARMv6, there're a number of test > coverage missing failures like: The tests only fail (return an error code) for the coverage tests when compiled for ARMv7 because, obviously, that's the only architecture that can cover all the combinations of instructions. Perhaps we should just disabled the coverage tests pre-ARMv7 kernels to avoid the noisy output you see. I think the best way to look at it is that the coverage tests are test code for the test code, and should only be of concern to people updating the test code. If we go down the route that this patch follows of conditional compilation then we are making the main kernel code more messy in order to support test code and I'm not sure that is a good idea. It will be much worse should someone want to do the same for ARMv5. There is also the problem that once you #ifdef things for ARMv6 then you need an ARMv6 system to test that combination of data structures, whereas at the moment an ARMv7 board will cover everything.
On Tue, Apr 2, 2013 at 11:19 PM, Jon Medhurst (Tixy) <tixy@linaro.org> wrote: > On Tue, 2013-04-02 at 12:04 +0900, kpark3469@gmail.com wrote: >> From: Sahara <keun-o.park@windriver.com> >> >> If kprobe tests run on ARMv6k or ARMv6, there're a number of test >> coverage missing failures like: > > The tests only fail (return an error code) for the coverage tests when > compiled for ARMv7 because, obviously, that's the only architecture that > can cover all the combinations of instructions. Perhaps we should just > disabled the coverage tests pre-ARMv7 kernels to avoid the noisy output > you see. > > I think the best way to look at it is that the coverage tests are test > code for the test code, and should only be of concern to people updating > the test code. > > If we go down the route that this patch follows of conditional > compilation then we are making the main kernel code more messy in order > to support test code and I'm not sure that is a good idea. It will be > much worse should someone want to do the same for ARMv5. > > There is also the problem that once you #ifdef things for ARMv6 then you > need an ARMv6 system to test that combination of data structures, > whereas at the moment an ARMv7 board will cover everything. > > -- > Tixy Hi Jon, I see. You're worried about the main kernel code being tainted by adding more test code for test. To keep the clean decode table without #ifdef, most modified codes in arch/arm/kernel/kprobes-arm.c may be removed. But, in order to keep consistency supporting 'nop', I think at least we still need to add patches for 'nop' in arch/arm/kernel/kprobes-test.c and kprobes-test.h. It doesn't look good 'nop' is used by default like TEST_INSTRUCTION() while TEST('nop') is excluded in kprobe_arm_test_cases. -- Kpark > >> FAIL: Register test coverage missing for 0ff000f0 00600090 (04404) >> FAIL: Test coverage entry missing for 0ff000f0 00600090 >> FAIL: Test coverage entry missing for 0f200090 00200090 >> FAIL: Register test coverage missing for 0fb00000 03000000 (05000) >> FAIL: Test coverage entry missing for 0fb00000 03000000 >> FAIL: Test coverage entry missing for 0fff00ff 03200001 >> FAIL: Test coverage entry missing for 0fff00ff 03200004 >> FAIL: Test coverage entry missing for 0fff00fc 03200000 >> FAIL: Test coverage entry missing for 0fb00010 06000010 >> FAIL: Test coverage entry missing for 0f8000f0 060000b0 >> FAIL: Test coverage entry missing for 0f8000f0 060000d0 >> FAIL: Register test coverage missing for 0f800010 06000010 (55005) >> FAIL: Test coverage entry missing for 0f800010 06000010 >> FAIL: Test coverage entry missing for 0ff000f0 07f000f0 >> FAIL: Register test coverage missing for 0fa00070 07a00050 (05005) >> FAIL: Test coverage entry missing for 0fa00070 07a00050 >> FAIL: Register test coverage missing for 0fe0007f 07c0001f (05000) >> FAIL: Test coverage entry missing for 0fe0007f 07c0001f >> FAIL: Register test coverage missing for 0fe00070 07c00010 (05001) >> FAIL: Test coverage entry missing for 0fe00070 07c00010 >> >> Some instructions (like yield, sev, nop, and so on) are available in >> ARMv6k or ARMv7, which we can test by checking the __LINUX_ARM_ARCH__ >> or checking the CONFIG_CPU_32v6K. >> While MLS is excluded on ARMv6, more TEST_UNSUPPORTED coverages for >> MLA is needed. >> NOP instruction is used in several predefined macros, and these will >> lead us to get a lot of INSN_REJECTED errors since the nop instruction >> is not included in kprobe_decode_arm_table on ARMv6. By checking the >> __LINUX_ARM_ARCH__ or the CONFIG_CPU_32v6K, 'nop' or 'mov r0,r0' will >> be selected. >> >> Signed-off-by: Sahara <keun-o.park@windriver.com> >> --- >> arch/arm/kernel/kprobes-arm.c | 20 ++++++++++++++++++-- >> arch/arm/kernel/kprobes-test-arm.c | 3 +++ >> arch/arm/kernel/kprobes-test.c | 2 +- >> arch/arm/kernel/kprobes-test.h | 18 ++++++++++++------ >> 4 files changed, 34 insertions(+), 9 deletions(-) >> >> diff --git a/arch/arm/kernel/kprobes-arm.c b/arch/arm/kernel/kprobes-arm.c >> index 8a30c89..324fd22 100644 >> --- a/arch/arm/kernel/kprobes-arm.c >> +++ b/arch/arm/kernel/kprobes-arm.c >> @@ -495,10 +495,13 @@ static const union decode_item arm_cccc_0000_____1001_table[] = { >> >> /* MLA cccc 0000 0010 xxxx xxxx xxxx 1001 xxxx */ >> /* MLAS cccc 0000 0011 xxxx xxxx xxxx 1001 xxxx */ >> - DECODE_OR (0x0fe000f0, 0x00200090), >> + DECODE_EMULATEX (0x0fe000f0, 0x00200090, emulate_rd16rn12rm0rs8_rwflags_nopc, >> + REGS(NOPC, NOPC, NOPC, 0, NOPC)), >> +#if __LINUX_ARM_ARCH__ >= 7 >> /* MLS cccc 0000 0110 xxxx xxxx xxxx 1001 xxxx */ >> DECODE_EMULATEX (0x0ff000f0, 0x00600090, emulate_rd16rn12rm0rs8_rwflags_nopc, >> REGS(NOPC, NOPC, NOPC, 0, NOPC)), >> +#endif >> >> /* UMAAL cccc 0000 0100 xxxx xxxx xxxx 1001 xxxx */ >> DECODE_OR (0x0ff000f0, 0x00400090), >> @@ -533,12 +536,14 @@ static const union decode_item arm_cccc_0001_____1001_table[] = { >> static const union decode_item arm_cccc_000x_____1xx1_table[] = { >> /* Extra load/store instructions */ >> >> +#if __LINUX_ARM_ARCH__ >= 7 >> /* STRHT cccc 0000 xx10 xxxx xxxx xxxx 1011 xxxx */ >> /* ??? cccc 0000 xx10 xxxx xxxx xxxx 11x1 xxxx */ >> /* LDRHT cccc 0000 xx11 xxxx xxxx xxxx 1011 xxxx */ >> /* LDRSBT cccc 0000 xx11 xxxx xxxx xxxx 1101 xxxx */ >> /* LDRSHT cccc 0000 xx11 xxxx xxxx xxxx 1111 xxxx */ >> DECODE_REJECT (0x0f200090, 0x00200090), >> +#endif >> >> /* LDRD/STRD lr,pc,{... cccc 000x x0x0 xxxx 111x xxxx 1101 xxxx */ >> DECODE_REJECT (0x0e10e0d0, 0x0000e0d0), >> @@ -641,11 +646,14 @@ static const union decode_item arm_cccc_000x_table[] = { >> static const union decode_item arm_cccc_001x_table[] = { >> /* Data-processing (immediate) */ >> >> +#if __LINUX_ARM_ARCH__ >= 7 >> /* MOVW cccc 0011 0000 xxxx xxxx xxxx xxxx xxxx */ >> /* MOVT cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx */ >> DECODE_EMULATEX (0x0fb00000, 0x03000000, emulate_rd12rm0_noflags_nopc, >> REGS(0, NOPC, 0, 0, 0)), >> +#endif >> >> +#if (__LINUX_ARM_ARCH__ >= 7) || defined(CONFIG_CPU_32v6K) >> /* YIELD cccc 0011 0010 0000 xxxx xxxx 0000 0001 */ >> DECODE_OR (0x0fff00ff, 0x03200001), >> /* SEV cccc 0011 0010 0000 xxxx xxxx 0000 0100 */ >> @@ -654,7 +662,9 @@ static const union decode_item arm_cccc_001x_table[] = { >> /* WFE cccc 0011 0010 0000 xxxx xxxx 0000 0010 */ >> /* WFI cccc 0011 0010 0000 xxxx xxxx 0000 0011 */ >> DECODE_SIMULATE (0x0fff00fc, 0x03200000, kprobe_simulate_nop), >> - /* DBG cccc 0011 0010 0000 xxxx xxxx ffff xxxx */ >> + /* DBG cccc 0011 0010 0000 xxxx xxxx 1111 xxxx */ >> + DECODE_REJECT (0x0fb000f0, 0x032000f0), >> +#endif >> /* unallocated hints cccc 0011 0010 0000 xxxx xxxx xxxx xxxx */ >> /* MSR (immediate) cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx */ >> DECODE_REJECT (0x0fb00000, 0x03200000), >> @@ -712,6 +722,7 @@ static const union decode_item arm_cccc_0110_____xxx1_table[] = { >> DECODE_EMULATEX (0x0fb00070, 0x06b00030, emulate_rd12rm0_noflags_nopc, >> REGS(0, NOPC, 0, 0, NOPC)), >> >> +#if __LINUX_ARM_ARCH__ >= 7 >> /* ??? cccc 0110 0x00 xxxx xxxx xxxx xxx1 xxxx */ >> DECODE_REJECT (0x0fb00010, 0x06000010), >> /* ??? cccc 0110 0xxx xxxx xxxx xxxx 1011 xxxx */ >> @@ -756,6 +767,7 @@ static const union decode_item arm_cccc_0110_____xxx1_table[] = { >> /* UHSUB8 cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx */ >> DECODE_EMULATEX (0x0f800010, 0x06000010, emulate_rd12rn16rm0_rwflags_nopc, >> REGS(NOPC, NOPC, 0, 0, NOPC)), >> +#endif >> >> /* PKHBT cccc 0110 1000 xxxx xxxx xxxx x001 xxxx */ >> /* PKHTB cccc 0110 1000 xxxx xxxx xxxx x101 xxxx */ >> @@ -790,8 +802,10 @@ static const union decode_item arm_cccc_0110_____xxx1_table[] = { >> static const union decode_item arm_cccc_0111_____xxx1_table[] = { >> /* Media instructions */ >> >> +#if __LINUX_ARM_ARCH__ >= 7 >> /* UNDEFINED cccc 0111 1111 xxxx xxxx xxxx 1111 xxxx */ >> DECODE_REJECT (0x0ff000f0, 0x07f000f0), >> +#endif >> >> /* SMLALD cccc 0111 0100 xxxx xxxx xxxx 00x1 xxxx */ >> /* SMLSLD cccc 0111 0100 xxxx xxxx xxxx 01x1 xxxx */ >> @@ -820,6 +834,7 @@ static const union decode_item arm_cccc_0111_____xxx1_table[] = { >> DECODE_EMULATEX (0x0ff000d0, 0x075000d0, emulate_rd16rn12rm0rs8_rwflags_nopc, >> REGS(NOPC, NOPC, NOPC, 0, NOPC)), >> >> +#if __LINUX_ARM_ARCH__ >= 7 >> /* SBFX cccc 0111 101x xxxx xxxx xxxx x101 xxxx */ >> /* UBFX cccc 0111 111x xxxx xxxx xxxx x101 xxxx */ >> DECODE_EMULATEX (0x0fa00070, 0x07a00050, emulate_rd12rm0_noflags_nopc, >> @@ -832,6 +847,7 @@ static const union decode_item arm_cccc_0111_____xxx1_table[] = { >> /* BFI cccc 0111 110x xxxx xxxx xxxx x001 xxxx */ >> DECODE_EMULATEX (0x0fe00070, 0x07c00010, emulate_rd12rm0_noflags_nopc, >> REGS(0, NOPC, 0, 0, NOPCX)), >> +#endif >> >> DECODE_END >> }; >> diff --git a/arch/arm/kernel/kprobes-test-arm.c b/arch/arm/kernel/kprobes-test-arm.c >> index 8393129..850b7b9 100644 >> --- a/arch/arm/kernel/kprobes-test-arm.c >> +++ b/arch/arm/kernel/kprobes-test-arm.c >> @@ -353,6 +353,9 @@ void kprobe_arm_test_cases(void) >> TEST_RRR( "mlahi r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"") >> TEST_RR( "mla lr, r",1, VAL2,", r",2, VAL3,", r13") >> TEST_UNSUPPORTED(".word 0xe02f3291 @ mla pc, r1, r2, r3") >> + TEST_UNSUPPORTED(".word 0xe020329f @ mla r0, pc, r2, r3") >> + TEST_UNSUPPORTED(".word 0xe0203f91 @ mla r0, r1, pc, r3") >> + TEST_UNSUPPORTED(".word 0xe020f291 @ mla r0, r1, r2, pc") >> TEST_RRR( "mlas r0, r",1, VAL1,", r",2, VAL2,", r",3, VAL3,"") >> TEST_RRR( "mlahis r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"") >> TEST_RR( "mlas lr, r",1, VAL2,", r",2, VAL3,", r13") >> diff --git a/arch/arm/kernel/kprobes-test.c b/arch/arm/kernel/kprobes-test.c >> index 0cd63d0..0651fd6 100644 >> --- a/arch/arm/kernel/kprobes-test.c >> +++ b/arch/arm/kernel/kprobes-test.c >> @@ -478,7 +478,7 @@ static int run_api_tests(long (*func)(long, long)) >> static void __naked benchmark_nop(void) >> { >> __asm__ __volatile__ ( >> - "nop \n\t" >> + NOP" \n\t" >> "bx lr" >> ); >> } >> diff --git a/arch/arm/kernel/kprobes-test.h b/arch/arm/kernel/kprobes-test.h >> index e28a869..24822f0 100644 >> --- a/arch/arm/kernel/kprobes-test.h >> +++ b/arch/arm/kernel/kprobes-test.h >> @@ -144,20 +144,26 @@ struct test_arg_end { >> ".code "TEST_ISA" \n\t" \ >> "0: \n\t" >> >> +#if (__LINUX_ARM_ARCH__ >= 7) || defined(CONFIG_CPU_32v6K) >> +#define NOP "nop" >> +#else >> +#define NOP "mov r0, r0" >> +#endif >> + >> #define TEST_INSTRUCTION(instruction) \ >> - "50: nop \n\t" \ >> + "50: "NOP" \n\t" \ >> "1: "instruction" \n\t" \ >> - " nop \n\t" >> + " "NOP" \n\t" >> >> #define TEST_BRANCH_F(instruction) \ >> TEST_INSTRUCTION(instruction) \ >> " b 99f \n\t" \ >> - "2: nop \n\t" >> + "2: "NOP" \n\t" >> >> #define TEST_BRANCH_B(instruction) \ >> " b 50f \n\t" \ >> " b 99f \n\t" \ >> - "2: nop \n\t" \ >> + "2: "NOP" \n\t" \ >> " b 99f \n\t" \ >> TEST_INSTRUCTION(instruction) >> >> @@ -166,12 +172,12 @@ struct test_arg_end { >> " b 99f \n\t" \ >> codex" \n\t" \ >> " b 99f \n\t" \ >> - "2: nop \n\t" >> + "2: "NOP" \n\t" >> >> #define TEST_BRANCH_BX(instruction, codex) \ >> " b 50f \n\t" \ >> " b 99f \n\t" \ >> - "2: nop \n\t" \ >> + "2: "NOP" \n\t" \ >> " b 99f \n\t" \ >> codex" \n\t" \ >> TEST_INSTRUCTION(instruction) > >
On Wed, 2013-04-03 at 11:00 +0900, Keun-O Park wrote: > On Tue, Apr 2, 2013 at 11:19 PM, Jon Medhurst (Tixy) <tixy@linaro.org> wrote: > > On Tue, 2013-04-02 at 12:04 +0900, kpark3469@gmail.com wrote: > >> From: Sahara <keun-o.park@windriver.com> > >> > >> If kprobe tests run on ARMv6k or ARMv6, there're a number of test > >> coverage missing failures like: > > > > The tests only fail (return an error code) for the coverage tests when > > compiled for ARMv7 because, obviously, that's the only architecture that > > can cover all the combinations of instructions. Perhaps we should just > > disabled the coverage tests pre-ARMv7 kernels to avoid the noisy output > > you see. > > > > I think the best way to look at it is that the coverage tests are test > > code for the test code, and should only be of concern to people updating > > the test code. > > > > If we go down the route that this patch follows of conditional > > compilation then we are making the main kernel code more messy in order > > to support test code and I'm not sure that is a good idea. It will be > > much worse should someone want to do the same for ARMv5. > > > > There is also the problem that once you #ifdef things for ARMv6 then you > > need an ARMv6 system to test that combination of data structures, > > whereas at the moment an ARMv7 board will cover everything. > > > > -- > > Tixy > > Hi Jon, > I see. You're worried about the main kernel code being tainted by adding more > test code for test. To keep the clean decode table without #ifdef, > most modified codes in > arch/arm/kernel/kprobes-arm.c may be removed. architectures without > But, in order to keep consistency supporting 'nop', I think at least we still > need to add patches for 'nop' in arch/arm/kernel/kprobes-test.c and > kprobes-test.h. > It doesn't look good 'nop' is used by default like TEST_INSTRUCTION() > while TEST('nop') is > excluded in kprobe_arm_test_cases. I hate to sound overly awkward, but I'm not sure I agree with this either :-) When building for architectures without a proper NOP instructions the assembler will treat it as a pseudo-instruction equivalent to MOV R0,R0 in ARM code and MOV R8,R8 in Thumb code. So it doesn't seem worth adding an explicit macro to do this if the assembler already does it anyway.
On Wed, Apr 3, 2013 at 6:11 PM, Jon Medhurst (Tixy) <tixy@linaro.org> wrote: > On Wed, 2013-04-03 at 11:00 +0900, Keun-O Park wrote: >> On Tue, Apr 2, 2013 at 11:19 PM, Jon Medhurst (Tixy) <tixy@linaro.org> wrote: >> > On Tue, 2013-04-02 at 12:04 +0900, kpark3469@gmail.com wrote: >> >> From: Sahara <keun-o.park@windriver.com> >> >> >> >> If kprobe tests run on ARMv6k or ARMv6, there're a number of test >> >> coverage missing failures like: >> > >> > The tests only fail (return an error code) for the coverage tests when >> > compiled for ARMv7 because, obviously, that's the only architecture that >> > can cover all the combinations of instructions. Perhaps we should just >> > disabled the coverage tests pre-ARMv7 kernels to avoid the noisy output >> > you see. >> > >> > I think the best way to look at it is that the coverage tests are test >> > code for the test code, and should only be of concern to people updating >> > the test code. >> > >> > If we go down the route that this patch follows of conditional >> > compilation then we are making the main kernel code more messy in order >> > to support test code and I'm not sure that is a good idea. It will be >> > much worse should someone want to do the same for ARMv5. >> > >> > There is also the problem that once you #ifdef things for ARMv6 then you >> > need an ARMv6 system to test that combination of data structures, >> > whereas at the moment an ARMv7 board will cover everything. >> > >> > -- >> > Tixy >> >> Hi Jon, >> I see. You're worried about the main kernel code being tainted by adding more >> test code for test. To keep the clean decode table without #ifdef, >> most modified codes in >> arch/arm/kernel/kprobes-arm.c may be removed. architectures without >> But, in order to keep consistency supporting 'nop', I think at least we still >> need to add patches for 'nop' in arch/arm/kernel/kprobes-test.c and >> kprobes-test.h. >> It doesn't look good 'nop' is used by default like TEST_INSTRUCTION() >> while TEST('nop') is >> excluded in kprobe_arm_test_cases. > > I hate to sound overly awkward, but I'm not sure I agree with this > either :-) When building for architectures without a proper NOP > instructions the assembler will treat it as a pseudo-instruction > equivalent to MOV R0,R0 in ARM code and MOV R8,R8 in Thumb code. So it > doesn't seem worth adding an explicit macro to do this if the assembler > already does it anyway. > > -- > Tixy > Ah.. I see. What I missed was whether the assembler treat nop as a pseudo-instruction or not. If so, it's ok with that. I agree with you. Thanks. -- Kpark > >
diff --git a/arch/arm/kernel/kprobes-arm.c b/arch/arm/kernel/kprobes-arm.c index 8a30c89..324fd22 100644 --- a/arch/arm/kernel/kprobes-arm.c +++ b/arch/arm/kernel/kprobes-arm.c @@ -495,10 +495,13 @@ static const union decode_item arm_cccc_0000_____1001_table[] = { /* MLA cccc 0000 0010 xxxx xxxx xxxx 1001 xxxx */ /* MLAS cccc 0000 0011 xxxx xxxx xxxx 1001 xxxx */ - DECODE_OR (0x0fe000f0, 0x00200090), + DECODE_EMULATEX (0x0fe000f0, 0x00200090, emulate_rd16rn12rm0rs8_rwflags_nopc, + REGS(NOPC, NOPC, NOPC, 0, NOPC)), +#if __LINUX_ARM_ARCH__ >= 7 /* MLS cccc 0000 0110 xxxx xxxx xxxx 1001 xxxx */ DECODE_EMULATEX (0x0ff000f0, 0x00600090, emulate_rd16rn12rm0rs8_rwflags_nopc, REGS(NOPC, NOPC, NOPC, 0, NOPC)), +#endif /* UMAAL cccc 0000 0100 xxxx xxxx xxxx 1001 xxxx */ DECODE_OR (0x0ff000f0, 0x00400090), @@ -533,12 +536,14 @@ static const union decode_item arm_cccc_0001_____1001_table[] = { static const union decode_item arm_cccc_000x_____1xx1_table[] = { /* Extra load/store instructions */ +#if __LINUX_ARM_ARCH__ >= 7 /* STRHT cccc 0000 xx10 xxxx xxxx xxxx 1011 xxxx */ /* ??? cccc 0000 xx10 xxxx xxxx xxxx 11x1 xxxx */ /* LDRHT cccc 0000 xx11 xxxx xxxx xxxx 1011 xxxx */ /* LDRSBT cccc 0000 xx11 xxxx xxxx xxxx 1101 xxxx */ /* LDRSHT cccc 0000 xx11 xxxx xxxx xxxx 1111 xxxx */ DECODE_REJECT (0x0f200090, 0x00200090), +#endif /* LDRD/STRD lr,pc,{... cccc 000x x0x0 xxxx 111x xxxx 1101 xxxx */ DECODE_REJECT (0x0e10e0d0, 0x0000e0d0), @@ -641,11 +646,14 @@ static const union decode_item arm_cccc_000x_table[] = { static const union decode_item arm_cccc_001x_table[] = { /* Data-processing (immediate) */ +#if __LINUX_ARM_ARCH__ >= 7 /* MOVW cccc 0011 0000 xxxx xxxx xxxx xxxx xxxx */ /* MOVT cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx */ DECODE_EMULATEX (0x0fb00000, 0x03000000, emulate_rd12rm0_noflags_nopc, REGS(0, NOPC, 0, 0, 0)), +#endif +#if (__LINUX_ARM_ARCH__ >= 7) || defined(CONFIG_CPU_32v6K) /* YIELD cccc 0011 0010 0000 xxxx xxxx 0000 0001 */ DECODE_OR (0x0fff00ff, 0x03200001), /* SEV cccc 0011 0010 0000 xxxx xxxx 0000 0100 */ @@ -654,7 +662,9 @@ static const union decode_item arm_cccc_001x_table[] = { /* WFE cccc 0011 0010 0000 xxxx xxxx 0000 0010 */ /* WFI cccc 0011 0010 0000 xxxx xxxx 0000 0011 */ DECODE_SIMULATE (0x0fff00fc, 0x03200000, kprobe_simulate_nop), - /* DBG cccc 0011 0010 0000 xxxx xxxx ffff xxxx */ + /* DBG cccc 0011 0010 0000 xxxx xxxx 1111 xxxx */ + DECODE_REJECT (0x0fb000f0, 0x032000f0), +#endif /* unallocated hints cccc 0011 0010 0000 xxxx xxxx xxxx xxxx */ /* MSR (immediate) cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx */ DECODE_REJECT (0x0fb00000, 0x03200000), @@ -712,6 +722,7 @@ static const union decode_item arm_cccc_0110_____xxx1_table[] = { DECODE_EMULATEX (0x0fb00070, 0x06b00030, emulate_rd12rm0_noflags_nopc, REGS(0, NOPC, 0, 0, NOPC)), +#if __LINUX_ARM_ARCH__ >= 7 /* ??? cccc 0110 0x00 xxxx xxxx xxxx xxx1 xxxx */ DECODE_REJECT (0x0fb00010, 0x06000010), /* ??? cccc 0110 0xxx xxxx xxxx xxxx 1011 xxxx */ @@ -756,6 +767,7 @@ static const union decode_item arm_cccc_0110_____xxx1_table[] = { /* UHSUB8 cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx */ DECODE_EMULATEX (0x0f800010, 0x06000010, emulate_rd12rn16rm0_rwflags_nopc, REGS(NOPC, NOPC, 0, 0, NOPC)), +#endif /* PKHBT cccc 0110 1000 xxxx xxxx xxxx x001 xxxx */ /* PKHTB cccc 0110 1000 xxxx xxxx xxxx x101 xxxx */ @@ -790,8 +802,10 @@ static const union decode_item arm_cccc_0110_____xxx1_table[] = { static const union decode_item arm_cccc_0111_____xxx1_table[] = { /* Media instructions */ +#if __LINUX_ARM_ARCH__ >= 7 /* UNDEFINED cccc 0111 1111 xxxx xxxx xxxx 1111 xxxx */ DECODE_REJECT (0x0ff000f0, 0x07f000f0), +#endif /* SMLALD cccc 0111 0100 xxxx xxxx xxxx 00x1 xxxx */ /* SMLSLD cccc 0111 0100 xxxx xxxx xxxx 01x1 xxxx */ @@ -820,6 +834,7 @@ static const union decode_item arm_cccc_0111_____xxx1_table[] = { DECODE_EMULATEX (0x0ff000d0, 0x075000d0, emulate_rd16rn12rm0rs8_rwflags_nopc, REGS(NOPC, NOPC, NOPC, 0, NOPC)), +#if __LINUX_ARM_ARCH__ >= 7 /* SBFX cccc 0111 101x xxxx xxxx xxxx x101 xxxx */ /* UBFX cccc 0111 111x xxxx xxxx xxxx x101 xxxx */ DECODE_EMULATEX (0x0fa00070, 0x07a00050, emulate_rd12rm0_noflags_nopc, @@ -832,6 +847,7 @@ static const union decode_item arm_cccc_0111_____xxx1_table[] = { /* BFI cccc 0111 110x xxxx xxxx xxxx x001 xxxx */ DECODE_EMULATEX (0x0fe00070, 0x07c00010, emulate_rd12rm0_noflags_nopc, REGS(0, NOPC, 0, 0, NOPCX)), +#endif DECODE_END }; diff --git a/arch/arm/kernel/kprobes-test-arm.c b/arch/arm/kernel/kprobes-test-arm.c index 8393129..850b7b9 100644 --- a/arch/arm/kernel/kprobes-test-arm.c +++ b/arch/arm/kernel/kprobes-test-arm.c @@ -353,6 +353,9 @@ void kprobe_arm_test_cases(void) TEST_RRR( "mlahi r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"") TEST_RR( "mla lr, r",1, VAL2,", r",2, VAL3,", r13") TEST_UNSUPPORTED(".word 0xe02f3291 @ mla pc, r1, r2, r3") + TEST_UNSUPPORTED(".word 0xe020329f @ mla r0, pc, r2, r3") + TEST_UNSUPPORTED(".word 0xe0203f91 @ mla r0, r1, pc, r3") + TEST_UNSUPPORTED(".word 0xe020f291 @ mla r0, r1, r2, pc") TEST_RRR( "mlas r0, r",1, VAL1,", r",2, VAL2,", r",3, VAL3,"") TEST_RRR( "mlahis r7, r",8, VAL3,", r",9, VAL1,", r",10, VAL2,"") TEST_RR( "mlas lr, r",1, VAL2,", r",2, VAL3,", r13") diff --git a/arch/arm/kernel/kprobes-test.c b/arch/arm/kernel/kprobes-test.c index 0cd63d0..0651fd6 100644 --- a/arch/arm/kernel/kprobes-test.c +++ b/arch/arm/kernel/kprobes-test.c @@ -478,7 +478,7 @@ static int run_api_tests(long (*func)(long, long)) static void __naked benchmark_nop(void) { __asm__ __volatile__ ( - "nop \n\t" + NOP" \n\t" "bx lr" ); } diff --git a/arch/arm/kernel/kprobes-test.h b/arch/arm/kernel/kprobes-test.h index e28a869..24822f0 100644 --- a/arch/arm/kernel/kprobes-test.h +++ b/arch/arm/kernel/kprobes-test.h @@ -144,20 +144,26 @@ struct test_arg_end { ".code "TEST_ISA" \n\t" \ "0: \n\t" +#if (__LINUX_ARM_ARCH__ >= 7) || defined(CONFIG_CPU_32v6K) +#define NOP "nop" +#else +#define NOP "mov r0, r0" +#endif + #define TEST_INSTRUCTION(instruction) \ - "50: nop \n\t" \ + "50: "NOP" \n\t" \ "1: "instruction" \n\t" \ - " nop \n\t" + " "NOP" \n\t" #define TEST_BRANCH_F(instruction) \ TEST_INSTRUCTION(instruction) \ " b 99f \n\t" \ - "2: nop \n\t" + "2: "NOP" \n\t" #define TEST_BRANCH_B(instruction) \ " b 50f \n\t" \ " b 99f \n\t" \ - "2: nop \n\t" \ + "2: "NOP" \n\t" \ " b 99f \n\t" \ TEST_INSTRUCTION(instruction) @@ -166,12 +172,12 @@ struct test_arg_end { " b 99f \n\t" \ codex" \n\t" \ " b 99f \n\t" \ - "2: nop \n\t" + "2: "NOP" \n\t" #define TEST_BRANCH_BX(instruction, codex) \ " b 50f \n\t" \ " b 99f \n\t" \ - "2: nop \n\t" \ + "2: "NOP" \n\t" \ " b 99f \n\t" \ codex" \n\t" \ TEST_INSTRUCTION(instruction)