blob: ef6911aee3bbbdc8e968a89eca9e900c3fa1e149 [file] [log] [blame]
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -07001// 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 Song90ceddc2020-03-18 15:27:46 -070012extern char __weak __start_BTF[];
13extern char __weak __stop_BTF[];
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -070014
15static ssize_t
Andrii Nakryiko7fd78562019-08-13 11:54:42 -070016btf_vmlinux_read(struct file *file, struct kobject *kobj,
17 struct bin_attribute *bin_attr,
18 char *buf, loff_t off, size_t len)
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -070019{
Fangrui Song90ceddc2020-03-18 15:27:46 -070020 memcpy(buf, __start_BTF + off, len);
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -070021 return len;
22}
23
Andrii Nakryiko7fd78562019-08-13 11:54:42 -070024static struct bin_attribute bin_attr_btf_vmlinux __ro_after_init = {
25 .attr = { .name = "vmlinux", .mode = 0444, },
26 .read = btf_vmlinux_read,
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -070027};
28
Andrii Nakryiko36e68442020-11-09 17:19:31 -080029struct kobject *btf_kobj;
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -070030
Andrii Nakryiko7fd78562019-08-13 11:54:42 -070031static int __init btf_vmlinux_init(void)
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -070032{
Tony Ambardare23bb042020-09-19 22:01:33 -070033 bin_attr_btf_vmlinux.size = __stop_BTF - __start_BTF;
34
35 if (!__start_BTF || bin_attr_btf_vmlinux.size == 0)
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -070036 return 0;
37
38 btf_kobj = kobject_create_and_add("btf", kernel_kobj);
Wei Yongjune0325002019-08-16 02:40:44 +000039 if (!btf_kobj)
40 return -ENOMEM;
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -070041
Andrii Nakryiko7fd78562019-08-13 11:54:42 -070042 return sysfs_create_bin_file(btf_kobj, &bin_attr_btf_vmlinux);
Andrii Nakryiko341dfcf2019-08-12 11:39:47 -070043}
44
Andrii Nakryiko7fd78562019-08-13 11:54:42 -070045subsys_initcall(btf_vmlinux_init);