Skip to content

Commit

Permalink
[PATCH] ppc32: platform-specific functions missing from kallsyms.
Browse files Browse the repository at this point in the history
The PPC32 kernel puts platform-specific functions into separate sections so
that unneeded parts of it can be freed when we've booted and actually
worked out what we're running on today.

This makes kallsyms ignore those functions, because they're not between
_[se]text or _[se]inittext.  Rather than teaching kallsyms about the
various pmac/chrp/etc sections, this patch adds '_[se]extratext' markers
for kallsyms.

Signed-off-by: David Woodhouse <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
dwmw2 authored and Linus Torvalds committed May 5, 2005
1 parent becf3ae commit 075d6eb
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 9 deletions.
2 changes: 2 additions & 0 deletions arch/ppc/kernel/vmlinux.lds.S
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ SECTIONS
__init_end = .;

. = ALIGN(4096);
_sextratext = .;
__pmac_begin = .;
.pmac.text : { *(.pmac.text) }
.pmac.data : { *(.pmac.data) }
Expand All @@ -171,6 +172,7 @@ SECTIONS
.openfirmware.data : { *(.openfirmware.data) }
. = ALIGN(4096);
__openfirmware_end = .;
_eextratext = .;

__bss_start = .;
.bss :
Expand Down
2 changes: 2 additions & 0 deletions include/asm-generic/sections.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ extern char _data[], _sdata[], _edata[];
extern char __bss_start[], __bss_stop[];
extern char __init_begin[], __init_end[];
extern char _sinittext[], _einittext[];
extern char _sextratext[] __attribute__((weak));
extern char _eextratext[] __attribute__((weak));
extern char _end[];

#endif /* _ASM_GENERIC_SECTIONS_H_ */
13 changes: 11 additions & 2 deletions kernel/kallsyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ static inline int is_kernel_inittext(unsigned long addr)
return 0;
}

static inline int is_kernel_extratext(unsigned long addr)
{
if (addr >= (unsigned long)_sextratext
&& addr <= (unsigned long)_eextratext)
return 1;
return 0;
}

static inline int is_kernel_text(unsigned long addr)
{
if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext)
Expand Down Expand Up @@ -169,8 +177,9 @@ const char *kallsyms_lookup(unsigned long addr,
namebuf[0] = 0;

if ((all_var && is_kernel(addr)) ||
(!all_var && (is_kernel_text(addr) || is_kernel_inittext(addr)))) {
unsigned long symbol_end=0;
(!all_var && (is_kernel_text(addr) || is_kernel_inittext(addr) ||
is_kernel_extratext(addr)))) {
unsigned long symbol_end = 0;

/* do a binary search on the sorted kallsyms_addresses array */
low = 0;
Expand Down
20 changes: 13 additions & 7 deletions scripts/kallsyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ struct sym_entry {

static struct sym_entry *table;
static int size, cnt;
static unsigned long long _stext, _etext, _sinittext, _einittext;
static unsigned long long _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext;
static int all_symbols = 0;
static char symbol_prefix_char = '\0';

Expand Down Expand Up @@ -139,6 +139,10 @@ read_symbol(FILE *in, struct sym_entry *s)
_sinittext = s->addr;
else if (strcmp(sym, "_einittext") == 0)
_einittext = s->addr;
else if (strcmp(sym, "_sextratext") == 0)
_sextratext = s->addr;
else if (strcmp(sym, "_eextratext") == 0)
_eextratext = s->addr;
else if (toupper(s->type) == 'A')
{
/* Keep these useful absolute symbols */
Expand Down Expand Up @@ -194,16 +198,18 @@ symbol_valid(struct sym_entry *s)
* and inittext sections are discarded */
if (!all_symbols) {
if ((s->addr < _stext || s->addr > _etext)
&& (s->addr < _sinittext || s->addr > _einittext))
&& (s->addr < _sinittext || s->addr > _einittext)
&& (s->addr < _sextratext || s->addr > _eextratext))
return 0;
/* Corner case. Discard any symbols with the same value as
* _etext or _einittext, they can move between pass 1 and 2
* when the kallsyms data is added. If these symbols move then
* they may get dropped in pass 2, which breaks the kallsyms
* rules.
* _etext _einittext or _eextratext; they can move between pass
* 1 and 2 when the kallsyms data are added. If these symbols
* move then they may get dropped in pass 2, which breaks the
* kallsyms rules.
*/
if ((s->addr == _etext && strcmp(s->sym + offset, "_etext")) ||
(s->addr == _einittext && strcmp(s->sym + offset, "_einittext")))
(s->addr == _einittext && strcmp(s->sym + offset, "_einittext")) ||
(s->addr == _eextratext && strcmp(s->sym + offset, "_eextratext")))
return 0;
}

Expand Down

0 comments on commit 075d6eb

Please sign in to comment.