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 $(obj)u-boot.dis: $(obj)u-boot
$(OBJDUMP) -d $< > $@ $(OBJDUMP) -d $< > $@
$(obj)u-boot: depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) GEN_UBOOT = \
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \ UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\ sed -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \ cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \ --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot -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 $(OBJS): depend
$(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@)) $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))
@ -448,10 +455,12 @@ cscope:
> cscope.files > cscope.files
cscope -b -q -k cscope -b -q -k
$(obj)System.map: $(obj)u-boot SYSTEM_MAP = \
@$(NM) $< | \ $(NM) $1 | \
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \ 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) # 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-$(CONFIG_CONSOLE_MUX) += iomux.o
COBJS-y += flash.o COBJS-y += flash.o
COBJS-$(CONFIG_CMD_KGDB) += kgdb.o COBJS-$(CONFIG_CMD_KGDB) += kgdb.o
COBJS-$(CONFIG_KALLSYMS) += kallsyms.o
COBJS-$(CONFIG_LCD) += lcd.o COBJS-$(CONFIG_LCD) += lcd.o
COBJS-$(CONFIG_LYNXKDI) += lynxkdi.o COBJS-$(CONFIG_LYNXKDI) += lynxkdi.o
COBJS-$(CONFIG_MODEM_SUPPORT) += modem.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 # define ENABLE_DUMP 0
#endif #endif
#ifdef CONFIG_DEBUG_DUMP_SYMS #ifndef CONFIG_KALLSYMS
# define ENABLE_DUMP_SYMS 1 const char *symbol_lookup(unsigned long addr, unsigned long *caddr)
#else
# define ENABLE_DUMP_SYMS 0
#endif
static const char *symbol_lookup(unsigned long addr, unsigned long *caddr)
{ {
if (!ENABLE_DUMP_SYMS) *caddr = addr;
return NULL; return "N/A";
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;
} }
#endif
static void decode_address(char *buf, unsigned long address) static void decode_address(char *buf, unsigned long address)
{ {

View file

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

View file

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