ksym
bpf_prog->aux->ksym.fp_start = prog - temp;
bpf_prog->aux->ksym.fp_end = prog - temp;
im->ksym.fp_start = prog - (u8 *)rw_image;
im->ksym.fp_end = prog - (u8 *)rw_image;
struct bpf_ksym ksym;
struct bpf_ksym ksym;
.ksym = { \
.lnode = LIST_HEAD_INIT(_name.ksym.lnode), \
void bpf_image_ksym_init(void *data, unsigned int size, struct bpf_ksym *ksym);
void bpf_image_ksym_add(struct bpf_ksym *ksym);
void bpf_image_ksym_del(struct bpf_ksym *ksym);
void bpf_ksym_add(struct bpf_ksym *ksym);
void bpf_ksym_del(struct bpf_ksym *ksym);
struct bpf_ksym ksym;
return list_empty(&fp->aux->ksym.lnode) ||
fp->aux->ksym.lnode.prev == LIST_POISON2;
char ksym[KSYM_SYMBOL_LEN];
stub_fname = kallsyms_lookup((unsigned long)stub_func_addr, NULL, NULL, NULL, ksym);
struct bpf_ksym *ksym)
snprintf(ksym->name, KSYM_NAME_LEN, "bpf__%s_%s", tname, mname);
INIT_LIST_HEAD_RCU(&ksym->lnode);
bpf_image_ksym_init(image, size, ksym);
struct bpf_ksym *ksym;
ksym = kzalloc_obj(*ksym, GFP_USER);
if (!ksym) {
*pksym++ = ksym;
ksym);
INIT_LIST_HEAD_RCU(&fp->aux->ksym.lnode);
if (prog->aux->ksym.prog)
return prog->aux->ksym.name;
prog->aux->ksym.start = (unsigned long) prog->bpf_func;
prog->aux->ksym.end = prog->aux->ksym.start + prog->jited_len;
char *sym = prog->aux->ksym.name;
const struct bpf_ksym *ksym;
ksym = container_of(n, struct bpf_ksym, tnode);
if (val < ksym->start)
if (val > ksym->end)
void bpf_ksym_add(struct bpf_ksym *ksym)
WARN_ON_ONCE(!list_empty(&ksym->lnode));
list_add_tail_rcu(&ksym->lnode, &bpf_kallsyms);
latch_tree_insert(&ksym->tnode, &bpf_tree, &bpf_tree_ops);
static void __bpf_ksym_del(struct bpf_ksym *ksym)
if (list_empty(&ksym->lnode))
latch_tree_erase(&ksym->tnode, &bpf_tree, &bpf_tree_ops);
list_del_rcu(&ksym->lnode);
void bpf_ksym_del(struct bpf_ksym *ksym)
__bpf_ksym_del(ksym);
fp->aux->ksym.prog = true;
bpf_ksym_add(&fp->aux->ksym);
"__cfi_%s", fp->aux->ksym.name);
bpf_ksym_del(&fp->aux->ksym);
struct bpf_ksym *ksym;
ksym = bpf_ksym_find(addr);
if (ksym) {
unsigned long symbol_start = ksym->start;
unsigned long symbol_end = ksym->end;
ret = strscpy(sym, ksym->name, KSYM_NAME_LEN);
struct bpf_ksym *ksym;
ksym = bpf_ksym_find(addr);
return ksym && ksym->prog ?
container_of(ksym, struct bpf_prog_aux, ksym)->prog :
struct bpf_ksym *ksym;
ksym = bpf_ksym_find(ip);
if (!ksym || !ksym->fp_start || !ksym->fp_end)
offset = ip - ksym->start;
return offset >= ksym->fp_start && offset < ksym->fp_end;
struct bpf_ksym *ksym;
list_for_each_entry_rcu(ksym, &bpf_kallsyms, lnode) {
strscpy(sym, ksym->name, KSYM_NAME_LEN);
*value = ksym->start;
bpf_image_ksym_init(d->image, PAGE_SIZE, &d->ksym);
bpf_image_ksym_add(&d->ksym);
void bpf_image_ksym_init(void *data, unsigned int size, struct bpf_ksym *ksym)
ksym->start = (unsigned long) data;
ksym->end = ksym->start + size;
void bpf_image_ksym_add(struct bpf_ksym *ksym)
bpf_ksym_add(ksym);
perf_event_ksymbol(PERF_RECORD_KSYMBOL_TYPE_BPF, ksym->start,
PAGE_SIZE, false, ksym->name);
void bpf_image_ksym_del(struct bpf_ksym *ksym)
bpf_ksym_del(ksym);
perf_event_ksymbol(PERF_RECORD_KSYMBOL_TYPE_BPF, ksym->start,
PAGE_SIZE, true, ksym->name);
bpf_image_ksym_del(&im->ksym);
struct bpf_ksym *ksym;
ksym = &im->ksym;
INIT_LIST_HEAD_RCU(&ksym->lnode);
snprintf(ksym->name, KSYM_NAME_LEN, "bpf_trampoline_%llu", key);
bpf_image_ksym_init(image, size, ksym);
bpf_image_ksym_add(ksym);
prog->aux->ksym.name);
subprog->aux->ksym.name);
__bpf_md_ptr(struct kallsym_iter *, ksym);
ctx.ksym = m ? m->private : NULL;
DEFINE_BPF_ITER_FUNC(ksym, struct bpf_iter_meta *meta, struct kallsym_iter *ksym)
{ offsetof(struct bpf_iter__ksym, ksym),
const struct kernel_symbol *ksym;
!IS_ERR(ksym = resolve_symbol(mod, info, name, owner))
|| PTR_ERR(ksym) != -EBUSY,
return ksym;
const struct kernel_symbol *ksym;
ksym = resolve_symbol_wait(mod, info, name);
if (ksym && !IS_ERR(ksym)) {
sym[i].st_value = kernel_symbol_value(ksym);
if (!ksym &&
ret = PTR_ERR(ksym) ?: -ENOENT;
struct ksym *sym;
struct ksym *sym;
struct ksym *sym;
struct ksym *sym;
module_param_string(ksym, ksym_name, KSYM_NAME_LEN, S_IRUGO);
MODULE_PARM_DESC(ksym, "Kernel symbol to monitor; this module will report any"
if (ext->type == EXT_KSYM && ext->ksym.type_id)
&ext->ksym.type_id);
if (ext->ksym.type_id && ext->is_set) { /* typed ksyms */
insn[0].imm = ext->ksym.kernel_btf_id;
insn[1].imm = ext->ksym.kernel_btf_obj_fd;
insn[0].imm = (__u32)ext->ksym.addr;
insn[1].imm = ext->ksym.addr >> 32;
insn[0].imm = ext->ksym.kernel_btf_id;
insn[0].off = ext->ksym.btf_fd_idx;
} ksym;
ext->is_weak, !ext->ksym.type_id,
if (ext->is_set && ext->ksym.addr != sym_addr) {
sym_name, ext->ksym.addr, sym_addr);
ext->ksym.addr = sym_addr;
local_type_id = ext->ksym.type_id;
ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0;
ext->ksym.kernel_btf_id = id;
local_func_proto_id = ext->ksym.type_id;
ext->ksym.kernel_btf_id = kfunc_id;
ext->ksym.btf_fd_idx = mod_btf ? mod_btf->fd_array_idx : 0;
ext->ksym.kernel_btf_obj_fd = mod_btf ? mod_btf->fd : 0;
if (ext->type != EXT_KSYM || !ext->ksym.type_id)
ext->ksym.kernel_btf_obj_fd = 0;
ext->ksym.kernel_btf_id = 0;
if (ext->ksym.type_id)
static inline bool __COMPAT_has_ksym(const char *ksym)
return btf__find_by_name(__COMPAT_vmlinux_btf, ksym) >= 0;
struct ksym *ks;
struct ksym *ksym;
ksym = ksym_search_local(ksyms, ips[i]);
if (!ASSERT_OK_PTR(ksym, "ksym_search_local"))
ASSERT_EQ(ksym->addr, val, "stack_cmp");
struct kallsym_iter *iter = ctx->ksym;
return ((struct ksym *)p1)->addr - ((struct ksym *)p2)->addr;
struct ksym *ksym_search_local(struct ksyms *ksyms, long key)
struct ksym *search_kallsyms_custom_local(struct ksyms *ksyms, const void *p,
struct ksym *ks;
struct ksym *ksym_search(long key)
return compare_name(((const struct ksym *)p1)->name, ((const struct ksym *)p2)->name);
static int search_kallsyms_compare(const void *p1, const struct ksym *p2)
struct ksym *ks;
sizeof(struct ksym), ksyms->sym_cnt + 1);
qsort(ksyms->syms, ksyms->sym_cnt, sizeof(struct ksym), cmp_cb);
struct ksym *syms;
typedef int (*ksym_search_cmp_t)(const void *p1, const struct ksym *p2);
struct ksym *ksym_search(long key);
struct ksym *ksym_search_local(struct ksyms *ksyms, long key);
struct ksym *search_kallsyms_custom_local(struct ksyms *ksyms, const void *p1,
const char *ksym;
ksym = transport_ksyms[i];
match = strstr(buf, ksym);
if (match && isspace(match[strlen(ksym)])) {