Lines Matching +full:look +full:- +full:up
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
75 len--; in kallsyms_expand_symbol()
83 maxlen--; in kallsyms_expand_symbol()
105 * Get just the first code, look it up in the token table, in kallsyms_get_symbol_type()
128 * Sequentially scan all the symbols up to the point we're searching in get_symbol_offset()
137 * If MSB is 1, it is a "big" symbol, so we need to look into in get_symbol_offset()
146 return name - kallsyms_names; in get_symbol_offset()
175 high = kallsyms_num_syms - 1; in kallsyms_lookup_names()
178 mid = low + (high - low) / 2; in kallsyms_lookup_names()
186 high = mid - 1; in kallsyms_lookup_names()
192 return -ESRCH; in kallsyms_lookup_names()
196 seq = get_symbol_seq(low - 1); in kallsyms_lookup_names()
201 low--; in kallsyms_lookup_names()
207 while (high < kallsyms_num_syms - 1) { in kallsyms_lookup_names()
289 while (high - low > 1) { in get_symbol_pos()
290 mid = low + (high - low) / 2; in get_symbol_pos()
301 while (low && kallsyms_sym_address(low-1) == kallsyms_sym_address(low)) in get_symbol_pos()
302 --low; in get_symbol_pos()
306 /* Search for next non-aliased symbol. */ in get_symbol_pos()
325 *symbolsize = symbol_end - symbol_start; in get_symbol_pos()
327 *offset = addr - symbol_start; in get_symbol_pos()
355 namebuf[KSYM_NAME_LEN - 1] = 0; in kallsyms_lookup_buildid()
389 * - modname is set to NULL if it's in the kernel.
390 * - We guarantee that the returned name is valid until we reschedule even if.
392 * - We also guarantee that modname will be valid until rescheduled.
411 symname[KSYM_NAME_LEN - 1] = '\0'; in lookup_symbol_name()
426 /* Look up a kernel symbol and return it in a text buffer. */
439 return sprintf(buffer, "0x%lx", address - symbol_offset); in __sprint_symbol()
441 offset -= symbol_offset; in __sprint_symbol()
464 * sprint_symbol - Look up a kernel symbol and return it in a text buffer
468 * This function looks up a kernel symbol with @address and stores its name,
481 * sprint_symbol_build_id - Look up a kernel symbol and return it in a text buffer
485 * This function looks up a kernel symbol with @address and stores its name,
498 * sprint_symbol_no_offset - Look up a kernel symbol and return it in a text buffer
502 * This function looks up a kernel symbol with @address and stores its name
515 * sprint_backtrace - Look up a backtrace symbol and return it in a text buffer
521 * tail-call to the function marked "noreturn", gcc optimized out code after
522 * the call so that the stack-saved return address could point outside of the
530 return __sprint_symbol(buffer, address, -1, 1, 0); in sprint_backtrace()
534 * sprint_backtrace_build_id - Look up a backtrace symbol and return it in a text buffer
540 * tail-call to the function marked "noreturn", gcc optimized out code after
541 * the call so that the stack-saved return address could point outside of the
550 return __sprint_symbol(buffer, address, -1, 1, 1); in sprint_backtrace_build_id()
570 int ret = module_get_kallsym(iter->pos - kallsyms_num_syms, in get_ksymbol_mod()
571 &iter->value, &iter->type, in get_ksymbol_mod()
572 iter->name, iter->module_name, in get_ksymbol_mod()
573 &iter->exported); in get_ksymbol_mod()
575 iter->pos_mod_end = iter->pos; in get_ksymbol_mod()
589 int ret = ftrace_mod_get_kallsym(iter->pos - iter->pos_mod_end, in get_ksymbol_ftrace_mod()
590 &iter->value, &iter->type, in get_ksymbol_ftrace_mod()
591 iter->name, iter->module_name, in get_ksymbol_ftrace_mod()
592 &iter->exported); in get_ksymbol_ftrace_mod()
594 iter->pos_ftrace_mod_end = iter->pos; in get_ksymbol_ftrace_mod()
605 strscpy(iter->module_name, "bpf", MODULE_NAME_LEN); in get_ksymbol_bpf()
606 iter->exported = 0; in get_ksymbol_bpf()
607 ret = bpf_get_kallsym(iter->pos - iter->pos_ftrace_mod_end, in get_ksymbol_bpf()
608 &iter->value, &iter->type, in get_ksymbol_bpf()
609 iter->name); in get_ksymbol_bpf()
611 iter->pos_bpf_end = iter->pos; in get_ksymbol_bpf()
625 strscpy(iter->module_name, "__builtin__kprobes", MODULE_NAME_LEN); in get_ksymbol_kprobe()
626 iter->exported = 0; in get_ksymbol_kprobe()
627 return kprobe_get_kallsym(iter->pos - iter->pos_bpf_end, in get_ksymbol_kprobe()
628 &iter->value, &iter->type, in get_ksymbol_kprobe()
629 iter->name) < 0 ? 0 : 1; in get_ksymbol_kprobe()
635 unsigned off = iter->nameoff; in get_ksymbol_core()
637 iter->module_name[0] = '\0'; in get_ksymbol_core()
638 iter->value = kallsyms_sym_address(iter->pos); in get_ksymbol_core()
640 iter->type = kallsyms_get_symbol_type(off); in get_ksymbol_core()
642 off = kallsyms_expand_symbol(off, iter->name, ARRAY_SIZE(iter->name)); in get_ksymbol_core()
644 return off - iter->nameoff; in get_ksymbol_core()
649 iter->name[0] = '\0'; in reset_iter()
650 iter->nameoff = get_symbol_offset(new_pos); in reset_iter()
651 iter->pos = new_pos; in reset_iter()
653 iter->pos_mod_end = 0; in reset_iter()
654 iter->pos_ftrace_mod_end = 0; in reset_iter()
655 iter->pos_bpf_end = 0; in reset_iter()
661 * in iter->pos_..._end as each section is added, and so can be used to
666 iter->pos = pos; in update_iter_mod()
668 if ((!iter->pos_mod_end || iter->pos_mod_end > pos) && in update_iter_mod()
672 if ((!iter->pos_ftrace_mod_end || iter->pos_ftrace_mod_end > pos) && in update_iter_mod()
676 if ((!iter->pos_bpf_end || iter->pos_bpf_end > pos) && in update_iter_mod()
691 if (pos != iter->pos) in update_iter()
694 iter->nameoff += get_ksymbol_core(iter); in update_iter()
695 iter->pos++; in update_iter()
704 if (!update_iter(m->private, *pos)) in s_next()
711 if (!update_iter(m->private, *pos)) in s_start()
713 return m->private; in s_start()
723 struct kallsym_iter *iter = m->private; in s_show()
726 if (!iter->name[0]) in s_show()
729 value = iter->show_value ? (void *)iter->value : NULL; in s_show()
731 if (iter->module_name[0]) { in s_show()
738 type = iter->exported ? toupper(iter->type) : in s_show()
739 tolower(iter->type); in s_show()
741 type, iter->name, iter->module_name); in s_show()
744 iter->type, iter->name); in s_show()
774 ctx.ksym = m ? m->private : NULL; in ksym_prog_seq_show()
807 iter->show_value = kallsyms_show_value(current_cred()); in bpf_iter_ksym_init()
847 * We keep iterator in m->private, since normal case is to in kallsyms_open()
854 return -ENOMEM; in kallsyms_open()
861 iter->show_value = kallsyms_show_value(file->f_cred); in kallsyms_open()