summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAndrew Morton <akpm@digeo.com>2003-04-12 13:01:17 -0700
committerJames Bottomley <jejb@raven.il.steeleye.com>2003-04-12 13:01:17 -0700
commit4b4bd81a64ff2826bd964b78753172591df34612 (patch)
treec04aea1ef99bb3040a8af085fabe36a571452ab7 /kernel
parent77a9874a1428dc2c0abd4bf8ed3c892d9d92ba6f (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.c6
-rw-r--r--kernel/kallsyms.c21
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;