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