__notrace int kallsyms_lookup_symbol_name(unsigned long addr, char *symname) { unsigned long pos; symname[0] = '\0'; symname[KSYM_NAME_LEN - 1] = '\0'; pos = kallsyms_get_symbol_pos(addr, NULL, NULL); /* Grab name */ kallsyms_expand_symbol(kallsyms_get_symbol_offset(pos), symname); return 0; }
__notrace int kallsyms_lookup_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *name) { unsigned long pos; name[0] = '\0'; name[KSYM_NAME_LEN - 1] = '\0'; pos = kallsyms_get_symbol_pos(addr, size, offset); /* Grab name */ kallsyms_expand_symbol(kallsyms_get_symbol_offset(pos), name); return 0; }
/** * Lookup the address for this symbol. Returns 0 if not found. */ unsigned long kallsyms_lookup_name(const char *name) { char namebuf[KSYM_NAME_LEN+1]; unsigned long i; unsigned int off; for (i = 0, off = 0; i < kallsyms_num_syms; i++) { off = kallsyms_expand_symbol(off, namebuf); if (strcmp(namebuf, name) == 0) return kallsyms_addresses[i]; } return 0; }
const __notrace char *kallsyms_lookup(unsigned long addr, unsigned long *symbolsize, unsigned long *offset, char *namebuf) { unsigned long pos; namebuf[KSYM_NAME_LEN - 1] = 0; namebuf[0] = 0; pos = kallsyms_get_symbol_pos(addr, symbolsize, offset); /* Grab name */ kallsyms_expand_symbol(kallsyms_get_symbol_offset(pos), namebuf); return namebuf; }
int search_functions() { char namebuf[1024]; unsigned long i; unsigned long off; for (i = 0, off = 0; i < kallsyms_num_syms; i++) { off = kallsyms_expand_symbol(off, namebuf); if (strcmp(namebuf, "sony_ric_enabled") == 0) { sony_ric_enabled_address = kallsyms_addresses[i]; return 0; } } return -1; }
__notrace int kallsyms_on_each_symbol(int (*fn) (void *, const char *, unsigned long), void *data) { char namebuf[KSYM_NAME_LEN]; unsigned long i; unsigned int off; int ret; for (i = 0, off = 0; i < kallsyms_num_syms; i++) { off = kallsyms_expand_symbol(off, namebuf); ret = fn(data, namebuf, kallsyms_addresses[i]); if (ret != 0) return ret; } return 0; }
/* * Lookup an address * - modname is set to NULL if it's in the kernel. * - We guarantee that the returned name is valid until we reschedule even if. * It resides in a module. * - We also guarantee that modname will be valid until rescheduled. */ const char *kallsyms_lookup(unsigned long addr, unsigned long *symbolsize, unsigned long *offset, char **modname, char *namebuf) { namebuf[KSYM_NAME_LEN - 1] = 0; namebuf[0] = 0; if (is_kernel_text(addr)) { unsigned long pos; pos = get_symbol_pos(addr, symbolsize, offset); /* Grab name */ kallsyms_expand_symbol(get_symbol_offset(pos), namebuf); if (modname) *modname = NULL; return namebuf; } /* moduled not yet supported in kallsyms */ return NULL; }
/** * Lookup the symbol name corresponding to a kernel address */ const char *kallsyms_lookup(unsigned long addr, unsigned long *symbolsize, unsigned long *offset, char *namebuf) { unsigned long i, low, high, mid; /* This kernel should never had been booted. */ BUG_ON(!kallsyms_addresses); namebuf[KSYM_NAME_LEN] = 0; namebuf[0] = 0; if ((all_var && is_kernel(addr)) || (!all_var && (is_kernel_text(addr) || is_kernel_inittext(addr) || is_kernel_extratext(addr)))) { unsigned long symbol_end = 0; /* do a binary search on the sorted kallsyms_addresses array */ low = 0; high = kallsyms_num_syms; while (high-low > 1) { mid = (low + high) / 2; if (kallsyms_addresses[mid] <= addr) low = mid; else high = mid; } /* search for the first aliased symbol. Aliased symbols are symbols with the same address */ while (low && kallsyms_addresses[low - 1] == kallsyms_addresses[low]) --low; /* Grab name */ kallsyms_expand_symbol(get_symbol_offset(low), namebuf); /* Search for next non-aliased symbol */ for (i = low + 1; i < kallsyms_num_syms; i++) { if (kallsyms_addresses[i] > kallsyms_addresses[low]) { symbol_end = kallsyms_addresses[i]; break; } } /* if we found no next symbol, we use the end of the section */ if (!symbol_end) { if (is_kernel_inittext(addr)) symbol_end = (unsigned long)_einittext; else symbol_end = (all_var) ? (unsigned long)_end : (unsigned long)_etext; } if (symbolsize) *symbolsize = symbol_end - kallsyms_addresses[low]; if (offset) *offset = addr - kallsyms_addresses[low]; return namebuf; } return NULL; }