diff options
| author | Andrew Morton <akpm@digeo.com> | 2003-04-12 13:01:17 -0700 |
|---|---|---|
| committer | James Bottomley <jejb@raven.il.steeleye.com> | 2003-04-12 13:01:17 -0700 |
| commit | 4b4bd81a64ff2826bd964b78753172591df34612 (patch) | |
| tree | c04aea1ef99bb3040a8af085fabe36a571452ab7 /kernel | |
| parent | 77a9874a1428dc2c0abd4bf8ed3c892d9d92ba6f (diff) | |
[PATCH] Put all functions in kallsyms
From: Rusty Russell <rusty@rustcorp.com.au>
Introduce _sinittext and _einittext (cf. _stext and _etext), so kallsyms
includes __init functions.
TODO: Use huffman name compression and 16-bit offsets (see IDE
oopser patch)
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/extable.c | 6 | ||||
| -rw-r--r-- | kernel/kallsyms.c | 21 |
2 files changed, 24 insertions, 3 deletions
diff --git a/kernel/extable.c b/kernel/extable.c index 5363e7f6f9e4..d49099854024 100644 --- a/kernel/extable.c +++ b/kernel/extable.c @@ -20,7 +20,7 @@ extern const struct exception_table_entry __start___ex_table[]; extern const struct exception_table_entry __stop___ex_table[]; -extern char _stext[], _etext[]; +extern char _stext[], _etext[], _sinittext[], _einittext[]; /* Given an address, look for it in the exception tables. */ const struct exception_table_entry *search_exception_tables(unsigned long addr) @@ -39,5 +39,9 @@ int kernel_text_address(unsigned long addr) addr <= (unsigned long)_etext) return 1; + if (addr >= (unsigned long)_sinittext && + addr <= (unsigned long)_einittext) + return 1; + return module_text_address(addr) != NULL; } diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index 822945bd923b..3e9fbda3593c 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -15,7 +15,22 @@ extern unsigned long kallsyms_num_syms __attribute__((weak)); extern char kallsyms_names[] __attribute__((weak)); /* Defined by the linker script. */ -extern char _stext[], _etext[]; +extern char _stext[], _etext[], _sinittext[], _einittext[]; + +static inline int is_kernel_inittext(unsigned long addr) +{ + if (addr >= (unsigned long)_sinittext + && addr <= (unsigned long)_einittext) + return 1; + return 0; +} + +static inline int is_kernel_text(unsigned long addr) +{ + if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) + return 1; + return 0; +} /* Lookup an address. modname is set to NULL if it's in the kernel. */ const char *kallsyms_lookup(unsigned long addr, @@ -31,7 +46,7 @@ const char *kallsyms_lookup(unsigned long addr, namebuf[127] = 0; namebuf[0] = 0; - if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) { + if (is_kernel_text(addr) || is_kernel_inittext(addr)) { unsigned long symbol_end; char *name = kallsyms_names; @@ -52,6 +67,8 @@ const char *kallsyms_lookup(unsigned long addr, /* Base symbol size on next symbol. */ if (best + 1 < kallsyms_num_syms) symbol_end = kallsyms_addresses[best + 1]; + else if (is_kernel_inittext(addr)) + symbol_end = (unsigned long)_einittext; else symbol_end = (unsigned long)_etext; |
