diff options
| -rw-r--r-- | Makefile | 17 | ||||
| -rw-r--r-- | common/Makefile | 1 | ||||
| -rw-r--r-- | common/kallsyms.c | 44 | ||||
| -rw-r--r-- | common/system_map.c | 8 | ||||
| -rw-r--r-- | cpu/blackfin/system_map.S | 18 | ||||
| -rw-r--r-- | cpu/blackfin/traps.c | 35 | ||||
| -rw-r--r-- | include/common.h | 3 | ||||
| -rw-r--r-- | include/configs/bfin_adi_common.h | 2 | 
8 files changed, 75 insertions, 53 deletions
| @@ -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) diff --git a/common/Makefile b/common/Makefile index 2ca10264c..ee0cb33ac 100644 --- a/common/Makefile +++ b/common/Makefile @@ -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 diff --git a/common/kallsyms.c b/common/kallsyms.c new file mode 100644 index 000000000..ce42a932b --- /dev/null +++ b/common/kallsyms.c @@ -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; +} diff --git a/common/system_map.c b/common/system_map.c new file mode 100644 index 000000000..8307293bf --- /dev/null +++ b/common/system_map.c @@ -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; diff --git a/cpu/blackfin/system_map.S b/cpu/blackfin/system_map.S deleted file mode 100644 index 286d7f34a..000000000 --- a/cpu/blackfin/system_map.S +++ /dev/null @@ -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 diff --git a/cpu/blackfin/traps.c b/cpu/blackfin/traps.c index 2121b0e4c..7e7c74ce4 100644 --- a/cpu/blackfin/traps.c +++ b/cpu/blackfin/traps.c @@ -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)  { diff --git a/include/common.h b/include/common.h index 30fff7d65..df0f5a01e 100644 --- a/include/common.h +++ b/include/common.h @@ -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); diff --git a/include/configs/bfin_adi_common.h b/include/configs/bfin_adi_common.h index bfe53762c..e0be07b47 100644 --- a/include/configs/bfin_adi_common.h +++ b/include/configs/bfin_adi_common.h @@ -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  /* |