source: mainline/generic/src/debug/symtab.c@ 0c8e692

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0c8e692 was 0c8e692, checked in by Ondrej Palkovsky <ondrap@…>, 20 years ago

Added some readline functionality to kconsole.
Arrows editing, history, tab completion.

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*
2 * Copyright (C) 2005 Ondrej Palkovsky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29
30#include <symtab.h>
31#include <typedefs.h>
32#include <arch/byteorder.h>
33#include <func.h>
34#include <print.h>
35
36/** Return entry that seems most likely to correspond to address
37 *
38 * Return entry that seems most likely to correspond
39 * to address passed in the argument.
40 *
41 * @param addr Address.
42 *
43 * @return Pointer to respective symbol string on success, NULL otherwise.
44 */
45char * get_symtab_entry(__native addr)
46{
47 count_t i;
48
49 for (i=1;symbol_table[i].address_le;++i) {
50 if (addr < __u64_le2host(symbol_table[i].address_le))
51 break;
52 }
53 if (addr >= __u64_le2host(symbol_table[i-1].address_le))
54 return symbol_table[i-1].symbol_name;
55 return NULL;
56}
57
58/** Find symbols that match the parameter forward and print them
59 *
60 * @param name - search string
61 * @param startpos - starting position, changes to found position
62 * @return Pointer to the part of string that should be completed or NULL
63 */
64static char * symtab_search_one(const char *name, int *startpos)
65{
66 int namelen = strlen(name);
67 char *curname;
68 int i,j;
69 char *foundsym = NULL;
70 int foundpos = 0;
71 int colonoffset = -1;
72
73 for (i=0;name[i];i++)
74 if (name[i] == ':') {
75 colonoffset = i;
76 break;
77 }
78
79 for (i=*startpos;symbol_table[i].address_le;++i) {
80 /* Find a ':' in name */
81 curname = symbol_table[i].symbol_name;
82 for (j=0; curname[j] && curname[j] != ':'; j++)
83 ;
84 if (!curname[j])
85 continue;
86 j -= colonoffset;
87 curname += j;
88 if (strlen(curname) < namelen)
89 continue;
90 if (strncmp(curname, name, namelen) == 0) {
91 *startpos = i;
92 return curname+namelen;
93 }
94 }
95 return NULL;
96}
97
98/** Return address that corresponds to the entry
99 *
100 * Search symbol table, and if there is one match, return it
101 *
102 * @param name Name of the symbol
103 * @return 0 - Not found, -1 - Duplicate symbol, other - address of symbol
104 */
105__address get_symbol_addr(const char *name)
106{
107 count_t found = 0;
108 __address addr = NULL;
109 char *hint;
110 int i;
111
112 i = 0;
113 while ((hint=symtab_search_one(name, &i))) {
114 if (!strlen(hint)) {
115 addr = __u64_le2host(symbol_table[i].address_le);
116 found++;
117 }
118 i++;
119 }
120 if (found > 1)
121 return ((__address) -1);
122 return addr;
123}
124
125/** Find symbols that match parameter and prints them */
126void symtab_print_search(const char *name)
127{
128 int i;
129 __address addr;
130 char *realname;
131
132
133 i = 0;
134 while (symtab_search_one(name, &i)) {
135 addr = __u64_le2host(symbol_table[i].address_le);
136 realname = symbol_table[i].symbol_name;
137 printf("0x%p: %s\n", addr, realname);
138 i++;
139 }
140}
141
142/** Symtab completion
143 *
144 * @param name - Search string, completes to symbol name
145 * @returns - 0 - nothing found, 1 - success, >1 print duplicates
146 */
147int symtab_compl(char *name)
148{
149 char output[MAX_SYMBOL_NAME+1];
150 int startpos = 0;
151 char *foundtxt;
152 int found = 0;
153 int i;
154
155 /* Do not print everything */
156 if (!strlen(name))
157 return 0;
158
159 output[0] = '\0';
160
161 while ((foundtxt = symtab_search_one(name, &startpos))) {
162 startpos++;
163 if (!found)
164 strncpy(output, foundtxt, strlen(foundtxt)+1);
165 else {
166 for (i=0; output[i] && foundtxt[i] && output[i]==foundtxt[i]; i++)
167 ;
168 output[i] = '\0';
169 }
170 found++;
171 }
172 if (!found)
173 return 0;
174
175 if (found > 1) {
176 printf("\n");
177 startpos = 0;
178 while ((foundtxt = symtab_search_one(name, &startpos))) {
179 printf("%s\n", symbol_table[startpos].symbol_name);
180 startpos++;
181 }
182 }
183 strncpy(name, output, MAX_SYMBOL_NAME);
184 return found;
185
186}
Note: See TracBrowser for help on using the repository browser.