diff options
Diffstat (limited to 'kernel/kallsyms.c')
-rw-r--r-- | kernel/kallsyms.c | 81 |
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 | ||
272 | int 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 | |||
289 | int 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. */ |
271 | int sprint_symbol(char *buffer, unsigned long address) | 309 | int sprint_symbol(char *buffer, unsigned long address) |
272 | { | 310 | { |
@@ -301,25 +339,20 @@ void __print_symbol(const char *fmt, unsigned long address) | |||
301 | struct kallsym_iter | 339 | struct 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 | ||
311 | static int get_ksymbol_mod(struct kallsym_iter *iter) | 350 | static 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 | ||
435 | static 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 | |||
442 | static const struct file_operations kallsyms_operations = { | 473 | static 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 | ||
449 | static int __init kallsyms_init(void) | 480 | static int __init kallsyms_init(void) |