0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/trace_events.h>
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 static struct trace_event_file *gen_kprobe_test;
0036 static struct trace_event_file *gen_kretprobe_test;
0037
0038
0039
0040
0041
0042 static int __init test_gen_kprobe_cmd(void)
0043 {
0044 struct dynevent_cmd cmd;
0045 char *buf;
0046 int ret;
0047
0048
0049 buf = kzalloc(MAX_DYNEVENT_CMD_LEN, GFP_KERNEL);
0050 if (!buf)
0051 return -ENOMEM;
0052
0053
0054 kprobe_event_cmd_init(&cmd, buf, MAX_DYNEVENT_CMD_LEN);
0055
0056
0057
0058
0059
0060 ret = kprobe_event_gen_cmd_start(&cmd, "gen_kprobe_test",
0061 "do_sys_open",
0062 "dfd=%ax", "filename=%dx");
0063 if (ret)
0064 goto free;
0065
0066
0067
0068 ret = kprobe_event_add_fields(&cmd, "flags=%cx", "mode=+4($stack)");
0069 if (ret)
0070 goto free;
0071
0072
0073
0074
0075 ret = kprobe_event_gen_cmd_end(&cmd);
0076 if (ret)
0077 goto free;
0078
0079
0080
0081
0082
0083
0084
0085 gen_kprobe_test = trace_get_event_file(NULL, "kprobes",
0086 "gen_kprobe_test");
0087 if (IS_ERR(gen_kprobe_test)) {
0088 ret = PTR_ERR(gen_kprobe_test);
0089 goto delete;
0090 }
0091
0092
0093 ret = trace_array_set_clr_event(gen_kprobe_test->tr,
0094 "kprobes", "gen_kprobe_test", true);
0095 if (ret) {
0096 trace_put_event_file(gen_kprobe_test);
0097 goto delete;
0098 }
0099 out:
0100 return ret;
0101 delete:
0102
0103 ret = kprobe_event_delete("gen_kprobe_test");
0104 free:
0105 kfree(buf);
0106
0107 goto out;
0108 }
0109
0110
0111
0112
0113 static int __init test_gen_kretprobe_cmd(void)
0114 {
0115 struct dynevent_cmd cmd;
0116 char *buf;
0117 int ret;
0118
0119
0120 buf = kzalloc(MAX_DYNEVENT_CMD_LEN, GFP_KERNEL);
0121 if (!buf)
0122 return -ENOMEM;
0123
0124
0125 kprobe_event_cmd_init(&cmd, buf, MAX_DYNEVENT_CMD_LEN);
0126
0127
0128
0129
0130 ret = kretprobe_event_gen_cmd_start(&cmd, "gen_kretprobe_test",
0131 "do_sys_open",
0132 "$retval");
0133 if (ret)
0134 goto free;
0135
0136
0137
0138
0139 ret = kretprobe_event_gen_cmd_end(&cmd);
0140 if (ret)
0141 goto free;
0142
0143
0144
0145
0146
0147
0148
0149
0150 gen_kretprobe_test = trace_get_event_file(NULL, "kprobes",
0151 "gen_kretprobe_test");
0152 if (IS_ERR(gen_kretprobe_test)) {
0153 ret = PTR_ERR(gen_kretprobe_test);
0154 goto delete;
0155 }
0156
0157
0158 ret = trace_array_set_clr_event(gen_kretprobe_test->tr,
0159 "kprobes", "gen_kretprobe_test", true);
0160 if (ret) {
0161 trace_put_event_file(gen_kretprobe_test);
0162 goto delete;
0163 }
0164 out:
0165 return ret;
0166 delete:
0167
0168 ret = kprobe_event_delete("gen_kretprobe_test");
0169 free:
0170 kfree(buf);
0171
0172 goto out;
0173 }
0174
0175 static int __init kprobe_event_gen_test_init(void)
0176 {
0177 int ret;
0178
0179 ret = test_gen_kprobe_cmd();
0180 if (ret)
0181 return ret;
0182
0183 ret = test_gen_kretprobe_cmd();
0184 if (ret) {
0185 WARN_ON(trace_array_set_clr_event(gen_kretprobe_test->tr,
0186 "kprobes",
0187 "gen_kretprobe_test", false));
0188 trace_put_event_file(gen_kretprobe_test);
0189 WARN_ON(kprobe_event_delete("gen_kretprobe_test"));
0190 }
0191
0192 return ret;
0193 }
0194
0195 static void __exit kprobe_event_gen_test_exit(void)
0196 {
0197
0198 WARN_ON(trace_array_set_clr_event(gen_kprobe_test->tr,
0199 "kprobes",
0200 "gen_kprobe_test", false));
0201
0202
0203 trace_put_event_file(gen_kprobe_test);
0204
0205
0206 WARN_ON(kprobe_event_delete("gen_kprobe_test"));
0207
0208
0209 WARN_ON(trace_array_set_clr_event(gen_kprobe_test->tr,
0210 "kprobes",
0211 "gen_kretprobe_test", false));
0212
0213
0214 trace_put_event_file(gen_kretprobe_test);
0215
0216
0217 WARN_ON(kprobe_event_delete("gen_kretprobe_test"));
0218 }
0219
0220 module_init(kprobe_event_gen_test_init)
0221 module_exit(kprobe_event_gen_test_exit)
0222
0223 MODULE_AUTHOR("Tom Zanussi");
0224 MODULE_DESCRIPTION("kprobe event generation test");
0225 MODULE_LICENSE("GPL v2");