Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0 |
| 2 | /* |
| 3 | * Provide kernel BTF information for introspection and use by eBPF tools. |
| 4 | */ |
| 5 | #include <linux/kernel.h> |
| 6 | #include <linux/module.h> |
| 7 | #include <linux/kobject.h> |
| 8 | #include <linux/init.h> |
| 9 | #include <linux/sysfs.h> |
| 10 | |
| 11 | /* See scripts/link-vmlinux.sh, gen_btf() func for details */ |
Fangrui Song | 90ceddc | 2020-03-18 15:27:46 -0700 | [diff] [blame] | 12 | extern char __weak __start_BTF[]; |
| 13 | extern char __weak __stop_BTF[]; |
Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 14 | |
| 15 | static ssize_t |
Andrii Nakryiko | 7fd7856 | 2019-08-13 11:54:42 -0700 | [diff] [blame] | 16 | btf_vmlinux_read(struct file *file, struct kobject *kobj, |
| 17 | struct bin_attribute *bin_attr, |
| 18 | char *buf, loff_t off, size_t len) |
Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 19 | { |
Fangrui Song | 90ceddc | 2020-03-18 15:27:46 -0700 | [diff] [blame] | 20 | memcpy(buf, __start_BTF + off, len); |
Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 21 | return len; |
| 22 | } |
| 23 | |
Andrii Nakryiko | 7fd7856 | 2019-08-13 11:54:42 -0700 | [diff] [blame] | 24 | static struct bin_attribute bin_attr_btf_vmlinux __ro_after_init = { |
| 25 | .attr = { .name = "vmlinux", .mode = 0444, }, |
| 26 | .read = btf_vmlinux_read, |
Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 27 | }; |
| 28 | |
Andrii Nakryiko | 36e6844 | 2020-11-09 17:19:31 -0800 | [diff] [blame] | 29 | struct kobject *btf_kobj; |
Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 30 | |
Andrii Nakryiko | 7fd7856 | 2019-08-13 11:54:42 -0700 | [diff] [blame] | 31 | static int __init btf_vmlinux_init(void) |
Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 32 | { |
Tony Ambardar | e23bb04 | 2020-09-19 22:01:33 -0700 | [diff] [blame] | 33 | bin_attr_btf_vmlinux.size = __stop_BTF - __start_BTF; |
| 34 | |
| 35 | if (!__start_BTF || bin_attr_btf_vmlinux.size == 0) |
Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 36 | return 0; |
| 37 | |
| 38 | btf_kobj = kobject_create_and_add("btf", kernel_kobj); |
Wei Yongjun | e032500 | 2019-08-16 02:40:44 +0000 | [diff] [blame] | 39 | if (!btf_kobj) |
| 40 | return -ENOMEM; |
Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 41 | |
Andrii Nakryiko | 7fd7856 | 2019-08-13 11:54:42 -0700 | [diff] [blame] | 42 | return sysfs_create_bin_file(btf_kobj, &bin_attr_btf_vmlinux); |
Andrii Nakryiko | 341dfcf | 2019-08-12 11:39:47 -0700 | [diff] [blame] | 43 | } |
| 44 | |
Andrii Nakryiko | 7fd7856 | 2019-08-13 11:54:42 -0700 | [diff] [blame] | 45 | subsys_initcall(btf_vmlinux_init); |