mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 07:04:28 +00:00
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:
parent
36c9169aa6
commit
ecb1dc8922
8 changed files with 75 additions and 53 deletions
17
Makefile
17
Makefile
|
@ -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)
|
||||||
|
|
|
@ -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
44
common/kallsyms.c
Normal 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
8
common/system_map.c
Normal 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;
|
|
@ -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
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue