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)21const 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