2
* kallsyms.c: in-kernel printing of symbolic oopses and stack traces.
4
* Rewritten and vastly simplified by Rusty Russell for in-kernel
6
* Copyright 2002 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation
10
* (25/Aug/2004) Paulo Marques <pmarques@grupopie.com>
11
* Changed the compression method from stem compression to "table lookup"
12
* compression (see scripts/kallsyms.c for a more complete description)
14
#include <linux/kallsyms.h>
15
#include <linux/module.h>
16
#include <linux/init.h>
17
#include <linux/seq_file.h>
19
#include <linux/kdb.h>
20
#include <linux/err.h>
21
#include <linux/proc_fs.h>
22
#include <linux/sched.h> /* for cond_resched */
24
#include <linux/ctype.h>
25
#include <linux/slab.h>
27
#include <asm/sections.h>
29
#ifdef CONFIG_KALLSYMS_ALL
36
* These will be re-linked against their real values
37
* during the second link stage.
39
extern const unsigned long kallsyms_addresses[] __attribute__((weak));
40
extern const u8 kallsyms_names[] __attribute__((weak));
43
* Tell the compiler that the count isn't in the small data section if the arch
46
extern const unsigned long kallsyms_num_syms
47
__attribute__((weak, section(".rodata")));
49
extern const u8 kallsyms_token_table[] __attribute__((weak));
50
extern const u16 kallsyms_token_index[] __attribute__((weak));
52
extern const unsigned long kallsyms_markers[] __attribute__((weak));
54
static inline int is_kernel_inittext(unsigned long addr)
56
if (addr >= (unsigned long)_sinittext
57
&& addr <= (unsigned long)_einittext)
62
static inline int is_kernel_text(unsigned long addr)
64
if ((addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) ||
65
arch_is_kernel_text(addr))
67
return in_gate_area_no_mm(addr);
70
static inline int is_kernel(unsigned long addr)
72
if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end)
74
return in_gate_area_no_mm(addr);
77
static int is_ksym_addr(unsigned long addr)
80
return is_kernel(addr);
82
return is_kernel_text(addr) || is_kernel_inittext(addr);
86
* Expand a compressed symbol data into the resulting uncompressed string,
87
* given the offset to where the symbol is in the compressed stream.
89
static unsigned int kallsyms_expand_symbol(unsigned int off, char *result)
91
int len, skipped_first = 0;
92
const u8 *tptr, *data;
94
/* Get the compressed symbol length from the first symbol byte. */
95
data = &kallsyms_names[off];
100
* Update the offset to return the offset for the next symbol on
101
* the compressed stream.
106
* For every byte on the compressed symbol data, copy the table
107
* entry for that byte.
110
tptr = &kallsyms_token_table[kallsyms_token_index[*data]];
126
/* Return to offset to the next symbol. */
131
* Get symbol type information. This is encoded as a single char at the
132
* beginning of the symbol name.
134
static char kallsyms_get_symbol_type(unsigned int off)
137
* Get just the first code, look it up in the token table,
138
* and return the first char from this token.
140
return kallsyms_token_table[kallsyms_token_index[kallsyms_names[off + 1]]];
145
* Find the offset on the compressed stream given and index in the
148
static unsigned int get_symbol_offset(unsigned long pos)
154
* Use the closest marker we have. We have markers every 256 positions,
155
* so that should be close enough.
157
name = &kallsyms_names[kallsyms_markers[pos >> 8]];
160
* Sequentially scan all the symbols up to the point we're searching
161
* for. Every symbol is stored in a [<len>][<len> bytes of data] format,
162
* so we just need to add the len to the current pointer for every
163
* symbol we wish to skip.
165
for (i = 0; i < (pos & 0xFF); i++)
166
name = name + (*name) + 1;
168
return name - kallsyms_names;
171
/* Lookup the address for this symbol. Returns 0 if not found. */
172
unsigned long kallsyms_lookup_name(const char *name)
174
char namebuf[KSYM_NAME_LEN];
178
for (i = 0, off = 0; i < kallsyms_num_syms; i++) {
179
off = kallsyms_expand_symbol(off, namebuf);
181
if (strcmp(namebuf, name) == 0)
182
return kallsyms_addresses[i];
184
return module_kallsyms_lookup_name(name);
186
EXPORT_SYMBOL_GPL(kallsyms_lookup_name);
188
int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
192
char namebuf[KSYM_NAME_LEN];
197
for (i = 0, off = 0; i < kallsyms_num_syms; i++) {
198
off = kallsyms_expand_symbol(off, namebuf);
199
ret = fn(data, namebuf, NULL, kallsyms_addresses[i]);
203
return module_kallsyms_on_each_symbol(fn, data);
205
EXPORT_SYMBOL_GPL(kallsyms_on_each_symbol);
207
static unsigned long get_symbol_pos(unsigned long addr,
208
unsigned long *symbolsize,
209
unsigned long *offset)
211
unsigned long symbol_start = 0, symbol_end = 0;
212
unsigned long i, low, high, mid;
214
/* This kernel should never had been booted. */
215
BUG_ON(!kallsyms_addresses);
217
/* Do a binary search on the sorted kallsyms_addresses array. */
219
high = kallsyms_num_syms;
221
while (high - low > 1) {
222
mid = low + (high - low) / 2;
223
if (kallsyms_addresses[mid] <= addr)
230
* Search for the first aliased symbol. Aliased
231
* symbols are symbols with the same address.
233
while (low && kallsyms_addresses[low-1] == kallsyms_addresses[low])
236
symbol_start = kallsyms_addresses[low];
238
/* Search for next non-aliased symbol. */
239
for (i = low + 1; i < kallsyms_num_syms; i++) {
240
if (kallsyms_addresses[i] > symbol_start) {
241
symbol_end = kallsyms_addresses[i];
246
/* If we found no next symbol, we use the end of the section. */
248
if (is_kernel_inittext(addr))
249
symbol_end = (unsigned long)_einittext;
251
symbol_end = (unsigned long)_end;
253
symbol_end = (unsigned long)_etext;
257
*symbolsize = symbol_end - symbol_start;
259
*offset = addr - symbol_start;
265
* Lookup an address but don't bother to find any names.
267
int kallsyms_lookup_size_offset(unsigned long addr, unsigned long *symbolsize,
268
unsigned long *offset)
270
char namebuf[KSYM_NAME_LEN];
271
if (is_ksym_addr(addr))
272
return !!get_symbol_pos(addr, symbolsize, offset);
274
return !!module_address_lookup(addr, symbolsize, offset, NULL, namebuf);
279
* - modname is set to NULL if it's in the kernel.
280
* - We guarantee that the returned name is valid until we reschedule even if.
281
* It resides in a module.
282
* - We also guarantee that modname will be valid until rescheduled.
284
const char *kallsyms_lookup(unsigned long addr,
285
unsigned long *symbolsize,
286
unsigned long *offset,
287
char **modname, char *namebuf)
289
namebuf[KSYM_NAME_LEN - 1] = 0;
292
if (is_ksym_addr(addr)) {
295
pos = get_symbol_pos(addr, symbolsize, offset);
297
kallsyms_expand_symbol(get_symbol_offset(pos), namebuf);
303
/* See if it's in a module. */
304
return module_address_lookup(addr, symbolsize, offset, modname,
308
int lookup_symbol_name(unsigned long addr, char *symname)
311
symname[KSYM_NAME_LEN - 1] = '\0';
313
if (is_ksym_addr(addr)) {
316
pos = get_symbol_pos(addr, NULL, NULL);
318
kallsyms_expand_symbol(get_symbol_offset(pos), symname);
321
/* See if it's in a module. */
322
return lookup_module_symbol_name(addr, symname);
325
int lookup_symbol_attrs(unsigned long addr, unsigned long *size,
326
unsigned long *offset, char *modname, char *name)
329
name[KSYM_NAME_LEN - 1] = '\0';
331
if (is_ksym_addr(addr)) {
334
pos = get_symbol_pos(addr, size, offset);
336
kallsyms_expand_symbol(get_symbol_offset(pos), name);
340
/* See if it's in a module. */
341
return lookup_module_symbol_attrs(addr, size, offset, modname, name);
344
/* Look up a kernel symbol and return it in a text buffer. */
345
static int __sprint_symbol(char *buffer, unsigned long address,
350
unsigned long offset, size;
353
address += symbol_offset;
354
name = kallsyms_lookup(address, &size, &offset, &modname, buffer);
356
return sprintf(buffer, "0x%lx", address);
359
strcpy(buffer, name);
360
len = strlen(buffer);
362
offset -= symbol_offset;
365
len += sprintf(buffer, "+%#lx/%#lx [%s]", offset, size, modname);
367
len += sprintf(buffer, "+%#lx/%#lx", offset, size);
373
* sprint_symbol - Look up a kernel symbol and return it in a text buffer
374
* @buffer: buffer to be stored
375
* @address: address to lookup
377
* This function looks up a kernel symbol with @address and stores its name,
378
* offset, size and module name to @buffer if possible. If no symbol was found,
379
* just saves its @address as is.
381
* This function returns the number of bytes stored in @buffer.
383
int sprint_symbol(char *buffer, unsigned long address)
385
return __sprint_symbol(buffer, address, 0);
388
EXPORT_SYMBOL_GPL(sprint_symbol);
391
* sprint_backtrace - Look up a backtrace symbol and return it in a text buffer
392
* @buffer: buffer to be stored
393
* @address: address to lookup
395
* This function is for stack backtrace and does the same thing as
396
* sprint_symbol() but with modified/decreased @address. If there is a
397
* tail-call to the function marked "noreturn", gcc optimized out code after
398
* the call so that the stack-saved return address could point outside of the
399
* caller. This function ensures that kallsyms will find the original caller
400
* by decreasing @address.
402
* This function returns the number of bytes stored in @buffer.
404
int sprint_backtrace(char *buffer, unsigned long address)
406
return __sprint_symbol(buffer, address, -1);
409
/* Look up a kernel symbol and print it to the kernel messages. */
410
void __print_symbol(const char *fmt, unsigned long address)
412
char buffer[KSYM_SYMBOL_LEN];
414
sprint_symbol(buffer, address);
418
EXPORT_SYMBOL(__print_symbol);
420
/* To avoid using get_symbol_offset for every symbol, we carry prefix along. */
421
struct kallsym_iter {
424
unsigned int nameoff; /* If iterating in core kernel symbols. */
426
char name[KSYM_NAME_LEN];
427
char module_name[MODULE_NAME_LEN];
431
static int get_ksymbol_mod(struct kallsym_iter *iter)
433
if (module_get_kallsym(iter->pos - kallsyms_num_syms, &iter->value,
434
&iter->type, iter->name, iter->module_name,
435
&iter->exported) < 0)
440
/* Returns space to next name. */
441
static unsigned long get_ksymbol_core(struct kallsym_iter *iter)
443
unsigned off = iter->nameoff;
445
iter->module_name[0] = '\0';
446
iter->value = kallsyms_addresses[iter->pos];
448
iter->type = kallsyms_get_symbol_type(off);
450
off = kallsyms_expand_symbol(off, iter->name);
452
return off - iter->nameoff;
455
static void reset_iter(struct kallsym_iter *iter, loff_t new_pos)
457
iter->name[0] = '\0';
458
iter->nameoff = get_symbol_offset(new_pos);
462
/* Returns false if pos at or past end of file. */
463
static int update_iter(struct kallsym_iter *iter, loff_t pos)
465
/* Module symbols can be accessed randomly. */
466
if (pos >= kallsyms_num_syms) {
468
return get_ksymbol_mod(iter);
471
/* If we're not on the desired position, reset to new position. */
472
if (pos != iter->pos)
473
reset_iter(iter, pos);
475
iter->nameoff += get_ksymbol_core(iter);
481
static void *s_next(struct seq_file *m, void *p, loff_t *pos)
485
if (!update_iter(m->private, *pos))
490
static void *s_start(struct seq_file *m, loff_t *pos)
492
if (!update_iter(m->private, *pos))
497
static void s_stop(struct seq_file *m, void *p)
501
static int s_show(struct seq_file *m, void *p)
503
struct kallsym_iter *iter = m->private;
505
/* Some debugging symbols have no name. Ignore them. */
509
if (iter->module_name[0]) {
513
* Label it "global" if it is exported,
514
* "local" if not exported.
516
type = iter->exported ? toupper(iter->type) :
518
seq_printf(m, "%pK %c %s\t[%s]\n", (void *)iter->value,
519
type, iter->name, iter->module_name);
521
seq_printf(m, "%pK %c %s\n", (void *)iter->value,
522
iter->type, iter->name);
526
static const struct seq_operations kallsyms_op = {
533
static int kallsyms_open(struct inode *inode, struct file *file)
536
* We keep iterator in m->private, since normal case is to
537
* s_start from where we left off, so we avoid doing
538
* using get_symbol_offset for every symbol.
540
struct kallsym_iter *iter;
543
iter = kmalloc(sizeof(*iter), GFP_KERNEL);
548
ret = seq_open(file, &kallsyms_op);
550
((struct seq_file *)file->private_data)->private = iter;
556
#ifdef CONFIG_KGDB_KDB
557
const char *kdb_walk_kallsyms(loff_t *pos)
559
static struct kallsym_iter kdb_walk_kallsyms_iter;
561
memset(&kdb_walk_kallsyms_iter, 0,
562
sizeof(kdb_walk_kallsyms_iter));
563
reset_iter(&kdb_walk_kallsyms_iter, 0);
566
if (!update_iter(&kdb_walk_kallsyms_iter, *pos))
569
/* Some debugging symbols have no name. Ignore them. */
570
if (kdb_walk_kallsyms_iter.name[0])
571
return kdb_walk_kallsyms_iter.name;
574
#endif /* CONFIG_KGDB_KDB */
576
static const struct file_operations kallsyms_operations = {
577
.open = kallsyms_open,
580
.release = seq_release_private,
583
static int __init kallsyms_init(void)
585
proc_create("kallsyms", 0444, NULL, &kallsyms_operations);
588
device_initcall(kallsyms_init);