xref: /openbmc/linux/kernel/kheaders.c (revision b69edab4)
143d8ce9dSJoel Fernandes (Google) // SPDX-License-Identifier: GPL-2.0
243d8ce9dSJoel Fernandes (Google) /*
343d8ce9dSJoel Fernandes (Google)  * Provide kernel headers useful to build tracing programs
443d8ce9dSJoel Fernandes (Google)  * such as for running eBPF tracing tools.
543d8ce9dSJoel Fernandes (Google)  *
643d8ce9dSJoel Fernandes (Google)  * (Borrowed code from kernel/configs.c)
743d8ce9dSJoel Fernandes (Google)  */
843d8ce9dSJoel Fernandes (Google) 
943d8ce9dSJoel Fernandes (Google) #include <linux/kernel.h>
1043d8ce9dSJoel Fernandes (Google) #include <linux/module.h>
11f7b101d3SJoel Fernandes (Google) #include <linux/kobject.h>
1243d8ce9dSJoel Fernandes (Google) #include <linux/init.h>
1343d8ce9dSJoel Fernandes (Google) 
1443d8ce9dSJoel Fernandes (Google) /*
1543d8ce9dSJoel Fernandes (Google)  * Define kernel_headers_data and kernel_headers_data_end, within which the
1643d8ce9dSJoel Fernandes (Google)  * compressed kernel headers are stored. The file is first compressed with xz.
1743d8ce9dSJoel Fernandes (Google)  */
1843d8ce9dSJoel Fernandes (Google) 
1943d8ce9dSJoel Fernandes (Google) asm (
2043d8ce9dSJoel Fernandes (Google) "	.pushsection .rodata, \"a\"		\n"
2143d8ce9dSJoel Fernandes (Google) "	.global kernel_headers_data		\n"
2243d8ce9dSJoel Fernandes (Google) "kernel_headers_data:				\n"
2343d8ce9dSJoel Fernandes (Google) "	.incbin \"kernel/kheaders_data.tar.xz\"	\n"
2443d8ce9dSJoel Fernandes (Google) "	.global kernel_headers_data_end		\n"
2543d8ce9dSJoel Fernandes (Google) "kernel_headers_data_end:			\n"
2643d8ce9dSJoel Fernandes (Google) "	.popsection				\n"
2743d8ce9dSJoel Fernandes (Google) );
2843d8ce9dSJoel Fernandes (Google) 
29*b69edab4SKees Cook extern char kernel_headers_data[];
30*b69edab4SKees Cook extern char kernel_headers_data_end[];
3143d8ce9dSJoel Fernandes (Google) 
3243d8ce9dSJoel Fernandes (Google) static ssize_t
ikheaders_read(struct file * file,struct kobject * kobj,struct bin_attribute * bin_attr,char * buf,loff_t off,size_t len)33f7b101d3SJoel Fernandes (Google) ikheaders_read(struct file *file,  struct kobject *kobj,
34f7b101d3SJoel Fernandes (Google) 	       struct bin_attribute *bin_attr,
35f7b101d3SJoel Fernandes (Google) 	       char *buf, loff_t off, size_t len)
3643d8ce9dSJoel Fernandes (Google) {
37*b69edab4SKees Cook 	memcpy(buf, &kernel_headers_data[off], len);
38f7b101d3SJoel Fernandes (Google) 	return len;
3943d8ce9dSJoel Fernandes (Google) }
4043d8ce9dSJoel Fernandes (Google) 
41f7b101d3SJoel Fernandes (Google) static struct bin_attribute kheaders_attr __ro_after_init = {
42f7b101d3SJoel Fernandes (Google) 	.attr = {
43f7b101d3SJoel Fernandes (Google) 		.name = "kheaders.tar.xz",
44f7b101d3SJoel Fernandes (Google) 		.mode = 0444,
45f7b101d3SJoel Fernandes (Google) 	},
46f7b101d3SJoel Fernandes (Google) 	.read = &ikheaders_read,
4743d8ce9dSJoel Fernandes (Google) };
4843d8ce9dSJoel Fernandes (Google) 
ikheaders_init(void)4943d8ce9dSJoel Fernandes (Google) static int __init ikheaders_init(void)
5043d8ce9dSJoel Fernandes (Google) {
51*b69edab4SKees Cook 	kheaders_attr.size = (kernel_headers_data_end -
52*b69edab4SKees Cook 			      kernel_headers_data);
53f7b101d3SJoel Fernandes (Google) 	return sysfs_create_bin_file(kernel_kobj, &kheaders_attr);
5443d8ce9dSJoel Fernandes (Google) }
5543d8ce9dSJoel Fernandes (Google) 
ikheaders_cleanup(void)5643d8ce9dSJoel Fernandes (Google) static void __exit ikheaders_cleanup(void)
5743d8ce9dSJoel Fernandes (Google) {
58f7b101d3SJoel Fernandes (Google) 	sysfs_remove_bin_file(kernel_kobj, &kheaders_attr);
5943d8ce9dSJoel Fernandes (Google) }
6043d8ce9dSJoel Fernandes (Google) 
6143d8ce9dSJoel Fernandes (Google) module_init(ikheaders_init);
6243d8ce9dSJoel Fernandes (Google) module_exit(ikheaders_cleanup);
6343d8ce9dSJoel Fernandes (Google) 
6443d8ce9dSJoel Fernandes (Google) MODULE_LICENSE("GPL v2");
6543d8ce9dSJoel Fernandes (Google) MODULE_AUTHOR("Joel Fernandes");
6643d8ce9dSJoel Fernandes (Google) MODULE_DESCRIPTION("Echo the kernel header artifacts used to build the kernel");
67