1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Provide kernel headers useful to build tracing programs |
4 | * such as for running eBPF tracing tools. |
5 | * |
6 | * (Borrowed code from kernel/configs.c) |
7 | */ |
8 | |
9 | #include <linux/kernel.h> |
10 | #include <linux/module.h> |
11 | #include <linux/kobject.h> |
12 | #include <linux/init.h> |
13 | |
14 | /* |
15 | * Define kernel_headers_data and kernel_headers_data_end, within which the |
16 | * compressed kernel headers are stored. The file is first compressed with xz. |
17 | */ |
18 | |
19 | asm ( |
20 | " .pushsection .rodata, \"a\" \n" |
21 | " .global kernel_headers_data \n" |
22 | "kernel_headers_data: \n" |
23 | " .incbin \"kernel/kheaders_data.tar.xz\" \n" |
24 | " .global kernel_headers_data_end \n" |
25 | "kernel_headers_data_end: \n" |
26 | " .popsection \n" |
27 | ); |
28 | |
29 | extern char []; |
30 | extern char []; |
31 | |
32 | static ssize_t |
33 | (struct file *file, struct kobject *kobj, |
34 | struct bin_attribute *bin_attr, |
35 | char *buf, loff_t off, size_t len) |
36 | { |
37 | memcpy(buf, &kernel_headers_data[off], len); |
38 | return len; |
39 | } |
40 | |
41 | static struct bin_attribute __ro_after_init = { |
42 | .attr = { |
43 | .name = "kheaders.tar.xz" , |
44 | .mode = 0444, |
45 | }, |
46 | .read = &ikheaders_read, |
47 | }; |
48 | |
49 | static int __init (void) |
50 | { |
51 | kheaders_attr.size = (kernel_headers_data_end - |
52 | kernel_headers_data); |
53 | return sysfs_create_bin_file(kobj: kernel_kobj, attr: &kheaders_attr); |
54 | } |
55 | |
56 | static void __exit (void) |
57 | { |
58 | sysfs_remove_bin_file(kobj: kernel_kobj, attr: &kheaders_attr); |
59 | } |
60 | |
61 | module_init(ikheaders_init); |
62 | module_exit(ikheaders_cleanup); |
63 | |
64 | MODULE_LICENSE("GPL v2" ); |
65 | MODULE_AUTHOR("Joel Fernandes" ); |
66 | MODULE_DESCRIPTION("Echo the kernel header artifacts used to build the kernel" ); |
67 | |