root/kernel/kheaders.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ikheaders_read
  2. ikheaders_init
  3. ikheaders_cleanup

   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 kernel_headers_data;
  30 extern char kernel_headers_data_end;
  31 
  32 static ssize_t
  33 ikheaders_read(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 kheaders_attr __ro_after_init = {
  42         .attr = {
  43                 .name = "kheaders.tar.xz",
  44                 .mode = 0444,
  45         },
  46         .read = &ikheaders_read,
  47 };
  48 
  49 static int __init ikheaders_init(void)
  50 {
  51         kheaders_attr.size = (&kernel_headers_data_end -
  52                               &kernel_headers_data);
  53         return sysfs_create_bin_file(kernel_kobj, &kheaders_attr);
  54 }
  55 
  56 static void __exit ikheaders_cleanup(void)
  57 {
  58         sysfs_remove_bin_file(kernel_kobj, &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");

/* [<][>][^][v][top][bottom][index][help] */