diff options
-rw-r--r-- | arch/arm/probes/kprobes/test-arm.c | 17 | ||||
-rw-r--r-- | arch/arm/probes/kprobes/test-core.c | 9 | ||||
-rw-r--r-- | arch/arm/probes/kprobes/test-thumb.c | 12 |
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]") |