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