Add support for Linux-like kallsysms

The kernel stores address<->symbol names in it so things can be decoded at
runtime.  Do it in U-Boot, and we get nice symbol decoding when crashing.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
Mike Frysinger 2009-05-20 04:35:14 -04:00 committed by Wolfgang Denk
parent 36c9169aa6
commit ecb1dc8922
8 changed files with 75 additions and 53 deletions

View File

@ -344,12 +344,19 @@ $(obj)u-boot.sha1: $(obj)u-boot.bin
$(obj)u-boot.dis: $(obj)u-boot
$(OBJDUMP) -d $< > $@
$(obj)u-boot: depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT)
GEN_UBOOT = \
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
$(obj)u-boot: depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT)
$(GEN_UBOOT)
ifeq ($(CONFIG_KALLSYMS),y)
smap=`$(call SYSTEM_MAP,u-boot) | awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 "\\0"}'` ; \
$(CC) $(CFLAGS) -DSYSTEM_MAP="\"$${smap}\"" -c common/system_map.c -o $(obj)common/system_map.o
$(GEN_UBOOT) $(obj)common/system_map.o
endif
$(OBJS): depend
$(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))
@ -448,10 +455,12 @@ cscope:
> cscope.files
cscope -b -q -k
$(obj)System.map: $(obj)u-boot
@$(NM) $< | \
SYSTEM_MAP = \
$(NM) $1 | \
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
sort > $(obj)System.map
LC_ALL=C sort
$(obj)System.map: $(obj)u-boot
@$(call SYSTEM_MAP,$<) > $(obj)System.map
#
# Auto-generate the autoconf.mk file (which is included by all makefiles)

View File

@ -153,6 +153,7 @@ COBJS-$(CONFIG_CMD_DOC) += docecc.o
COBJS-$(CONFIG_CONSOLE_MUX) += iomux.o
COBJS-y += flash.o
COBJS-$(CONFIG_CMD_KGDB) += kgdb.o
COBJS-$(CONFIG_KALLSYMS) += kallsyms.o
COBJS-$(CONFIG_LCD) += lcd.o
COBJS-$(CONFIG_LYNXKDI) += lynxkdi.o
COBJS-$(CONFIG_MODEM_SUPPORT) += modem.o

44
common/kallsyms.c Normal file
View File

@ -0,0 +1,44 @@
/*
* Helper functions for working with the builtin symbol table
*
* Copyright (c) 2008-2009 Analog Devices Inc.
* Licensed under the GPL-2 or later.
*/
#include <common.h>
/* We need the weak marking as this symbol is provided specially */
extern const char system_map[] __attribute__((weak));
/* Given an address, return a pointer to the symbol name and store
* the base address in caddr. So if the symbol map had an entry:
* 03fb9b7c_spi_cs_deactivate
* Then the following call:
* unsigned long base;
* const char *sym = symbol_lookup(0x03fb9b80, &base);
* Would end up setting the variables like so:
* base = 0x03fb9b7c;
* sym = "_spi_cs_deactivate";
*/
const char *symbol_lookup(unsigned long addr, unsigned long *caddr)
{
const char *sym, *csym;
char *esym;
unsigned long sym_addr;
sym = system_map;
csym = NULL;
*caddr = 0;
while (*sym) {
sym_addr = simple_strtoul(sym, &esym, 16);
sym = esym;
if (sym_addr > addr)
break;
*caddr = sym_addr;
csym = sym;
sym += strlen(sym) + 1;
}
return csym;
}

8
common/system_map.c Normal file
View File

@ -0,0 +1,8 @@
/*
* The builtin symbol table for use with kallsyms
*
* Copyright (c) 2008-2009 Analog Devices Inc.
* Licensed under the GPL-2 or later.
*/
const char const system_map[] = SYSTEM_MAP;

View File

@ -1,18 +0,0 @@
/*
* system_map.S - optional symbol lookup for debugging
*
* Copyright (c) 2007 Analog Devices Inc.
* Licensed under the GPL-2 or later.
*/
#include <config.h>
#ifdef CONFIG_DEBUG_DUMP_SYMS
.data
.global _system_map
.type _system_map,@object
_system_map:
#include SYM_FILE
.asciz ""
.size _system_map,.-_system_map
#endif

View File

@ -171,38 +171,13 @@ void trap_c(struct pt_regs *regs)
# define ENABLE_DUMP 0
#endif
#ifdef CONFIG_DEBUG_DUMP_SYMS
# define ENABLE_DUMP_SYMS 1
#else
# define ENABLE_DUMP_SYMS 0
#endif
static const char *symbol_lookup(unsigned long addr, unsigned long *caddr)
#ifndef CONFIG_KALLSYMS
const char *symbol_lookup(unsigned long addr, unsigned long *caddr)
{
if (!ENABLE_DUMP_SYMS)
return NULL;
extern const char system_map[] __attribute__((__weak__));
const char *sym, *csym;
char *esym;
unsigned long sym_addr;
sym = system_map;
csym = NULL;
*caddr = 0;
while (*sym) {
sym_addr = simple_strtoul(sym, &esym, 16);
sym = esym;
if (sym_addr > addr)
break;
*caddr = sym_addr;
csym = sym;
sym += strlen(sym) + 1;
}
return csym;
*caddr = addr;
return "N/A";
}
#endif
static void decode_address(char *buf, unsigned long address)
{

View File

@ -300,6 +300,9 @@ int misc_init_r (void);
/* common/exports.c */
void jumptable_init(void);
/* common/kallsysm.c */
const char *symbol_lookup(unsigned long addr, unsigned long *caddr);
/* api/api.c */
void api_init (void);

View File

@ -91,7 +91,7 @@
*/
#define CONFIG_ENV_OVERWRITE 1
#define CONFIG_DEBUG_DUMP 1
#define CONFIG_DEBUG_DUMP_SYMS 1
#define CONFIG_KALLSYMS 1
#define CONFIG_PANIC_HANG 1
/*