aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/kallsyms.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kallsyms.c')
-rw-r--r--kernel/kallsyms.c81
1 files changed, 56 insertions, 25 deletions
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index 5a0de8409739..f1bda23140b2 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -214,8 +214,10 @@ static unsigned long get_symbol_pos(unsigned long addr,
214 symbol_end = (unsigned long)_etext; 214 symbol_end = (unsigned long)_etext;
215 } 215 }
216 216
217 *symbolsize = symbol_end - symbol_start; 217 if (symbolsize)
218 *offset = addr - symbol_start; 218 *symbolsize = symbol_end - symbol_start;
219 if (offset)
220 *offset = addr - symbol_start;
219 221
220 return low; 222 return low;
221} 223}
@@ -267,6 +269,42 @@ const char *kallsyms_lookup(unsigned long addr,
267 return NULL; 269 return NULL;
268} 270}
269 271
272int lookup_symbol_name(unsigned long addr, char *symname)
273{
274 symname[0] = '\0';
275 symname[KSYM_NAME_LEN] = '\0';
276
277 if (is_ksym_addr(addr)) {
278 unsigned long pos;
279
280 pos = get_symbol_pos(addr, NULL, NULL);
281 /* Grab name */
282 kallsyms_expand_symbol(get_symbol_offset(pos), symname);
283 return 0;
284 }
285 /* see if it's in a module */
286 return lookup_module_symbol_name(addr, symname);
287}
288
289int lookup_symbol_attrs(unsigned long addr, unsigned long *size,
290 unsigned long *offset, char *modname, char *name)
291{
292 name[0] = '\0';
293 name[KSYM_NAME_LEN] = '\0';
294
295 if (is_ksym_addr(addr)) {
296 unsigned long pos;
297
298 pos = get_symbol_pos(addr, size, offset);
299 /* Grab name */
300 kallsyms_expand_symbol(get_symbol_offset(pos), name);
301 modname[0] = '\0';
302 return 0;
303 }
304 /* see if it's in a module */
305 return lookup_module_symbol_attrs(addr, size, offset, modname, name);
306}
307
270/* Look up a kernel symbol and return it in a text buffer. */ 308/* Look up a kernel symbol and return it in a text buffer. */
271int sprint_symbol(char *buffer, unsigned long address) 309int sprint_symbol(char *buffer, unsigned long address)
272{ 310{
@@ -301,25 +339,20 @@ void __print_symbol(const char *fmt, unsigned long address)
301struct kallsym_iter 339struct kallsym_iter
302{ 340{
303 loff_t pos; 341 loff_t pos;
304 struct module *owner;
305 unsigned long value; 342 unsigned long value;
306 unsigned int nameoff; /* If iterating in core kernel symbols */ 343 unsigned int nameoff; /* If iterating in core kernel symbols */
307 char type; 344 char type;
308 char name[KSYM_NAME_LEN+1]; 345 char name[KSYM_NAME_LEN+1];
346 char module_name[MODULE_NAME_LEN + 1];
347 int exported;
309}; 348};
310 349
311static int get_ksymbol_mod(struct kallsym_iter *iter) 350static int get_ksymbol_mod(struct kallsym_iter *iter)
312{ 351{
313 iter->owner = module_get_kallsym(iter->pos - kallsyms_num_syms, 352 if (module_get_kallsym(iter->pos - kallsyms_num_syms, &iter->value,
314 &iter->value, &iter->type, 353 &iter->type, iter->name, iter->module_name,
315 iter->name, sizeof(iter->name)); 354 &iter->exported) < 0)
316 if (iter->owner == NULL)
317 return 0; 355 return 0;
318
319 /* Label it "global" if it is exported, "local" if not exported. */
320 iter->type = is_exported(iter->name, iter->owner)
321 ? toupper(iter->type) : tolower(iter->type);
322
323 return 1; 356 return 1;
324} 357}
325 358
@@ -328,7 +361,7 @@ static unsigned long get_ksymbol_core(struct kallsym_iter *iter)
328{ 361{
329 unsigned off = iter->nameoff; 362 unsigned off = iter->nameoff;
330 363
331 iter->owner = NULL; 364 iter->module_name[0] = '\0';
332 iter->value = kallsyms_addresses[iter->pos]; 365 iter->value = kallsyms_addresses[iter->pos];
333 366
334 iter->type = kallsyms_get_symbol_type(off); 367 iter->type = kallsyms_get_symbol_type(off);
@@ -392,12 +425,17 @@ static int s_show(struct seq_file *m, void *p)
392 if (!iter->name[0]) 425 if (!iter->name[0])
393 return 0; 426 return 0;
394 427
395 if (iter->owner) 428 if (iter->module_name[0]) {
429 char type;
430
431 /* Label it "global" if it is exported,
432 * "local" if not exported. */
433 type = iter->exported ? toupper(iter->type) :
434 tolower(iter->type);
396 seq_printf(m, "%0*lx %c %s\t[%s]\n", 435 seq_printf(m, "%0*lx %c %s\t[%s]\n",
397 (int)(2*sizeof(void*)), 436 (int)(2*sizeof(void*)),
398 iter->value, iter->type, iter->name, 437 iter->value, type, iter->name, iter->module_name);
399 module_name(iter->owner)); 438 } else
400 else
401 seq_printf(m, "%0*lx %c %s\n", 439 seq_printf(m, "%0*lx %c %s\n",
402 (int)(2*sizeof(void*)), 440 (int)(2*sizeof(void*)),
403 iter->value, iter->type, iter->name); 441 iter->value, iter->type, iter->name);
@@ -432,18 +470,11 @@ static int kallsyms_open(struct inode *inode, struct file *file)
432 return ret; 470 return ret;
433} 471}
434 472
435static int kallsyms_release(struct inode *inode, struct file *file)
436{
437 struct seq_file *m = (struct seq_file *)file->private_data;
438 kfree(m->private);
439 return seq_release(inode, file);
440}
441
442static const struct file_operations kallsyms_operations = { 473static const struct file_operations kallsyms_operations = {
443 .open = kallsyms_open, 474 .open = kallsyms_open,
444 .read = seq_read, 475 .read = seq_read,
445 .llseek = seq_lseek, 476 .llseek = seq_lseek,
446 .release = kallsyms_release, 477 .release = seq_release_private,
447}; 478};
448 479
449static int __init kallsyms_init(void) 480static int __init kallsyms_init(void)