1
2
3#include <linux/error-injection.h>
4#include <linux/init.h>
5#include <linux/module.h>
6#include <linux/percpu-defs.h>
7#include <linux/sysfs.h>
8#include <linux/tracepoint.h>
9#include "bpf_testmod.h"
10
11#define CREATE_TRACE_POINTS
12#include "bpf_testmod-events.h"
13
14DEFINE_PER_CPU(int, bpf_testmod_ksym_percpu) = 123;
15
16noinline ssize_t
17bpf_testmod_test_read(struct file *file, struct kobject *kobj,
18 struct bin_attribute *bin_attr,
19 char *buf, loff_t off, size_t len)
20{
21 struct bpf_testmod_test_read_ctx ctx = {
22 .buf = buf,
23 .off = off,
24 .len = len,
25 };
26
27 trace_bpf_testmod_test_read(current, &ctx);
28
29 return -EIO;
30}
31EXPORT_SYMBOL(bpf_testmod_test_read);
32ALLOW_ERROR_INJECTION(bpf_testmod_test_read, ERRNO);
33
34noinline ssize_t
35bpf_testmod_test_write(struct file *file, struct kobject *kobj,
36 struct bin_attribute *bin_attr,
37 char *buf, loff_t off, size_t len)
38{
39 struct bpf_testmod_test_write_ctx ctx = {
40 .buf = buf,
41 .off = off,
42 .len = len,
43 };
44
45 trace_bpf_testmod_test_write_bare(current, &ctx);
46
47 return -EIO;
48}
49EXPORT_SYMBOL(bpf_testmod_test_write);
50ALLOW_ERROR_INJECTION(bpf_testmod_test_write, ERRNO);
51
52static struct bin_attribute bin_attr_bpf_testmod_file __ro_after_init = {
53 .attr = { .name = "bpf_testmod", .mode = 0666, },
54 .read = bpf_testmod_test_read,
55 .write = bpf_testmod_test_write,
56};
57
58static int bpf_testmod_init(void)
59{
60 return sysfs_create_bin_file(kernel_kobj, &bin_attr_bpf_testmod_file);
61}
62
63static void bpf_testmod_exit(void)
64{
65 return sysfs_remove_bin_file(kernel_kobj, &bin_attr_bpf_testmod_file);
66}
67
68module_init(bpf_testmod_init);
69module_exit(bpf_testmod_exit);
70
71MODULE_AUTHOR("Andrii Nakryiko");
72MODULE_DESCRIPTION("BPF selftests module");
73MODULE_LICENSE("Dual BSD/GPL");
74
75