]>
Commit | Line | Data |
---|---|---|
ecb1dc89 MF |
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 | */ | |
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 | } |