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 Frysingerconst 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