Lines Matching +full:function +full:- +full:off
1 // SPDX-License-Identifier: GPL-2.0-only
3 * kallsyms.c: in-kernel printing of symbolic oopses and stack traces.
5 * Rewritten and vastly simplified by Rusty Russell for in-kernel
42 static unsigned int kallsyms_expand_symbol(unsigned int off, in kallsyms_expand_symbol() argument
50 data = &kallsyms_names[off]; in kallsyms_expand_symbol()
53 off++; in kallsyms_expand_symbol()
59 off++; in kallsyms_expand_symbol()
66 off += len; in kallsyms_expand_symbol()
75 len--; in kallsyms_expand_symbol()
83 maxlen--; in kallsyms_expand_symbol()
95 return off; in kallsyms_expand_symbol()
102 static char kallsyms_get_symbol_type(unsigned int off) in kallsyms_get_symbol_type() argument
108 return kallsyms_token_table[kallsyms_token_index[kallsyms_names[off + 1]]]; in kallsyms_get_symbol_type()
146 return name - kallsyms_names; in get_symbol_offset()
154 /* values are unsigned offsets if --absolute-percpu is not in effect */ in kallsyms_sym_address()
162 /* ...and negative offsets are relative to kallsyms_relative_base - 1 */ in kallsyms_sym_address()
163 return kallsyms_relative_base - 1 - kallsyms_offsets[idx]; in kallsyms_sym_address()
178 * - foo.llvm.[0-9a-f]+ in cleanup_symbol_name()
214 unsigned int seq, off; in kallsyms_lookup_names() local
218 high = kallsyms_num_syms - 1; in kallsyms_lookup_names()
221 mid = low + (high - low) / 2; in kallsyms_lookup_names()
223 off = get_symbol_offset(seq); in kallsyms_lookup_names()
224 kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); in kallsyms_lookup_names()
229 high = mid - 1; in kallsyms_lookup_names()
235 return -ESRCH; in kallsyms_lookup_names()
239 seq = get_symbol_seq(low - 1); in kallsyms_lookup_names()
240 off = get_symbol_offset(seq); in kallsyms_lookup_names()
241 kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); in kallsyms_lookup_names()
244 low--; in kallsyms_lookup_names()
250 while (high < kallsyms_num_syms - 1) { in kallsyms_lookup_names()
252 off = get_symbol_offset(seq); in kallsyms_lookup_names()
253 kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); in kallsyms_lookup_names()
290 unsigned int off; in kallsyms_on_each_symbol() local
293 for (i = 0, off = 0; i < kallsyms_num_syms; i++) { in kallsyms_on_each_symbol()
294 off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf)); in kallsyms_on_each_symbol()
338 while (high - low > 1) { in get_symbol_pos()
339 mid = low + (high - low) / 2; in get_symbol_pos()
350 while (low && kallsyms_sym_address(low-1) == kallsyms_sym_address(low)) in get_symbol_pos()
351 --low; in get_symbol_pos()
355 /* Search for next non-aliased symbol. */ in get_symbol_pos()
374 *symbolsize = symbol_end - symbol_start; in get_symbol_pos()
376 *offset = addr - symbol_start; in get_symbol_pos()
404 namebuf[KSYM_NAME_LEN - 1] = 0; in kallsyms_lookup_buildid()
441 * - modname is set to NULL if it's in the kernel.
442 * - We guarantee that the returned name is valid until we reschedule even if.
444 * - We also guarantee that modname will be valid until rescheduled.
460 symname[KSYM_NAME_LEN - 1] = '\0'; in lookup_symbol_name()
495 return sprintf(buffer, "0x%lx", address - symbol_offset); in __sprint_symbol()
500 offset -= symbol_offset; in __sprint_symbol()
523 * sprint_symbol - Look up a kernel symbol and return it in a text buffer
527 * This function looks up a kernel symbol with @address and stores its name,
531 * This function returns the number of bytes stored in @buffer.
540 * sprint_symbol_build_id - Look up a kernel symbol and return it in a text buffer
544 * This function looks up a kernel symbol with @address and stores its name,
548 * This function returns the number of bytes stored in @buffer.
557 * sprint_symbol_no_offset - Look up a kernel symbol and return it in a text buffer
561 * This function looks up a kernel symbol with @address and stores its name
565 * This function returns the number of bytes stored in @buffer.
574 * sprint_backtrace - Look up a backtrace symbol and return it in a text buffer
578 * This function is for stack backtrace and does the same thing as
580 * tail-call to the function marked "noreturn", gcc optimized out code after
581 * the call so that the stack-saved return address could point outside of the
582 * caller. This function ensures that kallsyms will find the original caller
585 * This function returns the number of bytes stored in @buffer.
589 return __sprint_symbol(buffer, address, -1, 1, 0); in sprint_backtrace()
593 * sprint_backtrace_build_id - Look up a backtrace symbol and return it in a text buffer
597 * This function is for stack backtrace and does the same thing as
599 * tail-call to the function marked "noreturn", gcc optimized out code after
600 * the call so that the stack-saved return address could point outside of the
601 * caller. This function ensures that kallsyms will find the original caller
602 * by decreasing @address. This function also appends the module build ID to
605 * This function returns the number of bytes stored in @buffer.
609 return __sprint_symbol(buffer, address, -1, 1, 1); in sprint_backtrace_build_id()
629 int ret = module_get_kallsym(iter->pos - kallsyms_num_syms, in get_ksymbol_mod()
630 &iter->value, &iter->type, in get_ksymbol_mod()
631 iter->name, iter->module_name, in get_ksymbol_mod()
632 &iter->exported); in get_ksymbol_mod()
634 iter->pos_mod_end = iter->pos; in get_ksymbol_mod()
648 int ret = ftrace_mod_get_kallsym(iter->pos - iter->pos_mod_end, in get_ksymbol_ftrace_mod()
649 &iter->value, &iter->type, in get_ksymbol_ftrace_mod()
650 iter->name, iter->module_name, in get_ksymbol_ftrace_mod()
651 &iter->exported); in get_ksymbol_ftrace_mod()
653 iter->pos_ftrace_mod_end = iter->pos; in get_ksymbol_ftrace_mod()
664 strscpy(iter->module_name, "bpf", MODULE_NAME_LEN); in get_ksymbol_bpf()
665 iter->exported = 0; in get_ksymbol_bpf()
666 ret = bpf_get_kallsym(iter->pos - iter->pos_ftrace_mod_end, in get_ksymbol_bpf()
667 &iter->value, &iter->type, in get_ksymbol_bpf()
668 iter->name); in get_ksymbol_bpf()
670 iter->pos_bpf_end = iter->pos; in get_ksymbol_bpf()
684 strscpy(iter->module_name, "__builtin__kprobes", MODULE_NAME_LEN); in get_ksymbol_kprobe()
685 iter->exported = 0; in get_ksymbol_kprobe()
686 return kprobe_get_kallsym(iter->pos - iter->pos_bpf_end, in get_ksymbol_kprobe()
687 &iter->value, &iter->type, in get_ksymbol_kprobe()
688 iter->name) < 0 ? 0 : 1; in get_ksymbol_kprobe()
694 unsigned off = iter->nameoff; in get_ksymbol_core() local
696 iter->module_name[0] = '\0'; in get_ksymbol_core()
697 iter->value = kallsyms_sym_address(iter->pos); in get_ksymbol_core()
699 iter->type = kallsyms_get_symbol_type(off); in get_ksymbol_core()
701 off = kallsyms_expand_symbol(off, iter->name, ARRAY_SIZE(iter->name)); in get_ksymbol_core()
703 return off - iter->nameoff; in get_ksymbol_core()
708 iter->name[0] = '\0'; in reset_iter()
709 iter->nameoff = get_symbol_offset(new_pos); in reset_iter()
710 iter->pos = new_pos; in reset_iter()
712 iter->pos_mod_end = 0; in reset_iter()
713 iter->pos_ftrace_mod_end = 0; in reset_iter()
714 iter->pos_bpf_end = 0; in reset_iter()
720 * in iter->pos_..._end as each section is added, and so can be used to
721 * determine which get_ksymbol_...() function to call next.
725 iter->pos = pos; in update_iter_mod()
727 if ((!iter->pos_mod_end || iter->pos_mod_end > pos) && in update_iter_mod()
731 if ((!iter->pos_ftrace_mod_end || iter->pos_ftrace_mod_end > pos) && in update_iter_mod()
735 if ((!iter->pos_bpf_end || iter->pos_bpf_end > pos) && in update_iter_mod()
750 if (pos != iter->pos) in update_iter()
753 iter->nameoff += get_ksymbol_core(iter); in update_iter()
754 iter->pos++; in update_iter()
763 if (!update_iter(m->private, *pos)) in s_next()
770 if (!update_iter(m->private, *pos)) in s_start()
772 return m->private; in s_start()
782 struct kallsym_iter *iter = m->private; in s_show()
785 if (!iter->name[0]) in s_show()
788 value = iter->show_value ? (void *)iter->value : NULL; in s_show()
790 if (iter->module_name[0]) { in s_show()
797 type = iter->exported ? toupper(iter->type) : in s_show()
798 tolower(iter->type); in s_show()
800 type, iter->name, iter->module_name); in s_show()
803 iter->type, iter->name); in s_show()
833 ctx.ksym = m ? m->private : NULL; in ksym_prog_seq_show()
866 iter->show_value = kallsyms_show_value(current_cred()); in bpf_iter_ksym_init()
907 * We keep iterator in m->private, since normal case is to in kallsyms_open()
908 * s_start from where we left off, so we avoid doing in kallsyms_open()
914 return -ENOMEM; in kallsyms_open()
921 iter->show_value = kallsyms_show_value(file->f_cred); in kallsyms_open()