aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Medhurst (Tixy) <tixy@linaro.org>2015-01-05 06:29:29 -0500
committerJon Medhurst <tixy@linaro.org>2015-01-13 11:10:16 -0500
commit8d257e95a9e643518e72232bf852b054a3d06c95 (patch)
treebd73938c1d1980917b7eaa1d8f77ec8bb06d8f5d
parenta0266c214fab21371a499e6ab1c9385cc6589189 (diff)
ARM: kprobes: Add test cases for stack consuming instructions
These have extra 'checker' functions associated with them so lets make sure those get covered by testing. As they may create uninitialised space on the stack we also update the test code to ensure such space is consistent between test runs. This is done by disabling interrupts in setup_test_context(). Signed-off-by: Jon Medhurst <tixy@linaro.org>
-rw-r--r--arch/arm/probes/kprobes/test-arm.c17
-rw-r--r--arch/arm/probes/kprobes/test-core.c9
-rw-r--r--arch/arm/probes/kprobes/test-thumb.c12
3 files changed, 36 insertions, 2 deletions
diff --git a/arch/arm/probes/kprobes/test-arm.c b/arch/arm/probes/kprobes/test-arm.c
index fdeb300b0fc8..9b3b1b4a0939 100644
--- a/arch/arm/probes/kprobes/test-arm.c
+++ b/arch/arm/probes/kprobes/test-arm.c
@@ -12,6 +12,7 @@
12#include <linux/module.h> 12#include <linux/module.h>
13#include <asm/system_info.h> 13#include <asm/system_info.h>
14#include <asm/opcodes.h> 14#include <asm/opcodes.h>
15#include <asm/probes.h>
15 16
16#include "test-core.h" 17#include "test-core.h"
17 18
@@ -478,6 +479,7 @@ void kprobe_arm_test_cases(void)
478 TEST_RPR( "strh r",0, VAL1,", [r",1, 48,", -r",2, 24,"]") 479 TEST_RPR( "strh r",0, VAL1,", [r",1, 48,", -r",2, 24,"]")
479 TEST_RPR( "streqh r",14,VAL2,", [r",11,0, ", r",12, 48,"]") 480 TEST_RPR( "streqh r",14,VAL2,", [r",11,0, ", r",12, 48,"]")
480 TEST_UNSUPPORTED( "streqh r14, [r13, r12]") 481 TEST_UNSUPPORTED( "streqh r14, [r13, r12]")
482 TEST_UNSUPPORTED( "streqh r14, [r12, r13]")
481 TEST_RPR( "strh r",1, VAL1,", [r",2, 24,", r",3, 48,"]!") 483 TEST_RPR( "strh r",1, VAL1,", [r",2, 24,", r",3, 48,"]!")
482 TEST_RPR( "strneh r",12,VAL2,", [r",11,48,", -r",10,24,"]!") 484 TEST_RPR( "strneh r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
483 TEST_RPR( "strh r",2, VAL1,", [r",3, 24,"], r",4, 48,"") 485 TEST_RPR( "strh r",2, VAL1,", [r",3, 24,"], r",4, 48,"")
@@ -502,6 +504,9 @@ void kprobe_arm_test_cases(void)
502 TEST_RP( "strplh r",12,VAL2,", [r",11,24,", #-4]!") 504 TEST_RP( "strplh r",12,VAL2,", [r",11,24,", #-4]!")
503 TEST_RP( "strh r",2, VAL1,", [r",3, 24,"], #48") 505 TEST_RP( "strh r",2, VAL1,", [r",3, 24,"], #48")
504 TEST_RP( "strh r",10,VAL2,", [r",9, 64,"], #-48") 506 TEST_RP( "strh r",10,VAL2,", [r",9, 64,"], #-48")
507 TEST_RP( "strh r",3, VAL1,", [r",13,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!")
508 TEST_UNSUPPORTED("strh r3, [r13, #-"__stringify(MAX_STACK_SIZE)"-8]!")
509 TEST_RP( "strh r",4, VAL1,", [r",14,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"-8]!")
505 TEST_UNSUPPORTED(__inst_arm(0xe1efc3b0) " @ strh r12, [pc, #48]!") 510 TEST_UNSUPPORTED(__inst_arm(0xe1efc3b0) " @ strh r12, [pc, #48]!")
506 TEST_UNSUPPORTED(__inst_arm(0xe0c9f3b0) " @ strh pc, [r9], #48") 511 TEST_UNSUPPORTED(__inst_arm(0xe0c9f3b0) " @ strh pc, [r9], #48")
507 512
@@ -568,6 +573,7 @@ void kprobe_arm_test_cases(void)
568 TEST_RPR( "strd r",0, VAL1,", [r",1, 48,", -r",2,24,"]") 573 TEST_RPR( "strd r",0, VAL1,", [r",1, 48,", -r",2,24,"]")
569 TEST_RPR( "strccd r",8, VAL2,", [r",11,0, ", r",12,48,"]") 574 TEST_RPR( "strccd r",8, VAL2,", [r",11,0, ", r",12,48,"]")
570 TEST_UNSUPPORTED( "strccd r8, [r13, r12]") 575 TEST_UNSUPPORTED( "strccd r8, [r13, r12]")
576 TEST_UNSUPPORTED( "strccd r8, [r12, r13]")
571 TEST_RPR( "strd r",4, VAL1,", [r",2, 24,", r",3, 48,"]!") 577 TEST_RPR( "strd r",4, VAL1,", [r",2, 24,", r",3, 48,"]!")
572 TEST_RPR( "strcsd r",12,VAL2,", [r",11,48,", -r",10,24,"]!") 578 TEST_RPR( "strcsd r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
573 TEST_RPR( "strd r",2, VAL1,", [r",5, 24,"], r",4,48,"") 579 TEST_RPR( "strd r",2, VAL1,", [r",5, 24,"], r",4,48,"")
@@ -591,6 +597,9 @@ void kprobe_arm_test_cases(void)
591 TEST_RP( "strvcd r",12,VAL2,", [r",11,24,", #-16]!") 597 TEST_RP( "strvcd r",12,VAL2,", [r",11,24,", #-16]!")
592 TEST_RP( "strd r",2, VAL1,", [r",4, 24,"], #48") 598 TEST_RP( "strd r",2, VAL1,", [r",4, 24,"], #48")
593 TEST_RP( "strd r",10,VAL2,", [r",9, 64,"], #-48") 599 TEST_RP( "strd r",10,VAL2,", [r",9, 64,"], #-48")
600 TEST_RP( "strd r",6, VAL1,", [r",13,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!")
601 TEST_UNSUPPORTED("strd r6, [r13, #-"__stringify(MAX_STACK_SIZE)"-8]!")
602 TEST_RP( "strd r",4, VAL1,", [r",12,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"-8]!")
594 TEST_UNSUPPORTED(__inst_arm(0xe1efc3f0) " @ strd r12, [pc, #48]!") 603 TEST_UNSUPPORTED(__inst_arm(0xe1efc3f0) " @ strd r12, [pc, #48]!")
595 604
596 TEST_P( "ldrd r0, [r",0, 24,", #-8]") 605 TEST_P( "ldrd r0, [r",0, 24,", #-8]")
@@ -639,16 +648,20 @@ void kprobe_arm_test_cases(void)
639 TEST_RP( "str"byte" r",12,VAL2,", [r",11,24,", #-4]!") \ 648 TEST_RP( "str"byte" r",12,VAL2,", [r",11,24,", #-4]!") \
640 TEST_RP( "str"byte" r",2, VAL1,", [r",3, 24,"], #48") \ 649 TEST_RP( "str"byte" r",2, VAL1,", [r",3, 24,"], #48") \
641 TEST_RP( "str"byte" r",10,VAL2,", [r",9, 64,"], #-48") \ 650 TEST_RP( "str"byte" r",10,VAL2,", [r",9, 64,"], #-48") \
651 TEST_RP( "str"byte" r",3, VAL1,", [r",13,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!") \
652 TEST_UNSUPPORTED("str"byte" r3, [r13, #-"__stringify(MAX_STACK_SIZE)"-8]!") \
653 TEST_RP( "str"byte" r",4, VAL1,", [r",10,TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"-8]!") \
642 TEST_RPR("str"byte" r",0, VAL1,", [r",1, 48,", -r",2, 24,"]") \ 654 TEST_RPR("str"byte" r",0, VAL1,", [r",1, 48,", -r",2, 24,"]") \
643 TEST_RPR("str"byte" r",14,VAL2,", [r",11,0, ", r",12, 48,"]") \ 655 TEST_RPR("str"byte" r",14,VAL2,", [r",11,0, ", r",12, 48,"]") \
644 TEST_UNSUPPORTED("str"byte" r14, [r13, r12]") \ 656 TEST_UNSUPPORTED("str"byte" r14, [r13, r12]") \
657 TEST_UNSUPPORTED("str"byte" r14, [r12, r13]") \
645 TEST_RPR("str"byte" r",1, VAL1,", [r",2, 24,", r",3, 48,"]!") \ 658 TEST_RPR("str"byte" r",1, VAL1,", [r",2, 24,", r",3, 48,"]!") \
646 TEST_RPR("str"byte" r",12,VAL2,", [r",11,48,", -r",10,24,"]!") \ 659 TEST_RPR("str"byte" r",12,VAL2,", [r",11,48,", -r",10,24,"]!") \
647 TEST_RPR("str"byte" r",2, VAL1,", [r",3, 24,"], r",4, 48,"") \ 660 TEST_RPR("str"byte" r",2, VAL1,", [r",3, 24,"], r",4, 48,"") \
648 TEST_RPR("str"byte" r",10,VAL2,", [r",9, 48,"], -r",11,24,"") \ 661 TEST_RPR("str"byte" r",10,VAL2,", [r",9, 48,"], -r",11,24,"") \
649 TEST_RPR("str"byte" r",0, VAL1,", [r",1, 24,", r",2, 32,", asl #1]")\ 662 TEST_RPR("str"byte" r",0, VAL1,", [r",1, 24,", r",2, 32,", asl #1]")\
650 TEST_RPR("str"byte" r",14,VAL2,", [r",11,0, ", r",12, 32,", lsr #2]")\ 663 TEST_RPR("str"byte" r",14,VAL2,", [r",11,0, ", r",12, 32,", lsr #2]")\
651 TEST_UNSUPPORTED("str"byte" r14, [r13, r12, lsr #2]")\ 664 TEST_UNSUPPORTED("str"byte" r14, [r13, r12, lsr #2]") \
652 TEST_RPR("str"byte" r",1, VAL1,", [r",2, 24,", r",3, 32,", asr #3]!")\ 665 TEST_RPR("str"byte" r",1, VAL1,", [r",2, 24,", r",3, 32,", asr #3]!")\
653 TEST_RPR("str"byte" r",12,VAL2,", [r",11,24,", r",10, 4,", ror #31]!")\ 666 TEST_RPR("str"byte" r",12,VAL2,", [r",11,24,", r",10, 4,", ror #31]!")\
654 TEST_P( "ldr"byte" r0, [r",0, 24,", #-2]") \ 667 TEST_P( "ldr"byte" r0, [r",0, 24,", #-2]") \
diff --git a/arch/arm/probes/kprobes/test-core.c b/arch/arm/probes/kprobes/test-core.c
index 7ab633d51954..7c5ddd5a6afd 100644
--- a/arch/arm/probes/kprobes/test-core.c
+++ b/arch/arm/probes/kprobes/test-core.c
@@ -1196,6 +1196,13 @@ static void setup_test_context(struct pt_regs *regs)
1196 regs->uregs[arg->reg] = 1196 regs->uregs[arg->reg] =
1197 (unsigned long)current_stack + arg->val; 1197 (unsigned long)current_stack + arg->val;
1198 memory_needs_checking = true; 1198 memory_needs_checking = true;
1199 /*
1200 * Test memory at an address below SP is in danger of
1201 * being altered by an interrupt occurring and pushing
1202 * data onto the stack. Disable interrupts to stop this.
1203 */
1204 if (arg->reg == 13)
1205 regs->ARM_cpsr |= PSR_I_BIT;
1199 break; 1206 break;
1200 } 1207 }
1201 case ARG_TYPE_MEM: { 1208 case ARG_TYPE_MEM: {
@@ -1272,6 +1279,8 @@ test_after_pre_handler(struct kprobe *p, struct pt_regs *regs)
1272 1279
1273 /* Undo any changes done to SP by the test case */ 1280 /* Undo any changes done to SP by the test case */
1274 regs->ARM_sp = (unsigned long)current_stack; 1281 regs->ARM_sp = (unsigned long)current_stack;
1282 /* Enable interrupts in case setup_test_context disabled them */
1283 regs->ARM_cpsr &= ~PSR_I_BIT;
1275 1284
1276 container_of(p, struct test_probe, kprobe)->hit = test_instance; 1285 container_of(p, struct test_probe, kprobe)->hit = test_instance;
1277 return 0; 1286 return 0;
diff --git a/arch/arm/probes/kprobes/test-thumb.c b/arch/arm/probes/kprobes/test-thumb.c
index 6c6e9a9bb675..e8cf193db1ea 100644
--- a/arch/arm/probes/kprobes/test-thumb.c
+++ b/arch/arm/probes/kprobes/test-thumb.c
@@ -11,6 +11,7 @@
11#include <linux/kernel.h> 11#include <linux/kernel.h>
12#include <linux/module.h> 12#include <linux/module.h>
13#include <asm/opcodes.h> 13#include <asm/opcodes.h>
14#include <asm/probes.h>
14 15
15#include "test-core.h" 16#include "test-core.h"
16 17
@@ -416,6 +417,9 @@ void kprobe_thumb32_test_cases(void)
416 TEST_RR( "strd r",14,VAL2,", r",12,VAL1,", [sp, #16]!") 417 TEST_RR( "strd r",14,VAL2,", r",12,VAL1,", [sp, #16]!")
417 TEST_RRP("strd r",1, VAL1,", r",0, VAL2,", [r",7, 24,"], #16") 418 TEST_RRP("strd r",1, VAL1,", r",0, VAL2,", [r",7, 24,"], #16")
418 TEST_RR( "strd r",7, VAL2,", r",8, VAL1,", [sp], #-16") 419 TEST_RR( "strd r",7, VAL2,", r",8, VAL1,", [sp], #-16")
420 TEST_RRP("strd r",6, VAL1,", r",7, VAL2,", [r",13, TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!")
421 TEST_UNSUPPORTED("strd r6, r7, [r13, #-"__stringify(MAX_STACK_SIZE)"-8]!")
422 TEST_RRP("strd r",4, VAL1,", r",5, VAL2,", [r",14, TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"-8]!")
419 TEST_UNSUPPORTED(__inst_thumb32(0xe9efec04) " @ strd r14, r12, [pc, #16]!") 423 TEST_UNSUPPORTED(__inst_thumb32(0xe9efec04) " @ strd r14, r12, [pc, #16]!")
420 TEST_UNSUPPORTED(__inst_thumb32(0xe8efec04) " @ strd r14, r12, [pc], #16") 424 TEST_UNSUPPORTED(__inst_thumb32(0xe8efec04) " @ strd r14, r12, [pc], #16")
421 425
@@ -821,14 +825,22 @@ CONDITION_INSTRUCTIONS(22,
821 TEST_RP( "str"size" r",14,VAL2,", [r",1, 256, ", #-128]!") \ 825 TEST_RP( "str"size" r",14,VAL2,", [r",1, 256, ", #-128]!") \
822 TEST_RPR("str"size".w r",0, VAL1,", [r",1, 0,", r",2, 4,"]") \ 826 TEST_RPR("str"size".w r",0, VAL1,", [r",1, 0,", r",2, 4,"]") \
823 TEST_RPR("str"size" r",14,VAL2,", [r",10,0,", r",11,4,", lsl #1]") \ 827 TEST_RPR("str"size" r",14,VAL2,", [r",10,0,", r",11,4,", lsl #1]") \
828 TEST_UNSUPPORTED("str"size" r0, [r13, r1]") \
824 TEST_R( "str"size".w r",7, VAL1,", [sp, #24]") \ 829 TEST_R( "str"size".w r",7, VAL1,", [sp, #24]") \
825 TEST_RP( "str"size".w r",0, VAL2,", [r",0,0, "]") \ 830 TEST_RP( "str"size".w r",0, VAL2,", [r",0,0, "]") \
831 TEST_RP( "str"size" r",6, VAL1,", [r",13, TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"]!") \
832 TEST_UNSUPPORTED("str"size" r6, [r13, #-"__stringify(MAX_STACK_SIZE)"-8]!") \
833 TEST_RP( "str"size" r",4, VAL2,", [r",12, TEST_MEMORY_SIZE,", #-"__stringify(MAX_STACK_SIZE)"-8]!") \
826 TEST_UNSUPPORTED("str"size"t r0, [r1, #4]") 834 TEST_UNSUPPORTED("str"size"t r0, [r1, #4]")
827 835
828 SINGLE_STORE("b") 836 SINGLE_STORE("b")
829 SINGLE_STORE("h") 837 SINGLE_STORE("h")
830 SINGLE_STORE("") 838 SINGLE_STORE("")
831 839
840 TEST_UNSUPPORTED(__inst_thumb32(0xf801000d) " @ strb r0, [r1, r13]")
841 TEST_UNSUPPORTED(__inst_thumb32(0xf821000d) " @ strh r0, [r1, r13]")
842 TEST_UNSUPPORTED(__inst_thumb32(0xf841000d) " @ str r0, [r1, r13]")
843
832 TEST("str sp, [sp]") 844 TEST("str sp, [sp]")
833 TEST_UNSUPPORTED(__inst_thumb32(0xf8cfe000) " @ str r14, [pc]") 845 TEST_UNSUPPORTED(__inst_thumb32(0xf8cfe000) " @ str r14, [pc]")
834 TEST_UNSUPPORTED(__inst_thumb32(0xf8cef000) " @ str pc, [r14]") 846 TEST_UNSUPPORTED(__inst_thumb32(0xf8cef000) " @ str pc, [r14]")