Commit 4b4bd81a authored by Andrew Morton's avatar Andrew Morton Committed by James Bottomley

[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)
parent 77a9874a
...@@ -32,7 +32,11 @@ SECTIONS ...@@ -32,7 +32,11 @@ SECTIONS
/* Will be freed after init */ /* Will be freed after init */
. = ALIGN(8192); /* Init code and data */ . = ALIGN(8192); /* Init code and data */
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(16); . = ALIGN(16);
......
...@@ -14,7 +14,9 @@ SECTIONS ...@@ -14,7 +14,9 @@ SECTIONS
.init : { /* Init code and data */ .init : { /* Init code and data */
_stext = .; _stext = .;
__init_begin = .; __init_begin = .;
_sinittext = .;
*(.init.text) *(.init.text)
_einittext = .;
__proc_info_begin = .; __proc_info_begin = .;
*(.proc.info) *(.proc.info)
__proc_info_end = .; __proc_info_end = .;
......
...@@ -18,7 +18,9 @@ SECTIONS ...@@ -18,7 +18,9 @@ SECTIONS
.init : { /* Init code and data */ .init : { /* Init code and data */
_stext = .; _stext = .;
__init_begin = .; __init_begin = .;
_sinittext = .;
*(.init.text) *(.init.text)
_einittext = .;
__proc_info_begin = .; __proc_info_begin = .;
*(.proc.info) *(.proc.info)
__proc_info_end = .; __proc_info_end = .;
......
...@@ -54,7 +54,11 @@ SECTIONS ...@@ -54,7 +54,11 @@ SECTIONS
/* will be freed after init */ /* will be freed after init */
. = ALIGN(4096); /* Init code and data */ . = ALIGN(4096); /* Init code and data */
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(16); . = ALIGN(16);
__setup_start = .; __setup_start = .;
......
...@@ -96,7 +96,11 @@ SECTIONS ...@@ -96,7 +96,11 @@ SECTIONS
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
__init_begin = .; __init_begin = .;
.init.text : AT(ADDR(.init.text) - PAGE_OFFSET) .init.text : AT(ADDR(.init.text) - PAGE_OFFSET)
{ *(.init.text) } {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : AT(ADDR(.init.data) - PAGE_OFFSET) .init.data : AT(ADDR(.init.data) - PAGE_OFFSET)
{ *(.init.data) } { *(.init.data) }
......
...@@ -40,7 +40,11 @@ SECTIONS ...@@ -40,7 +40,11 @@ SECTIONS
/* will be freed after init */ /* will be freed after init */
. = ALIGN(4096); /* Init code and data */ . = ALIGN(4096); /* Init code and data */
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(16); . = ALIGN(16);
__setup_start = .; __setup_start = .;
......
...@@ -34,7 +34,11 @@ SECTIONS ...@@ -34,7 +34,11 @@ SECTIONS
/* will be freed after init */ /* will be freed after init */
. = ALIGN(8192); /* Init code and data */ . = ALIGN(8192); /* Init code and data */
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(16); . = ALIGN(16);
__setup_start = .; __setup_start = .;
......
...@@ -282,7 +282,9 @@ SECTIONS { ...@@ -282,7 +282,9 @@ SECTIONS {
.init : { .init : {
. = ALIGN(4096); . = ALIGN(4096);
__init_begin = .; __init_begin = .;
_sinittext = .;
*(.init.text) *(.init.text)
_einittext = .;
*(.init.data) *(.init.data)
. = ALIGN(16); . = ALIGN(16);
__setup_start = .; __setup_start = .;
......
...@@ -53,7 +53,11 @@ SECTIONS ...@@ -53,7 +53,11 @@ SECTIONS
. = ALIGN(16384); . = ALIGN(16384);
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(16); . = ALIGN(16);
__setup_start = .; __setup_start = .;
......
...@@ -78,7 +78,11 @@ SECTIONS ...@@ -78,7 +78,11 @@ SECTIONS
. = ALIGN(4096); . = ALIGN(4096);
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { .init.data : {
*(.init.data); *(.init.data);
__vtop_table_begin = .; __vtop_table_begin = .;
......
...@@ -77,7 +77,11 @@ SECTIONS ...@@ -77,7 +77,11 @@ SECTIONS
/* will be freed after init */ /* will be freed after init */
. = ALIGN(4096); . = ALIGN(4096);
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(16); . = ALIGN(16);
__setup_start = .; __setup_start = .;
......
...@@ -58,7 +58,11 @@ SECTIONS ...@@ -58,7 +58,11 @@ SECTIONS
/* will be freed after init */ /* will be freed after init */
. = ALIGN(4096); /* Init code and data */ . = ALIGN(4096); /* Init code and data */
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(256); . = ALIGN(256);
__setup_start = .; __setup_start = .;
......
...@@ -58,7 +58,11 @@ SECTIONS ...@@ -58,7 +58,11 @@ SECTIONS
/* will be freed after init */ /* will be freed after init */
. = ALIGN(4096); /* Init code and data */ . = ALIGN(4096); /* Init code and data */
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(256); . = ALIGN(256);
__setup_start = .; __setup_start = .;
......
...@@ -34,7 +34,11 @@ SECTIONS ...@@ -34,7 +34,11 @@ SECTIONS
. = ALIGN(4096); . = ALIGN(4096);
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
__init_text_end = .; __init_text_end = .;
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(16); . = ALIGN(16);
......
...@@ -41,7 +41,11 @@ SECTIONS ...@@ -41,7 +41,11 @@ SECTIONS
. = ALIGN(8192); . = ALIGN(8192);
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(16); . = ALIGN(16);
__setup_start = .; __setup_start = .;
......
...@@ -105,7 +105,9 @@ ...@@ -105,7 +105,9 @@
#define RAMK_INIT_CONTENTS_NO_END \ #define RAMK_INIT_CONTENTS_NO_END \
. = ALIGN (4096) ; \ . = ALIGN (4096) ; \
__init_start = . ; \ __init_start = . ; \
_sinittext = .; \
*(.init.text) /* 2.5 convention */ \ *(.init.text) /* 2.5 convention */ \
_einittext = .; \
*(.init.data) \ *(.init.data) \
*(.text.init) /* 2.4 convention */ \ *(.text.init) /* 2.4 convention */ \
*(.data.init) \ *(.data.init) \
...@@ -125,7 +127,9 @@ ...@@ -125,7 +127,9 @@
/* The contents of `init' section for a ROM-resident kernel which /* The contents of `init' section for a ROM-resident kernel which
should go into ROM. */ should go into ROM. */
#define ROMK_INIT_ROM_CONTENTS \ #define ROMK_INIT_ROM_CONTENTS \
_sinittext = .; \
*(.init.text) /* 2.5 convention */ \ *(.init.text) /* 2.5 convention */ \
_einittext = .; \
*(.text.init) /* 2.4 convention */ \ *(.text.init) /* 2.4 convention */ \
INITCALL_CONTENTS \ INITCALL_CONTENTS \
INITRAMFS_CONTENTS INITRAMFS_CONTENTS
......
...@@ -78,7 +78,11 @@ SECTIONS ...@@ -78,7 +78,11 @@ SECTIONS
. = ALIGN(4096); /* Init code and data */ . = ALIGN(4096); /* Init code and data */
__init_begin = .; __init_begin = .;
.init.text : { *(.init.text) } .init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) } .init.data : { *(.init.data) }
. = ALIGN(16); . = ALIGN(16);
__setup_start = .; __setup_start = .;
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
extern const struct exception_table_entry __start___ex_table[]; extern const struct exception_table_entry __start___ex_table[];
extern const struct exception_table_entry __stop___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. */ /* Given an address, look for it in the exception tables. */
const struct exception_table_entry *search_exception_tables(unsigned long addr) const struct exception_table_entry *search_exception_tables(unsigned long addr)
...@@ -39,5 +39,9 @@ int kernel_text_address(unsigned long addr) ...@@ -39,5 +39,9 @@ int kernel_text_address(unsigned long addr)
addr <= (unsigned long)_etext) addr <= (unsigned long)_etext)
return 1; return 1;
if (addr >= (unsigned long)_sinittext &&
addr <= (unsigned long)_einittext)
return 1;
return module_text_address(addr) != NULL; return module_text_address(addr) != NULL;
} }
...@@ -15,7 +15,22 @@ extern unsigned long kallsyms_num_syms __attribute__((weak)); ...@@ -15,7 +15,22 @@ extern unsigned long kallsyms_num_syms __attribute__((weak));
extern char kallsyms_names[] __attribute__((weak)); extern char kallsyms_names[] __attribute__((weak));
/* Defined by the linker script. */ /* 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. */ /* Lookup an address. modname is set to NULL if it's in the kernel. */
const char *kallsyms_lookup(unsigned long addr, const char *kallsyms_lookup(unsigned long addr,
...@@ -31,7 +46,7 @@ const char *kallsyms_lookup(unsigned long addr, ...@@ -31,7 +46,7 @@ const char *kallsyms_lookup(unsigned long addr,
namebuf[127] = 0; namebuf[127] = 0;
namebuf[0] = 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; unsigned long symbol_end;
char *name = kallsyms_names; char *name = kallsyms_names;
...@@ -52,6 +67,8 @@ const char *kallsyms_lookup(unsigned long addr, ...@@ -52,6 +67,8 @@ const char *kallsyms_lookup(unsigned long addr,
/* Base symbol size on next symbol. */ /* Base symbol size on next symbol. */
if (best + 1 < kallsyms_num_syms) if (best + 1 < kallsyms_num_syms)
symbol_end = kallsyms_addresses[best + 1]; symbol_end = kallsyms_addresses[best + 1];
else if (is_kernel_inittext(addr))
symbol_end = (unsigned long)_einittext;
else else
symbol_end = (unsigned long)_etext; symbol_end = (unsigned long)_etext;
......
...@@ -21,7 +21,7 @@ struct sym_entry { ...@@ -21,7 +21,7 @@ struct sym_entry {
static struct sym_entry *table; static struct sym_entry *table;
static int size, cnt; static int size, cnt;
static unsigned long long _stext, _etext; static unsigned long long _stext, _etext, _sinittext, _einittext;
static void static void
usage(void) usage(void)
...@@ -51,10 +51,8 @@ read_symbol(FILE *in, struct sym_entry *s) ...@@ -51,10 +51,8 @@ read_symbol(FILE *in, struct sym_entry *s)
static int static int
symbol_valid(struct sym_entry *s) symbol_valid(struct sym_entry *s)
{ {
if (s->addr < _stext) if ((s->addr < _stext || s->addr > _etext)
return 0; && (s->addr < _sinittext || s->addr > _einittext))
if (s->addr > _etext)
return 0; return 0;
if (strstr(s->sym, "_compiled.")) if (strstr(s->sym, "_compiled."))
...@@ -85,6 +83,10 @@ read_map(FILE *in) ...@@ -85,6 +83,10 @@ read_map(FILE *in)
_stext = table[i].addr; _stext = table[i].addr;
if (strcmp(table[i].sym, "_etext") == 0) if (strcmp(table[i].sym, "_etext") == 0)
_etext = table[i].addr; _etext = table[i].addr;
if (strcmp(table[i].sym, "_sinittext") == 0)
_sinittext = table[i].addr;
if (strcmp(table[i].sym, "_einittext") == 0)
_einittext = table[i].addr;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment