1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200#include <linux/kernel.h>
201#include <linux/module.h>
202#include <linux/slab.h>
203#include <linux/kprobes.h>
204#include <linux/errno.h>
205#include <linux/stddef.h>
206#include <linux/bug.h>
207#include <asm/opcodes.h>
208
209#include "kprobes.h"
210#include "probes-arm.h"
211#include "probes-thumb.h"
212#include "kprobes-test.h"
213
214
215#define BENCHMARKING 1
216
217
218
219
220
221
222static bool test_regs_ok;
223static int test_func_instance;
224static int pre_handler_called;
225static int post_handler_called;
226static int jprobe_func_called;
227static int kretprobe_handler_called;
228
229#define FUNC_ARG1 0x12345678
230#define FUNC_ARG2 0xabcdef
231
232
233#ifndef CONFIG_THUMB2_KERNEL
234
235long arm_func(long r0, long r1);
236
237static void __used __naked __arm_kprobes_test_func(void)
238{
239 __asm__ __volatile__ (
240 ".arm \n\t"
241 ".type arm_func, %%function \n\t"
242 "arm_func: \n\t"
243 "adds r0, r0, r1 \n\t"
244 "bx lr \n\t"
245 ".code "NORMAL_ISA
246 : : : "r0", "r1", "cc"
247 );
248}
249
250#else
251
252long thumb16_func(long r0, long r1);
253long thumb32even_func(long r0, long r1);
254long thumb32odd_func(long r0, long r1);
255
256static void __used __naked __thumb_kprobes_test_funcs(void)
257{
258 __asm__ __volatile__ (
259 ".type thumb16_func, %%function \n\t"
260 "thumb16_func: \n\t"
261 "adds.n r0, r0, r1 \n\t"
262 "bx lr \n\t"
263
264 ".align \n\t"
265 ".type thumb32even_func, %%function \n\t"
266 "thumb32even_func: \n\t"
267 "adds.w r0, r0, r1 \n\t"
268 "bx lr \n\t"
269
270 ".align \n\t"
271 "nop.n \n\t"
272 ".type thumb32odd_func, %%function \n\t"
273 "thumb32odd_func: \n\t"
274 "adds.w r0, r0, r1 \n\t"
275 "bx lr \n\t"
276
277 : : : "r0", "r1", "cc"
278 );
279}
280
281#endif
282
283
284static int call_test_func(long (*func)(long, long), bool check_test_regs)
285{
286 long ret;
287
288 ++test_func_instance;
289 test_regs_ok = false;
290
291 ret = (*func)(FUNC_ARG1, FUNC_ARG2);
292 if (ret != FUNC_ARG1 + FUNC_ARG2) {
293 pr_err("FAIL: call_test_func: func returned %lx\n", ret);
294 return false;
295 }
296
297 if (check_test_regs && !test_regs_ok) {
298 pr_err("FAIL: test regs not OK\n");
299 return false;
300 }
301
302 return true;
303}
304
305static int __kprobes pre_handler(struct kprobe *p, struct pt_regs *regs)
306{
307 pre_handler_called = test_func_instance;
308 if (regs->ARM_r0 == FUNC_ARG1 && regs->ARM_r1 == FUNC_ARG2)
309 test_regs_ok = true;
310 return 0;
311}
312
313static void __kprobes post_handler(struct kprobe *p, struct pt_regs *regs,
314 unsigned long flags)
315{
316 post_handler_called = test_func_instance;
317 if (regs->ARM_r0 != FUNC_ARG1 + FUNC_ARG2 || regs->ARM_r1 != FUNC_ARG2)
318 test_regs_ok = false;
319}
320
321static struct kprobe the_kprobe = {
322 .addr = 0,
323 .pre_handler = pre_handler,
324 .post_handler = post_handler
325};
326
327static int test_kprobe(long (*func)(long, long))
328{
329 int ret;
330
331 the_kprobe.addr = (kprobe_opcode_t *)func;
332 ret = register_kprobe(&the_kprobe);
333 if (ret < 0) {
334 pr_err("FAIL: register_kprobe failed with %d\n", ret);
335 return ret;
336 }
337
338 ret = call_test_func(func, true);
339
340 unregister_kprobe(&the_kprobe);
341 the_kprobe.flags = 0;
342
343 if (!ret)
344 return -EINVAL;
345 if (pre_handler_called != test_func_instance) {
346 pr_err("FAIL: kprobe pre_handler not called\n");
347 return -EINVAL;
348 }
349 if (post_handler_called != test_func_instance) {
350 pr_err("FAIL: kprobe post_handler not called\n");
351 return -EINVAL;
352 }
353 if (!call_test_func(func, false))
354 return -EINVAL;
355 if (pre_handler_called == test_func_instance ||
356 post_handler_called == test_func_instance) {
357 pr_err("FAIL: probe called after unregistering\n");
358 return -EINVAL;
359 }
360
361 return 0;
362}
363
364static void __kprobes jprobe_func(long r0, long r1)
365{
366 jprobe_func_called = test_func_instance;
367 if (r0 == FUNC_ARG1 && r1 == FUNC_ARG2)
368 test_regs_ok = true;
369 jprobe_return();
370}
371
372static struct jprobe the_jprobe = {
373 .entry = jprobe_func,
374};
375
376static int test_jprobe(long (*func)(long, long))
377{
378 int ret;
379
380 the_jprobe.kp.addr = (kprobe_opcode_t *)func;
381 ret = register_jprobe(&the_jprobe);
382 if (ret < 0) {
383 pr_err("FAIL: register_jprobe failed with %d\n", ret);
384 return ret;
385 }
386
387 ret = call_test_func(func, true);
388
389 unregister_jprobe(&the_jprobe);
390 the_jprobe.kp.flags = 0;
391
392 if (!ret)
393 return -EINVAL;
394 if (jprobe_func_called != test_func_instance) {
395 pr_err("FAIL: jprobe handler function not called\n");
396 return -EINVAL;
397 }
398 if (!call_test_func(func, false))
399 return -EINVAL;
400 if (jprobe_func_called == test_func_instance) {
401 pr_err("FAIL: probe called after unregistering\n");
402 return -EINVAL;
403 }
404
405 return 0;
406}
407
408static int __kprobes
409kretprobe_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
410{
411 kretprobe_handler_called = test_func_instance;
412 if (regs_return_value(regs) == FUNC_ARG1 + FUNC_ARG2)
413 test_regs_ok = true;
414 return 0;
415}
416
417static struct kretprobe the_kretprobe = {
418 .handler = kretprobe_handler,
419};
420
421static int test_kretprobe(long (*func)(long, long))
422{
423 int ret;
424
425 the_kretprobe.kp.addr = (kprobe_opcode_t *)func;
426 ret = register_kretprobe(&the_kretprobe);
427 if (ret < 0) {
428 pr_err("FAIL: register_kretprobe failed with %d\n", ret);
429 return ret;
430 }
431
432 ret = call_test_func(func, true);
433
434 unregister_kretprobe(&the_kretprobe);
435 the_kretprobe.kp.flags = 0;
436
437 if (!ret)
438 return -EINVAL;
439 if (kretprobe_handler_called != test_func_instance) {
440 pr_err("FAIL: kretprobe handler not called\n");
441 return -EINVAL;
442 }
443 if (!call_test_func(func, false))
444 return -EINVAL;
445 if (jprobe_func_called == test_func_instance) {
446 pr_err("FAIL: kretprobe called after unregistering\n");
447 return -EINVAL;
448 }
449
450 return 0;
451}
452
453static int run_api_tests(long (*func)(long, long))
454{
455 int ret;
456
457 pr_info(" kprobe\n");
458 ret = test_kprobe(func);
459 if (ret < 0)
460 return ret;
461
462 pr_info(" jprobe\n");
463 ret = test_jprobe(func);
464 if (ret < 0)
465 return ret;
466
467 pr_info(" kretprobe\n");
468 ret = test_kretprobe(func);
469 if (ret < 0)
470 return ret;
471
472 return 0;
473}
474
475
476
477
478
479
480#if BENCHMARKING
481
482static void __naked benchmark_nop(void)
483{
484 __asm__ __volatile__ (
485 "nop \n\t"
486 "bx lr"
487 );
488}
489
490#ifdef CONFIG_THUMB2_KERNEL
491#define wide ".w"
492#else
493#define wide
494#endif
495
496static void __naked benchmark_pushpop1(void)
497{
498 __asm__ __volatile__ (
499 "stmdb"wide" sp!, {r3-r11,lr} \n\t"
500 "ldmia"wide" sp!, {r3-r11,pc}"
501 );
502}
503
504static void __naked benchmark_pushpop2(void)
505{
506 __asm__ __volatile__ (
507 "stmdb"wide" sp!, {r0-r8,lr} \n\t"
508 "ldmia"wide" sp!, {r0-r8,pc}"
509 );
510}
511
512static void __naked benchmark_pushpop3(void)
513{
514 __asm__ __volatile__ (
515 "stmdb"wide" sp!, {r4,lr} \n\t"
516 "ldmia"wide" sp!, {r4,pc}"
517 );
518}
519
520static void __naked benchmark_pushpop4(void)
521{
522 __asm__ __volatile__ (
523 "stmdb"wide" sp!, {r0,lr} \n\t"
524 "ldmia"wide" sp!, {r0,pc}"
525 );
526}
527
528
529#ifdef CONFIG_THUMB2_KERNEL
530
531static void __naked benchmark_pushpop_thumb(void)
532{
533 __asm__ __volatile__ (
534 "push.n {r0-r7,lr} \n\t"
535 "pop.n {r0-r7,pc}"
536 );
537}
538
539#endif
540
541static int __kprobes
542benchmark_pre_handler(struct kprobe *p, struct pt_regs *regs)
543{
544 return 0;
545}
546
547static int benchmark(void(*fn)(void))
548{
549 unsigned n, i, t, t0;
550
551 for (n = 1000; ; n *= 2) {
552 t0 = sched_clock();
553 for (i = n; i > 0; --i)
554 fn();
555 t = sched_clock() - t0;
556 if (t >= 250000000)
557 break;
558 }
559 return t / n;
560};
561
562static int kprobe_benchmark(void(*fn)(void), unsigned offset)
563{
564 struct kprobe k = {
565 .addr = (kprobe_opcode_t *)((uintptr_t)fn + offset),
566 .pre_handler = benchmark_pre_handler,
567 };
568
569 int ret = register_kprobe(&k);
570 if (ret < 0) {
571 pr_err("FAIL: register_kprobe failed with %d\n", ret);
572 return ret;
573 }
574
575 ret = benchmark(fn);
576
577 unregister_kprobe(&k);
578 return ret;
579};
580
581struct benchmarks {
582 void (*fn)(void);
583 unsigned offset;
584 const char *title;
585};
586
587static int run_benchmarks(void)
588{
589 int ret;
590 struct benchmarks list[] = {
591 {&benchmark_nop, 0, "nop"},
592
593
594
595
596
597 {&benchmark_pushpop1, 0, "stmdb sp!, {r3-r11,lr}"},
598 {&benchmark_pushpop1, 4, "ldmia sp!, {r3-r11,pc}"},
599 {&benchmark_pushpop2, 0, "stmdb sp!, {r0-r8,lr}"},
600 {&benchmark_pushpop2, 4, "ldmia sp!, {r0-r8,pc}"},
601 {&benchmark_pushpop3, 0, "stmdb sp!, {r4,lr}"},
602 {&benchmark_pushpop3, 4, "ldmia sp!, {r4,pc}"},
603 {&benchmark_pushpop4, 0, "stmdb sp!, {r0,lr}"},
604 {&benchmark_pushpop4, 4, "ldmia sp!, {r0,pc}"},
605#ifdef CONFIG_THUMB2_KERNEL
606 {&benchmark_pushpop_thumb, 0, "push.n {r0-r7,lr}"},
607 {&benchmark_pushpop_thumb, 2, "pop.n {r0-r7,pc}"},
608#endif
609 {0}
610 };
611
612 struct benchmarks *b;
613 for (b = list; b->fn; ++b) {
614 ret = kprobe_benchmark(b->fn, b->offset);
615 if (ret < 0)
616 return ret;
617 pr_info(" %dns for kprobe %s\n", ret, b->title);
618 }
619
620 pr_info("\n");
621 return 0;
622}
623
624#endif
625
626
627
628
629
630
631static const int decode_struct_sizes[NUM_DECODE_TYPES] = {
632 [DECODE_TYPE_TABLE] = sizeof(struct decode_table),
633 [DECODE_TYPE_CUSTOM] = sizeof(struct decode_custom),
634 [DECODE_TYPE_SIMULATE] = sizeof(struct decode_simulate),
635 [DECODE_TYPE_EMULATE] = sizeof(struct decode_emulate),
636 [DECODE_TYPE_OR] = sizeof(struct decode_or),
637 [DECODE_TYPE_REJECT] = sizeof(struct decode_reject)
638};
639
640static int table_iter(const union decode_item *table,
641 int (*fn)(const struct decode_header *, void *),
642 void *args)
643{
644 const struct decode_header *h = (struct decode_header *)table;
645 int result;
646
647 for (;;) {
648 enum decode_type type = h->type_regs.bits & DECODE_TYPE_MASK;
649
650 if (type == DECODE_TYPE_END)
651 return 0;
652
653 result = fn(h, args);
654 if (result)
655 return result;
656
657 h = (struct decode_header *)
658 ((uintptr_t)h + decode_struct_sizes[type]);
659
660 }
661}
662
663static int table_test_fail(const struct decode_header *h, const char* message)
664{
665
666 pr_err("FAIL: kprobes test failure \"%s\" (mask %08x, value %08x)\n",
667 message, h->mask.bits, h->value.bits);
668 return -EINVAL;
669}
670
671struct table_test_args {
672 const union decode_item *root_table;
673 u32 parent_mask;
674 u32 parent_value;
675};
676
677static int table_test_fn(const struct decode_header *h, void *args)
678{
679 struct table_test_args *a = (struct table_test_args *)args;
680 enum decode_type type = h->type_regs.bits & DECODE_TYPE_MASK;
681
682 if (h->value.bits & ~h->mask.bits)
683 return table_test_fail(h, "Match value has bits not in mask");
684
685 if ((h->mask.bits & a->parent_mask) != a->parent_mask)
686 return table_test_fail(h, "Mask has bits not in parent mask");
687
688 if ((h->value.bits ^ a->parent_value) & a->parent_mask)
689 return table_test_fail(h, "Value is inconsistent with parent");
690
691 if (type == DECODE_TYPE_TABLE) {
692 struct decode_table *d = (struct decode_table *)h;
693 struct table_test_args args2 = *a;
694 args2.parent_mask = h->mask.bits;
695 args2.parent_value = h->value.bits;
696 return table_iter(d->table.table, table_test_fn, &args2);
697 }
698
699 return 0;
700}
701
702static int table_test(const union decode_item *table)
703{
704 struct table_test_args args = {
705 .root_table = table,
706 .parent_mask = 0,
707 .parent_value = 0
708 };
709 return table_iter(args.root_table, table_test_fn, &args);
710}
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730bool coverage_fail;
731
732#define MAX_COVERAGE_ENTRIES 256
733
734struct coverage_entry {
735 const struct decode_header *header;
736 unsigned regs;
737 unsigned nesting;
738 char matched;
739};
740
741struct coverage_table {
742 struct coverage_entry *base;
743 unsigned num_entries;
744 unsigned nesting;
745};
746
747struct coverage_table coverage;
748
749#define COVERAGE_ANY_REG (1<<0)
750#define COVERAGE_SP (1<<1)
751#define COVERAGE_PC (1<<2)
752#define COVERAGE_PCWB (1<<3)
753
754static const char coverage_register_lookup[16] = {
755 [REG_TYPE_ANY] = COVERAGE_ANY_REG | COVERAGE_SP | COVERAGE_PC,
756 [REG_TYPE_SAMEAS16] = COVERAGE_ANY_REG,
757 [REG_TYPE_SP] = COVERAGE_SP,
758 [REG_TYPE_PC] = COVERAGE_PC,
759 [REG_TYPE_NOSP] = COVERAGE_ANY_REG | COVERAGE_SP,
760 [REG_TYPE_NOSPPC] = COVERAGE_ANY_REG | COVERAGE_SP | COVERAGE_PC,
761 [REG_TYPE_NOPC] = COVERAGE_ANY_REG | COVERAGE_PC,
762 [REG_TYPE_NOPCWB] = COVERAGE_ANY_REG | COVERAGE_PC | COVERAGE_PCWB,
763 [REG_TYPE_NOPCX] = COVERAGE_ANY_REG,
764 [REG_TYPE_NOSPPCX] = COVERAGE_ANY_REG | COVERAGE_SP,
765};
766
767unsigned coverage_start_registers(const struct decode_header *h)
768{
769 unsigned regs = 0;
770 int i;
771 for (i = 0; i < 20; i += 4) {
772 int r = (h->type_regs.bits >> (DECODE_TYPE_BITS + i)) & 0xf;
773 regs |= coverage_register_lookup[r] << i;
774 }
775 return regs;
776}
777
778static int coverage_start_fn(const struct decode_header *h, void *args)
779{
780 struct coverage_table *coverage = (struct coverage_table *)args;
781 enum decode_type type = h->type_regs.bits & DECODE_TYPE_MASK;
782 struct coverage_entry *entry = coverage->base + coverage->num_entries;
783
784 if (coverage->num_entries == MAX_COVERAGE_ENTRIES - 1) {
785 pr_err("FAIL: Out of space for test coverage data");
786 return -ENOMEM;
787 }
788
789 ++coverage->num_entries;
790
791 entry->header = h;
792 entry->regs = coverage_start_registers(h);
793 entry->nesting = coverage->nesting;
794 entry->matched = false;
795
796 if (type == DECODE_TYPE_TABLE) {
797 struct decode_table *d = (struct decode_table *)h;
798 int ret;
799 ++coverage->nesting;
800 ret = table_iter(d->table.table, coverage_start_fn, coverage);
801 --coverage->nesting;
802 return ret;
803 }
804
805 return 0;
806}
807
808static int coverage_start(const union decode_item *table)
809{
810 coverage.base = kmalloc(MAX_COVERAGE_ENTRIES *
811 sizeof(struct coverage_entry), GFP_KERNEL);
812 coverage.num_entries = 0;
813 coverage.nesting = 0;
814 return table_iter(table, coverage_start_fn, &coverage);
815}
816
817static void
818coverage_add_registers(struct coverage_entry *entry, kprobe_opcode_t insn)
819{
820 int regs = entry->header->type_regs.bits >> DECODE_TYPE_BITS;
821 int i;
822 for (i = 0; i < 20; i += 4) {
823 enum decode_reg_type reg_type = (regs >> i) & 0xf;
824 int reg = (insn >> i) & 0xf;
825 int flag;
826
827 if (!reg_type)
828 continue;
829
830 if (reg == 13)
831 flag = COVERAGE_SP;
832 else if (reg == 15)
833 flag = COVERAGE_PC;
834 else
835 flag = COVERAGE_ANY_REG;
836 entry->regs &= ~(flag << i);
837
838 switch (reg_type) {
839
840 case REG_TYPE_NONE:
841 case REG_TYPE_ANY:
842 case REG_TYPE_SAMEAS16:
843 break;
844
845 case REG_TYPE_SP:
846 if (reg != 13)
847 return;
848 break;
849
850 case REG_TYPE_PC:
851 if (reg != 15)
852 return;
853 break;
854
855 case REG_TYPE_NOSP:
856 if (reg == 13)
857 return;
858 break;
859
860 case REG_TYPE_NOSPPC:
861 case REG_TYPE_NOSPPCX:
862 if (reg == 13 || reg == 15)
863 return;
864 break;
865
866 case REG_TYPE_NOPCWB:
867 if (!is_writeback(insn))
868 break;
869 if (reg == 15) {
870 entry->regs &= ~(COVERAGE_PCWB << i);
871 return;
872 }
873 break;
874
875 case REG_TYPE_NOPC:
876 case REG_TYPE_NOPCX:
877 if (reg == 15)
878 return;
879 break;
880 }
881
882 }
883}
884
885static void coverage_add(kprobe_opcode_t insn)
886{
887 struct coverage_entry *entry = coverage.base;
888 struct coverage_entry *end = coverage.base + coverage.num_entries;
889 bool matched = false;
890 unsigned nesting = 0;
891
892 for (; entry < end; ++entry) {
893 const struct decode_header *h = entry->header;
894 enum decode_type type = h->type_regs.bits & DECODE_TYPE_MASK;
895
896 if (entry->nesting > nesting)
897 continue;
898
899 if (entry->nesting < nesting)
900 break;
901
902 if (!matched) {
903 if ((insn & h->mask.bits) != h->value.bits)
904 continue;
905 entry->matched = true;
906 }
907
908 switch (type) {
909
910 case DECODE_TYPE_TABLE:
911 ++nesting;
912 break;
913
914 case DECODE_TYPE_CUSTOM:
915 case DECODE_TYPE_SIMULATE:
916 case DECODE_TYPE_EMULATE:
917 coverage_add_registers(entry, insn);
918 return;
919
920 case DECODE_TYPE_OR:
921 matched = true;
922 break;
923
924 case DECODE_TYPE_REJECT:
925 default:
926 return;
927 }
928
929 }
930}
931
932static void coverage_end(void)
933{
934 struct coverage_entry *entry = coverage.base;
935 struct coverage_entry *end = coverage.base + coverage.num_entries;
936
937 for (; entry < end; ++entry) {
938 u32 mask = entry->header->mask.bits;
939 u32 value = entry->header->value.bits;
940
941 if (entry->regs) {
942 pr_err("FAIL: Register test coverage missing for %08x %08x (%05x)\n",
943 mask, value, entry->regs);
944 coverage_fail = true;
945 }
946 if (!entry->matched) {
947 pr_err("FAIL: Test coverage entry missing for %08x %08x\n",
948 mask, value);
949 coverage_fail = true;
950 }
951 }
952
953 kfree(coverage.base);
954}
955
956
957
958
959
960
961void __naked __kprobes_test_case_start(void)
962{
963 __asm__ __volatile__ (
964 "stmdb sp!, {r4-r11} \n\t"
965 "sub sp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
966 "bic r0, lr, #1 @ r0 = inline title string \n\t"
967 "mov r1, sp \n\t"
968 "bl kprobes_test_case_start \n\t"
969 "bx r0 \n\t"
970 );
971}
972
973#ifndef CONFIG_THUMB2_KERNEL
974
975void __naked __kprobes_test_case_end_32(void)
976{
977 __asm__ __volatile__ (
978 "mov r4, lr \n\t"
979 "bl kprobes_test_case_end \n\t"
980 "cmp r0, #0 \n\t"
981 "movne pc, r0 \n\t"
982 "mov r0, r4 \n\t"
983 "add sp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
984 "ldmia sp!, {r4-r11} \n\t"
985 "mov pc, r0 \n\t"
986 );
987}
988
989#else
990
991void __naked __kprobes_test_case_end_16(void)
992{
993 __asm__ __volatile__ (
994 "mov r4, lr \n\t"
995 "bl kprobes_test_case_end \n\t"
996 "cmp r0, #0 \n\t"
997 "bxne r0 \n\t"
998 "mov r0, r4 \n\t"
999 "add sp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
1000 "ldmia sp!, {r4-r11} \n\t"
1001 "bx r0 \n\t"
1002 );
1003}
1004
1005void __naked __kprobes_test_case_end_32(void)
1006{
1007 __asm__ __volatile__ (
1008 ".arm \n\t"
1009 "orr lr, lr, #1 @ will return to Thumb code \n\t"
1010 "ldr pc, 1f \n\t"
1011 "1: \n\t"
1012 ".word __kprobes_test_case_end_16 \n\t"
1013 );
1014}
1015
1016#endif
1017
1018
1019int kprobe_test_flags;
1020int kprobe_test_cc_position;
1021
1022static int test_try_count;
1023static int test_pass_count;
1024static int test_fail_count;
1025
1026static struct pt_regs initial_regs;
1027static struct pt_regs expected_regs;
1028static struct pt_regs result_regs;
1029
1030static u32 expected_memory[TEST_MEMORY_SIZE/sizeof(u32)];
1031
1032static const char *current_title;
1033static struct test_arg *current_args;
1034static u32 *current_stack;
1035static uintptr_t current_branch_target;
1036
1037static uintptr_t current_code_start;
1038static kprobe_opcode_t current_instruction;
1039
1040
1041#define TEST_CASE_PASSED -1
1042#define TEST_CASE_FAILED -2
1043
1044static int test_case_run_count;
1045static bool test_case_is_thumb;
1046static int test_instance;
1047
1048
1049
1050
1051
1052
1053
1054
1055#define PSR_IGNORE_BITS (PSR_A_BIT | PSR_F_BIT)
1056
1057static unsigned long test_check_cc(int cc, unsigned long cpsr)
1058{
1059 int ret = arm_check_condition(cc << 28, cpsr);
1060
1061 return (ret != ARM_OPCODE_CONDTEST_FAIL);
1062}
1063
1064static int is_last_scenario;
1065static int probe_should_run;
1066static int memory_needs_checking;
1067
1068static unsigned long test_context_cpsr(int scenario)
1069{
1070 unsigned long cpsr;
1071
1072 probe_should_run = 1;
1073
1074
1075 cpsr = (scenario & 0xf) << 28;
1076 cpsr |= (scenario & 0xf) << 16;
1077 cpsr |= (scenario & 0x1) << 27;
1078
1079 if (!test_case_is_thumb) {
1080
1081 int cc = current_instruction >> 28;
1082
1083 probe_should_run = test_check_cc(cc, cpsr) != 0;
1084 if (scenario == 15)
1085 is_last_scenario = true;
1086
1087 } else if (kprobe_test_flags & TEST_FLAG_NO_ITBLOCK) {
1088
1089 if (kprobe_test_cc_position) {
1090 int cc = (current_instruction >> kprobe_test_cc_position) & 0xf;
1091 probe_should_run = test_check_cc(cc, cpsr) != 0;
1092 }
1093
1094 if (scenario == 15)
1095 is_last_scenario = true;
1096
1097 } else if (kprobe_test_flags & TEST_FLAG_FULL_ITBLOCK) {
1098
1099 unsigned x = (scenario >> 4);
1100 unsigned cond_base = x % 7;
1101 unsigned mask = x / 7 + 2;
1102
1103 if (mask > 0x1f) {
1104
1105 cond_base = 7;
1106 mask = 0x4;
1107 if ((scenario & 0xf) == 0xf)
1108 is_last_scenario = true;
1109 }
1110
1111 cpsr |= cond_base << 13;
1112 cpsr |= (mask & 0x1) << 12;
1113 cpsr |= (mask & 0x2) << 10;
1114 cpsr |= (mask & 0x4) << 8;
1115 cpsr |= (mask & 0x8) << 23;
1116 cpsr |= (mask & 0x10) << 21;
1117
1118 probe_should_run = test_check_cc((cpsr >> 12) & 0xf, cpsr) != 0;
1119
1120 } else {
1121
1122 switch (scenario) {
1123 case 16:
1124 cpsr = 0x00000800;
1125 probe_should_run = 0;
1126 break;
1127 case 17:
1128 cpsr = 0xf0007800;
1129 probe_should_run = 0;
1130 break;
1131 case 18:
1132 cpsr = 0x00009800;
1133 break;
1134 case 19:
1135 cpsr = 0xf0002800;
1136 is_last_scenario = true;
1137 break;
1138 }
1139 }
1140
1141 return cpsr;
1142}
1143
1144static void setup_test_context(struct pt_regs *regs)
1145{
1146 int scenario = test_case_run_count>>1;
1147 unsigned long val;
1148 struct test_arg *args;
1149 int i;
1150
1151 is_last_scenario = false;
1152 memory_needs_checking = false;
1153
1154
1155 val = (scenario & 1) ? VALM : ~VALM;
1156 for (i = 0; i < TEST_MEMORY_SIZE / sizeof(current_stack[0]); ++i)
1157 current_stack[i] = val + (i << 8);
1158
1159 if (current_branch_target)
1160 current_stack[15] = current_branch_target;
1161
1162 current_stack[13] = (u32)current_stack + 120;
1163
1164
1165 val = (scenario & 2) ? VALR : ~VALR;
1166 for (i = 0; i < 13; ++i)
1167 regs->uregs[i] = val ^ (i << 8);
1168 regs->ARM_lr = val ^ (14 << 8);
1169 regs->ARM_cpsr &= ~(APSR_MASK | PSR_IT_MASK);
1170 regs->ARM_cpsr |= test_context_cpsr(scenario);
1171
1172
1173 args = current_args;
1174 for (; args[0].type != ARG_TYPE_END; ++args)
1175 switch (args[0].type) {
1176 case ARG_TYPE_REG: {
1177 struct test_arg_regptr *arg =
1178 (struct test_arg_regptr *)args;
1179 regs->uregs[arg->reg] = arg->val;
1180 break;
1181 }
1182 case ARG_TYPE_PTR: {
1183 struct test_arg_regptr *arg =
1184 (struct test_arg_regptr *)args;
1185 regs->uregs[arg->reg] =
1186 (unsigned long)current_stack + arg->val;
1187 memory_needs_checking = true;
1188 break;
1189 }
1190 case ARG_TYPE_MEM: {
1191 struct test_arg_mem *arg = (struct test_arg_mem *)args;
1192 current_stack[arg->index] = arg->val;
1193 break;
1194 }
1195 default:
1196 break;
1197 }
1198}
1199
1200struct test_probe {
1201 struct kprobe kprobe;
1202 bool registered;
1203 int hit;
1204};
1205
1206static void unregister_test_probe(struct test_probe *probe)
1207{
1208 if (probe->registered) {
1209 unregister_kprobe(&probe->kprobe);
1210 probe->kprobe.flags = 0;
1211 }
1212 probe->registered = false;
1213}
1214
1215static int register_test_probe(struct test_probe *probe)
1216{
1217 int ret;
1218
1219 if (probe->registered)
1220 BUG();
1221
1222 ret = register_kprobe(&probe->kprobe);
1223 if (ret >= 0) {
1224 probe->registered = true;
1225 probe->hit = -1;
1226 }
1227 return ret;
1228}
1229
1230static int __kprobes
1231test_before_pre_handler(struct kprobe *p, struct pt_regs *regs)
1232{
1233 container_of(p, struct test_probe, kprobe)->hit = test_instance;
1234 return 0;
1235}
1236
1237static void __kprobes
1238test_before_post_handler(struct kprobe *p, struct pt_regs *regs,
1239 unsigned long flags)
1240{
1241 setup_test_context(regs);
1242 initial_regs = *regs;
1243 initial_regs.ARM_cpsr &= ~PSR_IGNORE_BITS;
1244}
1245
1246static int __kprobes
1247test_case_pre_handler(struct kprobe *p, struct pt_regs *regs)
1248{
1249 container_of(p, struct test_probe, kprobe)->hit = test_instance;
1250 return 0;
1251}
1252
1253static int __kprobes
1254test_after_pre_handler(struct kprobe *p, struct pt_regs *regs)
1255{
1256 if (container_of(p, struct test_probe, kprobe)->hit == test_instance)
1257 return 0;
1258
1259 result_regs = *regs;
1260 result_regs.ARM_cpsr &= ~PSR_IGNORE_BITS;
1261
1262
1263 regs->ARM_sp = (unsigned long)current_stack;
1264
1265 container_of(p, struct test_probe, kprobe)->hit = test_instance;
1266 return 0;
1267}
1268
1269static struct test_probe test_before_probe = {
1270 .kprobe.pre_handler = test_before_pre_handler,
1271 .kprobe.post_handler = test_before_post_handler,
1272};
1273
1274static struct test_probe test_case_probe = {
1275 .kprobe.pre_handler = test_case_pre_handler,
1276};
1277
1278static struct test_probe test_after_probe = {
1279 .kprobe.pre_handler = test_after_pre_handler,
1280};
1281
1282static struct test_probe test_after2_probe = {
1283 .kprobe.pre_handler = test_after_pre_handler,
1284};
1285
1286static void test_case_cleanup(void)
1287{
1288 unregister_test_probe(&test_before_probe);
1289 unregister_test_probe(&test_case_probe);
1290 unregister_test_probe(&test_after_probe);
1291 unregister_test_probe(&test_after2_probe);
1292}
1293
1294static void print_registers(struct pt_regs *regs)
1295{
1296 pr_err("r0 %08lx | r1 %08lx | r2 %08lx | r3 %08lx\n",
1297 regs->ARM_r0, regs->ARM_r1, regs->ARM_r2, regs->ARM_r3);
1298 pr_err("r4 %08lx | r5 %08lx | r6 %08lx | r7 %08lx\n",
1299 regs->ARM_r4, regs->ARM_r5, regs->ARM_r6, regs->ARM_r7);
1300 pr_err("r8 %08lx | r9 %08lx | r10 %08lx | r11 %08lx\n",
1301 regs->ARM_r8, regs->ARM_r9, regs->ARM_r10, regs->ARM_fp);
1302 pr_err("r12 %08lx | sp %08lx | lr %08lx | pc %08lx\n",
1303 regs->ARM_ip, regs->ARM_sp, regs->ARM_lr, regs->ARM_pc);
1304 pr_err("cpsr %08lx\n", regs->ARM_cpsr);
1305}
1306
1307static void print_memory(u32 *mem, size_t size)
1308{
1309 int i;
1310 for (i = 0; i < size / sizeof(u32); i += 4)
1311 pr_err("%08x %08x %08x %08x\n", mem[i], mem[i+1],
1312 mem[i+2], mem[i+3]);
1313}
1314
1315static size_t expected_memory_size(u32 *sp)
1316{
1317 size_t size = sizeof(expected_memory);
1318 int offset = (uintptr_t)sp - (uintptr_t)current_stack;
1319 if (offset > 0)
1320 size -= offset;
1321 return size;
1322}
1323
1324static void test_case_failed(const char *message)
1325{
1326 test_case_cleanup();
1327
1328 pr_err("FAIL: %s\n", message);
1329 pr_err("FAIL: Test %s\n", current_title);
1330 pr_err("FAIL: Scenario %d\n", test_case_run_count >> 1);
1331}
1332
1333static unsigned long next_instruction(unsigned long pc)
1334{
1335#ifdef CONFIG_THUMB2_KERNEL
1336 if ((pc & 1) &&
1337 !is_wide_instruction(__mem_to_opcode_thumb16(*(u16 *)(pc - 1))))
1338 return pc + 2;
1339 else
1340#endif
1341 return pc + 4;
1342}
1343
1344static uintptr_t __used kprobes_test_case_start(const char *title, void *stack)
1345{
1346 struct test_arg *args;
1347 struct test_arg_end *end_arg;
1348 unsigned long test_code;
1349
1350 args = (struct test_arg *)PTR_ALIGN(title + strlen(title) + 1, 4);
1351
1352 current_title = title;
1353 current_args = args;
1354 current_stack = stack;
1355
1356 ++test_try_count;
1357
1358 while (args->type != ARG_TYPE_END)
1359 ++args;
1360 end_arg = (struct test_arg_end *)args;
1361
1362 test_code = (unsigned long)(args + 1);
1363
1364 test_case_is_thumb = end_arg->flags & ARG_FLAG_THUMB;
1365 if (test_case_is_thumb)
1366 test_code |= 1;
1367
1368 current_code_start = test_code;
1369
1370 current_branch_target = 0;
1371 if (end_arg->branch_offset != end_arg->end_offset)
1372 current_branch_target = test_code + end_arg->branch_offset;
1373
1374 test_code += end_arg->code_offset;
1375 test_before_probe.kprobe.addr = (kprobe_opcode_t *)test_code;
1376
1377 test_code = next_instruction(test_code);
1378 test_case_probe.kprobe.addr = (kprobe_opcode_t *)test_code;
1379
1380 if (test_case_is_thumb) {
1381 u16 *p = (u16 *)(test_code & ~1);
1382 current_instruction = __mem_to_opcode_thumb16(p[0]);
1383 if (is_wide_instruction(current_instruction)) {
1384 u16 instr2 = __mem_to_opcode_thumb16(p[1]);
1385 current_instruction = __opcode_thumb32_compose(current_instruction, instr2);
1386 }
1387 } else {
1388 current_instruction = __mem_to_opcode_arm(*(u32 *)test_code);
1389 }
1390
1391 if (current_title[0] == '.')
1392 verbose("%s\n", current_title);
1393 else
1394 verbose("%s\t@ %0*x\n", current_title,
1395 test_case_is_thumb ? 4 : 8,
1396 current_instruction);
1397
1398 test_code = next_instruction(test_code);
1399 test_after_probe.kprobe.addr = (kprobe_opcode_t *)test_code;
1400
1401 if (kprobe_test_flags & TEST_FLAG_NARROW_INSTR) {
1402 if (!test_case_is_thumb ||
1403 is_wide_instruction(current_instruction)) {
1404 test_case_failed("expected 16-bit instruction");
1405 goto fail;
1406 }
1407 } else {
1408 if (test_case_is_thumb &&
1409 !is_wide_instruction(current_instruction)) {
1410 test_case_failed("expected 32-bit instruction");
1411 goto fail;
1412 }
1413 }
1414
1415 coverage_add(current_instruction);
1416
1417 if (end_arg->flags & ARG_FLAG_UNSUPPORTED) {
1418 if (register_test_probe(&test_case_probe) < 0)
1419 goto pass;
1420 test_case_failed("registered probe for unsupported instruction");
1421 goto fail;
1422 }
1423
1424 if (end_arg->flags & ARG_FLAG_SUPPORTED) {
1425 if (register_test_probe(&test_case_probe) >= 0)
1426 goto pass;
1427 test_case_failed("couldn't register probe for supported instruction");
1428 goto fail;
1429 }
1430
1431 if (register_test_probe(&test_before_probe) < 0) {
1432 test_case_failed("register test_before_probe failed");
1433 goto fail;
1434 }
1435 if (register_test_probe(&test_after_probe) < 0) {
1436 test_case_failed("register test_after_probe failed");
1437 goto fail;
1438 }
1439 if (current_branch_target) {
1440 test_after2_probe.kprobe.addr =
1441 (kprobe_opcode_t *)current_branch_target;
1442 if (register_test_probe(&test_after2_probe) < 0) {
1443 test_case_failed("register test_after2_probe failed");
1444 goto fail;
1445 }
1446 }
1447
1448
1449 test_case_run_count = 0;
1450 ++test_instance;
1451 return current_code_start;
1452pass:
1453 test_case_run_count = TEST_CASE_PASSED;
1454 return (uintptr_t)test_after_probe.kprobe.addr;
1455fail:
1456 test_case_run_count = TEST_CASE_FAILED;
1457 return (uintptr_t)test_after_probe.kprobe.addr;
1458}
1459
1460static bool check_test_results(void)
1461{
1462 size_t mem_size = 0;
1463 u32 *mem = 0;
1464
1465 if (memcmp(&expected_regs, &result_regs, sizeof(expected_regs))) {
1466 test_case_failed("registers differ");
1467 goto fail;
1468 }
1469
1470 if (memory_needs_checking) {
1471 mem = (u32 *)result_regs.ARM_sp;
1472 mem_size = expected_memory_size(mem);
1473 if (memcmp(expected_memory, mem, mem_size)) {
1474 test_case_failed("test memory differs");
1475 goto fail;
1476 }
1477 }
1478
1479 return true;
1480
1481fail:
1482 pr_err("initial_regs:\n");
1483 print_registers(&initial_regs);
1484 pr_err("expected_regs:\n");
1485 print_registers(&expected_regs);
1486 pr_err("result_regs:\n");
1487 print_registers(&result_regs);
1488
1489 if (mem) {
1490 pr_err("current_stack=%p\n", current_stack);
1491 pr_err("expected_memory:\n");
1492 print_memory(expected_memory, mem_size);
1493 pr_err("result_memory:\n");
1494 print_memory(mem, mem_size);
1495 }
1496
1497 return false;
1498}
1499
1500static uintptr_t __used kprobes_test_case_end(void)
1501{
1502 if (test_case_run_count < 0) {
1503 if (test_case_run_count == TEST_CASE_PASSED)
1504
1505 goto pass;
1506 else
1507
1508 goto fail;
1509 }
1510
1511 if (test_before_probe.hit != test_instance) {
1512 test_case_failed("test_before_handler not run");
1513 goto fail;
1514 }
1515
1516 if (test_after_probe.hit != test_instance &&
1517 test_after2_probe.hit != test_instance) {
1518 test_case_failed("test_after_handler not run");
1519 goto fail;
1520 }
1521
1522
1523
1524
1525
1526
1527 if ((test_case_run_count & 1) == 0) {
1528
1529 u32 *mem = (u32 *)result_regs.ARM_sp;
1530 expected_regs = result_regs;
1531 memcpy(expected_memory, mem, expected_memory_size(mem));
1532
1533
1534 if (register_test_probe(&test_case_probe) < 0) {
1535 test_case_failed("register test_case_probe failed");
1536 goto fail;
1537 }
1538 } else {
1539
1540 if (probe_should_run == 1) {
1541 if (test_case_probe.hit != test_instance) {
1542 test_case_failed("test_case_handler not run");
1543 goto fail;
1544 }
1545 } else if (probe_should_run == 0) {
1546 if (test_case_probe.hit == test_instance) {
1547 test_case_failed("test_case_handler ran");
1548 goto fail;
1549 }
1550 }
1551
1552
1553 unregister_test_probe(&test_case_probe);
1554
1555 if (!check_test_results())
1556 goto fail;
1557
1558 if (is_last_scenario)
1559 goto pass;
1560 }
1561
1562
1563 ++test_case_run_count;
1564 ++test_instance;
1565 return current_code_start;
1566fail:
1567 ++test_fail_count;
1568 goto end;
1569pass:
1570 ++test_pass_count;
1571end:
1572 test_case_cleanup();
1573 return 0;
1574}
1575
1576
1577
1578
1579
1580
1581static int run_test_cases(void (*tests)(void), const union decode_item *table)
1582{
1583 int ret;
1584
1585 pr_info(" Check decoding tables\n");
1586 ret = table_test(table);
1587 if (ret)
1588 return ret;
1589
1590 pr_info(" Run test cases\n");
1591 ret = coverage_start(table);
1592 if (ret)
1593 return ret;
1594
1595 tests();
1596
1597 coverage_end();
1598 return 0;
1599}
1600
1601
1602static int __init run_all_tests(void)
1603{
1604 int ret = 0;
1605
1606 pr_info("Beginning kprobe tests...\n");
1607
1608#ifndef CONFIG_THUMB2_KERNEL
1609
1610 pr_info("Probe ARM code\n");
1611 ret = run_api_tests(arm_func);
1612 if (ret)
1613 goto out;
1614
1615 pr_info("ARM instruction simulation\n");
1616 ret = run_test_cases(kprobe_arm_test_cases, probes_decode_arm_table);
1617 if (ret)
1618 goto out;
1619
1620#else
1621
1622 pr_info("Probe 16-bit Thumb code\n");
1623 ret = run_api_tests(thumb16_func);
1624 if (ret)
1625 goto out;
1626
1627 pr_info("Probe 32-bit Thumb code, even halfword\n");
1628 ret = run_api_tests(thumb32even_func);
1629 if (ret)
1630 goto out;
1631
1632 pr_info("Probe 32-bit Thumb code, odd halfword\n");
1633 ret = run_api_tests(thumb32odd_func);
1634 if (ret)
1635 goto out;
1636
1637 pr_info("16-bit Thumb instruction simulation\n");
1638 ret = run_test_cases(kprobe_thumb16_test_cases,
1639 probes_decode_thumb16_table);
1640 if (ret)
1641 goto out;
1642
1643 pr_info("32-bit Thumb instruction simulation\n");
1644 ret = run_test_cases(kprobe_thumb32_test_cases,
1645 probes_decode_thumb32_table);
1646 if (ret)
1647 goto out;
1648#endif
1649
1650 pr_info("Total instruction simulation tests=%d, pass=%d fail=%d\n",
1651 test_try_count, test_pass_count, test_fail_count);
1652 if (test_fail_count) {
1653 ret = -EINVAL;
1654 goto out;
1655 }
1656
1657#if BENCHMARKING
1658 pr_info("Benchmarks\n");
1659 ret = run_benchmarks();
1660 if (ret)
1661 goto out;
1662#endif
1663
1664#if __LINUX_ARM_ARCH__ >= 7
1665
1666 if (coverage_fail) {
1667 pr_err("FAIL: Test coverage checks failed\n");
1668 ret = -EINVAL;
1669 goto out;
1670 }
1671#endif
1672
1673out:
1674 if (ret == 0)
1675 pr_info("Finished kprobe tests OK\n");
1676 else
1677 pr_err("kprobe tests failed\n");
1678
1679 return ret;
1680}
1681
1682
1683
1684
1685
1686
1687#ifdef MODULE
1688
1689static void __exit kprobe_test_exit(void)
1690{
1691}
1692
1693module_init(run_all_tests)
1694module_exit(kprobe_test_exit)
1695MODULE_LICENSE("GPL");
1696
1697#else
1698
1699late_initcall(run_all_tests);
1700
1701#endif
1702