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 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) 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) 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