xref: /openbmc/u-boot/common/kallsyms.c (revision 92afd368)
1*ecb1dc89SMike Frysinger /*
2*ecb1dc89SMike Frysinger  * Helper functions for working with the builtin symbol table
3*ecb1dc89SMike Frysinger  *
4*ecb1dc89SMike Frysinger  * Copyright (c) 2008-2009 Analog Devices Inc.
5*ecb1dc89SMike Frysinger  * Licensed under the GPL-2 or later.
6*ecb1dc89SMike Frysinger  */
7*ecb1dc89SMike Frysinger 
8*ecb1dc89SMike Frysinger #include <common.h>
9*ecb1dc89SMike Frysinger 
10*ecb1dc89SMike Frysinger /* We need the weak marking as this symbol is provided specially */
11*ecb1dc89SMike Frysinger extern const char system_map[] __attribute__((weak));
12*ecb1dc89SMike Frysinger 
13*ecb1dc89SMike Frysinger /* Given an address, return a pointer to the symbol name and store
14*ecb1dc89SMike Frysinger  * the base address in caddr.  So if the symbol map had an entry:
15*ecb1dc89SMike Frysinger  *		03fb9b7c_spi_cs_deactivate
16*ecb1dc89SMike Frysinger  * Then the following call:
17*ecb1dc89SMike Frysinger  *		unsigned long base;
18*ecb1dc89SMike Frysinger  *		const char *sym = symbol_lookup(0x03fb9b80, &base);
19*ecb1dc89SMike Frysinger  * Would end up setting the variables like so:
20*ecb1dc89SMike Frysinger  *		base = 0x03fb9b7c;
21*ecb1dc89SMike Frysinger  *		sym = "_spi_cs_deactivate";
22*ecb1dc89SMike Frysinger  */
symbol_lookup(unsigned long addr,unsigned long * caddr)23*ecb1dc89SMike Frysinger const char *symbol_lookup(unsigned long addr, unsigned long *caddr)
24*ecb1dc89SMike Frysinger {
25*ecb1dc89SMike Frysinger 	const char *sym, *csym;
26*ecb1dc89SMike Frysinger 	char *esym;
27*ecb1dc89SMike Frysinger 	unsigned long sym_addr;
28*ecb1dc89SMike Frysinger 
29*ecb1dc89SMike Frysinger 	sym = system_map;
30*ecb1dc89SMike Frysinger 	csym = NULL;
31*ecb1dc89SMike Frysinger 	*caddr = 0;
32*ecb1dc89SMike Frysinger 
33*ecb1dc89SMike Frysinger 	while (*sym) {
34*ecb1dc89SMike Frysinger 		sym_addr = simple_strtoul(sym, &esym, 16);
35*ecb1dc89SMike Frysinger 		sym = esym;
36*ecb1dc89SMike Frysinger 		if (sym_addr > addr)
37*ecb1dc89SMike Frysinger 			break;
38*ecb1dc89SMike Frysinger 		*caddr = sym_addr;
39*ecb1dc89SMike Frysinger 		csym = sym;
40*ecb1dc89SMike Frysinger 		sym += strlen(sym) + 1;
41*ecb1dc89SMike Frysinger 	}
42*ecb1dc89SMike Frysinger 
43*ecb1dc89SMike Frysinger 	return csym;
44*ecb1dc89SMike Frysinger }
45