test_kprobes.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. /*
  2. * test_kprobes.c - simple sanity test for *probes
  3. *
  4. * Copyright IBM Corp. 2008
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it would be useful, but
  12. * WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
  14. * the GNU General Public License for more details.
  15. */
  16. #define pr_fmt(fmt) "Kprobe smoke test: " fmt
  17. #include <linux/kernel.h>
  18. #include <linux/kprobes.h>
  19. #include <linux/random.h>
  20. #define div_factor 3
  21. static u32 rand1, preh_val, posth_val;
  22. static int errors, handler_errors, num_tests;
  23. static u32 (*target)(u32 value);
  24. static u32 (*target2)(u32 value);
  25. static noinline u32 kprobe_target(u32 value)
  26. {
  27. return (value / div_factor);
  28. }
  29. static int kp_pre_handler(struct kprobe *p, struct pt_regs *regs)
  30. {
  31. if (preemptible()) {
  32. handler_errors++;
  33. pr_err("pre-handler is preemptible\n");
  34. }
  35. preh_val = (rand1 / div_factor);
  36. return 0;
  37. }
  38. static void kp_post_handler(struct kprobe *p, struct pt_regs *regs,
  39. unsigned long flags)
  40. {
  41. if (preemptible()) {
  42. handler_errors++;
  43. pr_err("post-handler is preemptible\n");
  44. }
  45. if (preh_val != (rand1 / div_factor)) {
  46. handler_errors++;
  47. pr_err("incorrect value in post_handler\n");
  48. }
  49. posth_val = preh_val + div_factor;
  50. }
  51. static struct kprobe kp = {
  52. .symbol_name = "kprobe_target",
  53. .pre_handler = kp_pre_handler,
  54. .post_handler = kp_post_handler
  55. };
  56. static int test_kprobe(void)
  57. {
  58. int ret;
  59. ret = register_kprobe(&kp);
  60. if (ret < 0) {
  61. pr_err("register_kprobe returned %d\n", ret);
  62. return ret;
  63. }
  64. ret = target(rand1);
  65. unregister_kprobe(&kp);
  66. if (preh_val == 0) {
  67. pr_err("kprobe pre_handler not called\n");
  68. handler_errors++;
  69. }
  70. if (posth_val == 0) {
  71. pr_err("kprobe post_handler not called\n");
  72. handler_errors++;
  73. }
  74. return 0;
  75. }
  76. static noinline u32 kprobe_target2(u32 value)
  77. {
  78. return (value / div_factor) + 1;
  79. }
  80. static int kp_pre_handler2(struct kprobe *p, struct pt_regs *regs)
  81. {
  82. preh_val = (rand1 / div_factor) + 1;
  83. return 0;
  84. }
  85. static void kp_post_handler2(struct kprobe *p, struct pt_regs *regs,
  86. unsigned long flags)
  87. {
  88. if (preh_val != (rand1 / div_factor) + 1) {
  89. handler_errors++;
  90. pr_err("incorrect value in post_handler2\n");
  91. }
  92. posth_val = preh_val + div_factor;
  93. }
  94. static struct kprobe kp2 = {
  95. .symbol_name = "kprobe_target2",
  96. .pre_handler = kp_pre_handler2,
  97. .post_handler = kp_post_handler2
  98. };
  99. static int test_kprobes(void)
  100. {
  101. int ret;
  102. struct kprobe *kps[2] = {&kp, &kp2};
  103. /* addr and flags should be cleard for reusing kprobe. */
  104. kp.addr = NULL;
  105. kp.flags = 0;
  106. ret = register_kprobes(kps, 2);
  107. if (ret < 0) {
  108. pr_err("register_kprobes returned %d\n", ret);
  109. return ret;
  110. }
  111. preh_val = 0;
  112. posth_val = 0;
  113. ret = target(rand1);
  114. if (preh_val == 0) {
  115. pr_err("kprobe pre_handler not called\n");
  116. handler_errors++;
  117. }
  118. if (posth_val == 0) {
  119. pr_err("kprobe post_handler not called\n");
  120. handler_errors++;
  121. }
  122. preh_val = 0;
  123. posth_val = 0;
  124. ret = target2(rand1);
  125. if (preh_val == 0) {
  126. pr_err("kprobe pre_handler2 not called\n");
  127. handler_errors++;
  128. }
  129. if (posth_val == 0) {
  130. pr_err("kprobe post_handler2 not called\n");
  131. handler_errors++;
  132. }
  133. unregister_kprobes(kps, 2);
  134. return 0;
  135. }
  136. #if 0
  137. static u32 jph_val;
  138. static u32 j_kprobe_target(u32 value)
  139. {
  140. if (preemptible()) {
  141. handler_errors++;
  142. pr_err("jprobe-handler is preemptible\n");
  143. }
  144. if (value != rand1) {
  145. handler_errors++;
  146. pr_err("incorrect value in jprobe handler\n");
  147. }
  148. jph_val = rand1;
  149. jprobe_return();
  150. return 0;
  151. }
  152. static struct jprobe jp = {
  153. .entry = j_kprobe_target,
  154. .kp.symbol_name = "kprobe_target"
  155. };
  156. static int test_jprobe(void)
  157. {
  158. int ret;
  159. ret = register_jprobe(&jp);
  160. if (ret < 0) {
  161. pr_err("register_jprobe returned %d\n", ret);
  162. return ret;
  163. }
  164. ret = target(rand1);
  165. unregister_jprobe(&jp);
  166. if (jph_val == 0) {
  167. pr_err("jprobe handler not called\n");
  168. handler_errors++;
  169. }
  170. return 0;
  171. }
  172. static struct jprobe jp2 = {
  173. .entry = j_kprobe_target,
  174. .kp.symbol_name = "kprobe_target2"
  175. };
  176. static int test_jprobes(void)
  177. {
  178. int ret;
  179. struct jprobe *jps[2] = {&jp, &jp2};
  180. /* addr and flags should be cleard for reusing kprobe. */
  181. jp.kp.addr = NULL;
  182. jp.kp.flags = 0;
  183. ret = register_jprobes(jps, 2);
  184. if (ret < 0) {
  185. pr_err("register_jprobes returned %d\n", ret);
  186. return ret;
  187. }
  188. jph_val = 0;
  189. ret = target(rand1);
  190. if (jph_val == 0) {
  191. pr_err("jprobe handler not called\n");
  192. handler_errors++;
  193. }
  194. jph_val = 0;
  195. ret = target2(rand1);
  196. if (jph_val == 0) {
  197. pr_err("jprobe handler2 not called\n");
  198. handler_errors++;
  199. }
  200. unregister_jprobes(jps, 2);
  201. return 0;
  202. }
  203. #else
  204. #define test_jprobe() (0)
  205. #define test_jprobes() (0)
  206. #endif
  207. #ifdef CONFIG_KRETPROBES
  208. static u32 krph_val;
  209. static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
  210. {
  211. if (preemptible()) {
  212. handler_errors++;
  213. pr_err("kretprobe entry handler is preemptible\n");
  214. }
  215. krph_val = (rand1 / div_factor);
  216. return 0;
  217. }
  218. static int return_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
  219. {
  220. unsigned long ret = regs_return_value(regs);
  221. if (preemptible()) {
  222. handler_errors++;
  223. pr_err("kretprobe return handler is preemptible\n");
  224. }
  225. if (ret != (rand1 / div_factor)) {
  226. handler_errors++;
  227. pr_err("incorrect value in kretprobe handler\n");
  228. }
  229. if (krph_val == 0) {
  230. handler_errors++;
  231. pr_err("call to kretprobe entry handler failed\n");
  232. }
  233. krph_val = rand1;
  234. return 0;
  235. }
  236. static struct kretprobe rp = {
  237. .handler = return_handler,
  238. .entry_handler = entry_handler,
  239. .kp.symbol_name = "kprobe_target"
  240. };
  241. static int test_kretprobe(void)
  242. {
  243. int ret;
  244. ret = register_kretprobe(&rp);
  245. if (ret < 0) {
  246. pr_err("register_kretprobe returned %d\n", ret);
  247. return ret;
  248. }
  249. ret = target(rand1);
  250. unregister_kretprobe(&rp);
  251. if (krph_val != rand1) {
  252. pr_err("kretprobe handler not called\n");
  253. handler_errors++;
  254. }
  255. return 0;
  256. }
  257. static int return_handler2(struct kretprobe_instance *ri, struct pt_regs *regs)
  258. {
  259. unsigned long ret = regs_return_value(regs);
  260. if (ret != (rand1 / div_factor) + 1) {
  261. handler_errors++;
  262. pr_err("incorrect value in kretprobe handler2\n");
  263. }
  264. if (krph_val == 0) {
  265. handler_errors++;
  266. pr_err("call to kretprobe entry handler failed\n");
  267. }
  268. krph_val = rand1;
  269. return 0;
  270. }
  271. static struct kretprobe rp2 = {
  272. .handler = return_handler2,
  273. .entry_handler = entry_handler,
  274. .kp.symbol_name = "kprobe_target2"
  275. };
  276. static int test_kretprobes(void)
  277. {
  278. int ret;
  279. struct kretprobe *rps[2] = {&rp, &rp2};
  280. /* addr and flags should be cleard for reusing kprobe. */
  281. rp.kp.addr = NULL;
  282. rp.kp.flags = 0;
  283. ret = register_kretprobes(rps, 2);
  284. if (ret < 0) {
  285. pr_err("register_kretprobe returned %d\n", ret);
  286. return ret;
  287. }
  288. krph_val = 0;
  289. ret = target(rand1);
  290. if (krph_val != rand1) {
  291. pr_err("kretprobe handler not called\n");
  292. handler_errors++;
  293. }
  294. krph_val = 0;
  295. ret = target2(rand1);
  296. if (krph_val != rand1) {
  297. pr_err("kretprobe handler2 not called\n");
  298. handler_errors++;
  299. }
  300. unregister_kretprobes(rps, 2);
  301. return 0;
  302. }
  303. #endif /* CONFIG_KRETPROBES */
  304. int init_test_probes(void)
  305. {
  306. int ret;
  307. target = kprobe_target;
  308. target2 = kprobe_target2;
  309. do {
  310. rand1 = prandom_u32();
  311. } while (rand1 <= div_factor);
  312. pr_info("started\n");
  313. num_tests++;
  314. ret = test_kprobe();
  315. if (ret < 0)
  316. errors++;
  317. num_tests++;
  318. ret = test_kprobes();
  319. if (ret < 0)
  320. errors++;
  321. num_tests++;
  322. ret = test_jprobe();
  323. if (ret < 0)
  324. errors++;
  325. num_tests++;
  326. ret = test_jprobes();
  327. if (ret < 0)
  328. errors++;
  329. #ifdef CONFIG_KRETPROBES
  330. num_tests++;
  331. ret = test_kretprobe();
  332. if (ret < 0)
  333. errors++;
  334. num_tests++;
  335. ret = test_kretprobes();
  336. if (ret < 0)
  337. errors++;
  338. #endif /* CONFIG_KRETPROBES */
  339. if (errors)
  340. pr_err("BUG: %d out of %d tests failed\n", errors, num_tests);
  341. else if (handler_errors)
  342. pr_err("BUG: %d error(s) running handlers\n", handler_errors);
  343. else
  344. pr_info("passed successfully\n");
  345. return 0;
  346. }