Changeset f0348c8 in mainline for kernel/generic
- Timestamp:
- 2012-07-10T13:03:10Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 97c7682, 9904eb90, ceafd1b, d9812b4, dfc07c1
- Parents:
- 33fc3ae (diff), f4a8734 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- kernel/generic
- Files:
-
- 3 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/debug.h
r33fc3ae rf0348c8 37 37 38 38 #include <panic.h> 39 #include <symtab .h>39 #include <symtab_lookup.h> 40 40 41 41 #define CALLER ((uintptr_t) __builtin_return_address(0)) -
kernel/generic/include/symtab.h
r33fc3ae rf0348c8 36 36 #define KERN_SYMTAB_H_ 37 37 38 #include <typedefs.h> 38 #include <symtab_lookup.h> 39 #include <console/chardev.h> 39 40 40 #define MAX_SYMBOL_NAME 6441 42 struct symtab_entry {43 uint64_t address_le;44 char symbol_name[MAX_SYMBOL_NAME];45 };46 47 extern int symtab_name_lookup(uintptr_t, const char **, uintptr_t *);48 extern const char *symtab_fmt_name_lookup(uintptr_t);49 extern int symtab_addr_lookup(const char *, uintptr_t *);50 41 extern void symtab_print_search(const char *); 51 extern int symtab_compl(char *, size_t); 52 53 #ifdef CONFIG_SYMTAB 54 55 /** Symtable linked together by build process 56 * 57 */ 58 extern struct symtab_entry symbol_table[]; 59 60 #endif /* CONFIG_SYMTAB */ 42 extern int symtab_compl(char *, size_t, indev_t *); 61 43 62 44 #endif -
kernel/generic/src/console/kconsole.c
r33fc3ae rf0348c8 43 43 #include <console/chardev.h> 44 44 #include <console/cmd.h> 45 #include <console/prompt.h> 45 46 #include <print.h> 46 47 #include <panic.h> … … 201 202 * 202 203 */ 203 NO_TRACE static int cmdtab_compl(char *input, size_t size )204 NO_TRACE static int cmdtab_compl(char *input, size_t size, indev_t * indev) 204 205 { 205 206 const char *name = input; 206 207 207 208 size_t found = 0; 209 /* Maximum Match Length : Length of longest matching common substring in 210 case more than one match is found */ 211 size_t max_match_len = size; 212 size_t max_match_len_tmp = size; 213 size_t input_len = str_length(input); 208 214 link_t *pos = NULL; 209 215 const char *hint; 210 216 char *output = malloc(MAX_CMDLINE, 0); 217 size_t hints_to_show = MAX_TAB_HINTS - 1; 218 size_t total_hints_shown = 0; 219 bool continue_showing_hints = true; 211 220 212 221 output[0] = 0; … … 218 227 pos = pos->next; 219 228 found++; 229 } 230 231 /* If possible completions are more than MAX_TAB_HINTS, ask user whether to display them or not. */ 232 if (found > MAX_TAB_HINTS) { 233 printf("\n"); 234 continue_showing_hints = console_prompt_display_all_hints(indev, found); 220 235 } 221 236 … … 225 240 while (cmdtab_search_one(name, &pos)) { 226 241 cmd_info_t *hlp = list_get_instance(pos, cmd_info_t, link); 227 printf("%s (%s)\n", hlp->name, hlp->description); 242 243 if (continue_showing_hints) { 244 printf("%s (%s)\n", hlp->name, hlp->description); 245 --hints_to_show; 246 ++total_hints_shown; 247 248 if (hints_to_show == 0 && total_hints_shown != found) { /* Time to ask user to continue */ 249 continue_showing_hints = console_prompt_more_hints(indev, &hints_to_show); 250 } 251 } 252 228 253 pos = pos->next; 229 } 254 for(max_match_len_tmp = 0; output[max_match_len_tmp] == hlp->name[input_len + max_match_len_tmp] 255 && max_match_len_tmp < max_match_len; ++max_match_len_tmp); 256 max_match_len = max_match_len_tmp; 257 } 258 /* keep only the characters common in all completions */ 259 output[max_match_len] = 0; 230 260 } 231 261 … … 294 324 if (beg == 0) { 295 325 /* Command completion */ 296 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) );326 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 297 327 } else { 298 328 /* Symbol completion */ 299 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) );329 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 300 330 } 301 331 302 332 if (found == 0) 303 333 continue; 304 305 if (found > 1) { 306 /* No unique hint, list was printed */ 307 printf("%s> ", prompt); 308 printf("%ls", current); 309 print_cc('\b', wstr_length(current) - position); 310 continue; 311 } 312 313 /* We have a hint */ 314 334 335 /* We have hints, may be many. In case of more than one hint, 336 tmp will contain the common prefix. */ 315 337 size_t off = 0; 316 338 size_t i = 0; … … 320 342 i++; 321 343 } 344 345 if (found > 1) { 346 /* No unique hint, list was printed */ 347 printf("%s> ", prompt); 348 printf("%ls", current); 349 position += str_length(tmp); 350 print_cc('\b', wstr_length(current) - position); 351 continue; 352 } 353 354 /* We have a hint */ 322 355 323 356 printf("%ls", current + position); … … 540 573 /** Parse command line. 541 574 * 542 * @param cmdline Command line as read from input device. 575 * @param cmdline Command line as read from input device. 543 576 * @param size Size (in bytes) of the string. 544 577 * -
kernel/generic/src/debug/symtab.c
r33fc3ae rf0348c8 43 43 #include <typedefs.h> 44 44 #include <errno.h> 45 #include <console/prompt.h> 45 46 46 47 /** Get name of a symbol that seems most likely to correspond to address. … … 209 210 * 210 211 */ 211 int symtab_compl(char *input, size_t size )212 int symtab_compl(char *input, size_t size, indev_t * indev) 212 213 { 213 214 #ifdef CONFIG_SYMTAB … … 226 227 const char *hint; 227 228 char output[MAX_SYMBOL_NAME]; 229 /* Maximum Match Length : Length of longest matching common substring in 230 case more than one match is found */ 231 size_t max_match_len = size; 232 size_t max_match_len_tmp = size; 233 size_t input_len = str_length(input); 234 char *sym_name; 235 size_t hints_to_show = MAX_TAB_HINTS - 1; 236 size_t total_hints_shown = 0; 237 bool continue_showing_hints = true; 228 238 229 239 output[0] = 0; 240 241 while ((hint = symtab_search_one(name, &pos))) { 242 ++pos; 243 } 244 245 pos = 0; 230 246 231 247 while ((hint = symtab_search_one(name, &pos))) { … … 235 251 pos++; 236 252 found++; 253 } 254 255 /* If possible completions are more than MAX_TAB_HINTS, ask user whether to display them or not. */ 256 if (found > MAX_TAB_HINTS) { 257 printf("\n"); 258 continue_showing_hints = console_prompt_display_all_hints(indev, found); 237 259 } 238 260 … … 241 263 pos = 0; 242 264 while (symtab_search_one(name, &pos)) { 243 printf("%s\n", symbol_table[pos].symbol_name);265 sym_name = symbol_table[pos].symbol_name; 244 266 pos++; 267 268 if (continue_showing_hints) { /* We are still showing hints */ 269 printf("%s\n", sym_name); 270 --hints_to_show; 271 ++total_hints_shown; 272 273 if (hints_to_show == 0 && total_hints_shown != found) { /* Time to ask user to continue */ 274 continue_showing_hints = console_prompt_more_hints(indev, &hints_to_show); 275 } 276 } 277 278 for(max_match_len_tmp = 0; output[max_match_len_tmp] == sym_name[input_len + max_match_len_tmp] 279 && max_match_len_tmp < max_match_len; ++max_match_len_tmp); 280 max_match_len = max_match_len_tmp; 245 281 } 282 /* keep only the characters common in all completions */ 283 output[max_match_len] = 0; 246 284 } 247 285
Note:
See TracChangeset
for help on using the changeset viewer.