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) 29b69edab4SKees Cook extern char kernel_headers_data[]; 30b69edab4SKees Cook extern char kernel_headers_data_end[]; 3143d8ce9dSJoel Fernandes (Google) 32*5ab5a377SThomas Weißschuh static struct bin_attribute kheaders_attr __ro_after_init = 33*5ab5a377SThomas Weißschuh __BIN_ATTR_SIMPLE_RO(kheaders.tar.xz, 0444); 3443d8ce9dSJoel Fernandes (Google) ikheaders_init(void)3543d8ce9dSJoel Fernandes (Google)static int __init ikheaders_init(void) 3643d8ce9dSJoel Fernandes (Google) { 37*5ab5a377SThomas Weißschuh kheaders_attr.private = kernel_headers_data; 38b69edab4SKees Cook kheaders_attr.size = (kernel_headers_data_end - 39b69edab4SKees Cook kernel_headers_data); 40f7b101d3SJoel Fernandes (Google) return sysfs_create_bin_file(kernel_kobj, &kheaders_attr); 4143d8ce9dSJoel Fernandes (Google) } 4243d8ce9dSJoel Fernandes (Google) ikheaders_cleanup(void)4343d8ce9dSJoel Fernandes (Google)static void __exit ikheaders_cleanup(void) 4443d8ce9dSJoel Fernandes (Google) { 45f7b101d3SJoel Fernandes (Google) sysfs_remove_bin_file(kernel_kobj, &kheaders_attr); 4643d8ce9dSJoel Fernandes (Google) } 4743d8ce9dSJoel Fernandes (Google) 4843d8ce9dSJoel Fernandes (Google) module_init(ikheaders_init); 4943d8ce9dSJoel Fernandes (Google) module_exit(ikheaders_cleanup); 5043d8ce9dSJoel Fernandes (Google) 5143d8ce9dSJoel Fernandes (Google) MODULE_LICENSE("GPL v2"); 5243d8ce9dSJoel Fernandes (Google) MODULE_AUTHOR("Joel Fernandes"); 5343d8ce9dSJoel Fernandes (Google) MODULE_DESCRIPTION("Echo the kernel header artifacts used to build the kernel"); 54