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 /* We need the weak marking as this symbol is provided specially */
9 extern const char system_map[] __attribute__((weak));
10 
11 /* Given an address, return a pointer to the symbol name and store
12  * the base address in caddr.  So if the symbol map had an entry:
13  *		03fb9b7c_spi_cs_deactivate
14  * Then the following call:
15  *		unsigned long base;
16  *		const char *sym = symbol_lookup(0x03fb9b80, &base);
17  * Would end up setting the variables like so:
18  *		base = 0x03fb9b7c;
19  *		sym = "_spi_cs_deactivate";
20  */
symbol_lookup(unsigned long addr,unsigned long * caddr)21 const char *symbol_lookup(unsigned long addr, unsigned long *caddr)
22 {
23 	const char *sym, *csym;
24 	char *esym;
25 	unsigned long sym_addr;
26 
27 	sym = system_map;
28 	csym = NULL;
29 	*caddr = 0;
30 
31 	while (*sym) {
32 		sym_addr = hextoul(sym, &esym);
33 		sym = esym;
34 		if (sym_addr > addr)
35 			break;
36 		*caddr = sym_addr;
37 		csym = sym;
38 		sym += strlen(sym) + 1;
39 	}
40 
41 	return csym;
42 }
43