Changeset e16e0d59 in mainline
- Timestamp:
- 2009-03-17T20:33:18Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5eb90cb
- Parents:
- b1c8dc0
- Location:
- kernel
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/Makefile
rb1c8dc0 re16e0d59 160 160 generic/src/ddi/irq.c \ 161 161 generic/src/ddi/device.c \ 162 generic/src/debug/symtab.c \ 162 163 generic/src/interrupt/interrupt.c \ 163 164 generic/src/main/main.c \ … … 226 227 endif 227 228 228 ## Kernel symbol information229 #230 231 ifeq ($(CONFIG_SYMTAB),y)232 GENERIC_SOURCES += \233 generic/src/debug/symtab.c234 endif235 236 229 ## Udebug interface sources 237 230 # -
kernel/arch/amd64/src/debugger.c
rb1c8dc0 re16e0d59 44 44 #include <func.h> 45 45 #include <smp/ipi.h> 46 47 #ifdef CONFIG_SYMTAB48 46 #include <symtab.h> 49 #endif50 47 51 48 typedef struct { … … 234 231 } 235 232 236 #ifdef CONFIG_SYMTAB 237 printf("Reached breakpoint %d:%lx(%s)\n", slot, getip(istate), 238 get_symtab_entry(getip(istate))); 239 #else 240 printf("Reached breakpoint %d:%lx\n", slot, getip(istate)); 241 #endif 233 printf("Reached breakpoint %d:%lx (%s)\n", slot, getip(istate), 234 symtab_fmt_name_lookup(getip(istate))); 242 235 243 236 #ifdef CONFIG_KCONSOLE … … 364 357 for (i = 0; i < BKPOINTS_MAX; i++) 365 358 if (breakpoints[i].address) { 366 #ifdef CONFIG_SYMTAB 367 symbol = get_symtab_entry(breakpoints[i].address); 368 #else 369 symbol = "n/a"; 370 #endif 359 symbol = symtab_fmt_name_lookup( 360 breakpoints[i].address); 371 361 372 362 #ifdef __32_BITS__ -
kernel/arch/amd64/src/interrupt.c
rb1c8dc0 re16e0d59 52 52 #include <interrupt.h> 53 53 #include <ddi/irq.h> 54 55 #ifdef CONFIG_SYMTAB56 54 #include <symtab.h> 57 #endif58 55 59 56 /* … … 68 65 { 69 66 char *symbol; 70 /* uint64_t *x = &istate->stack[0]; */ 71 72 #ifdef CONFIG_SYMTAB 73 if (!(symbol = get_symtab_entry(istate->rip))) 74 symbol = ""; 75 #else 76 symbol = ""; 77 #endif 67 68 symbol = symtab_fmt_name_lookup((istate->rip); 78 69 79 70 printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n", n, __func__); -
kernel/arch/ia32/src/interrupt.c
rb1c8dc0 re16e0d59 52 52 #include <interrupt.h> 53 53 #include <ddi/irq.h> 54 55 #ifdef CONFIG_SYMTAB56 54 #include <symtab.h> 57 #endif58 55 59 56 /* … … 69 66 char *symbol; 70 67 71 #ifdef CONFIG_SYMTAB 72 symbol = get_symtab_entry(istate->eip); 73 if (!symbol) 74 symbol = ""; 75 #else 76 symbol = ""; 77 #endif 68 symbol = symtab_fmt_name_lookup(istate->eip); 78 69 79 70 if (CPU) -
kernel/arch/ia64/src/interrupt.c
rb1c8dc0 re16e0d59 54 54 #include <synch/spinlock.h> 55 55 #include <mm/tlb.h> 56 57 #ifdef CONFIG_SYMTAB58 56 #include <symtab.h> 59 #endif60 57 61 58 #define VECTORS_64_BUNDLE 20 … … 141 138 char *ifa, *iipa, *iip; 142 139 143 #ifdef CONFIG_SYMTAB 144 ifa = get_symtab_entry(istate->cr_ifa); 145 iipa = get_symtab_entry(istate->cr_iipa); 146 iip = get_symtab_entry(istate->cr_iip); 147 #else 148 ifa = iipa = iip = "n/a"; 149 #endif 140 ifa = symtab_fmt_name_lookup(istate->cr_ifa); 141 iipa = symtab_fmt_name_lookup(istate->cr_iipa); 142 iip = symtab_fmt_name_lookup(istate->cr_iip); 150 143 151 144 putchar('\n'); -
kernel/arch/mips32/src/debugger.c
rb1c8dc0 re16e0d59 43 43 #include <arch/cp0.h> 44 44 #include <func.h> 45 46 #ifdef CONFIG_SYMTAB47 45 #include <symtab.h> 48 #endif49 46 50 47 bpinfo_t breakpoints[BKPOINTS_MAX]; … … 263 260 for (i = 0; i < BKPOINTS_MAX; i++) 264 261 if (breakpoints[i].address) { 265 #ifdef CONFIG_SYMTAB 266 symbol = get_symtab_entry(breakpoints[i].address); 267 #else 268 symbol = "n/a"; 269 #endif 270 262 symbol = symtab_fmt_name_lookup( 263 breakpoints[i].address); 264 271 265 printf("%-2u %-5d %#10zx %-6s %-7s %-8s %s\n", i, 272 266 breakpoints[i].counter, breakpoints[i].address, … … 357 351 358 352 if (!(cur->flags & BKPOINT_FUNCCALL)) { 359 #ifdef CONFIG_SYMTAB360 353 printf("***Breakpoint %d: %p in %s.\n", i, fireaddr, 361 get_symtab_entry(istate->epc)); 362 #else 363 printf("***Breakpoint %d: %p.\n", i, fireaddr); 364 #endif 354 symtab_fmt_name_lookup(istate->epc)); 365 355 } 366 356 … … 376 366 cur->flags |= BKPOINT_INPROG; 377 367 } else { 378 #ifdef CONFIG_SYMTAB 379 printf("***Breakpoint %p in %s.\n", fireaddr, 380 get_symtab_entry(fireaddr)); 381 #else 382 printf("***Breakpoint %p.\n", fireaddr); 383 #endif 368 printf("***Breakpoint %d: %p in %s.\n", i, fireaddr, 369 symtab_fmt_name_lookup(fireaddr)); 370 384 371 /* Move on to next instruction */ 385 372 istate->epc += 4; -
kernel/arch/mips32/src/exception.c
rb1c8dc0 re16e0d59 47 47 #include <ddi/irq.h> 48 48 #include <arch/debugger.h> 49 50 #ifdef CONFIG_SYMTAB51 49 #include <symtab.h> 52 #endif53 50 54 51 static char * exctable[] = { … … 77 74 static void print_regdump(istate_t *istate) 78 75 { 79 char *pcsymbol = ""; 80 char *rasymbol = ""; 76 char *pcsymbol, *rasymbol; 81 77 82 #ifdef CONFIG_SYMTAB 83 char *s = get_symtab_entry(istate->epc); 84 if (s) 85 pcsymbol = s; 86 s = get_symtab_entry(istate->ra); 87 if (s) 88 rasymbol = s; 89 #endif 90 91 printf("PC: %#x(%s) RA: %#x(%s), SP(%p)\n", istate->epc, pcsymbol, istate->ra, rasymbol, istate->sp); 78 pcsymbol = symtab_fmt_name_lookup(istate->epc); 79 rasymbol = symtab_fmt_name_lookup(istate->ra); 80 81 printf("PC: %#x(%s) RA: %#x(%s), SP(%p)\n", istate->epc, pcsymbol, 82 istate->ra, rasymbol, istate->sp); 92 83 } 93 84 -
kernel/arch/mips32/src/mm/tlb.c
rb1c8dc0 re16e0d59 46 46 #include <align.h> 47 47 #include <interrupt.h> 48 49 #ifdef CONFIG_SYMTAB50 48 #include <symtab.h> 51 #endif52 49 53 50 static void tlb_refill_fail(istate_t *); … … 324 321 void tlb_refill_fail(istate_t *istate) 325 322 { 326 char *symbol = ""; 327 char *sym2 = ""; 328 329 #ifdef CONFIG_SYMTAB 330 char *s = get_symtab_entry(istate->epc); 331 if (s) 332 symbol = s; 333 s = get_symtab_entry(istate->ra); 334 if (s) 335 sym2 = s; 336 #endif 337 323 char *symbol, *sym2; 324 325 symbol = symtab_fmt_name_lookup(istate->epc); 326 sym2 = symtab_fmt_name_lookup(istate->ra); 327 338 328 fault_if_from_uspace(istate, "TLB Refill Exception on %p.", 339 329 cp0_badvaddr_read()); 340 panic("%x: TLB Refill Exception at %x (%s<-%s).", cp0_badvaddr_read(),330 panic("%x: TLB Refill Exception at %x (%s<-%s).", cp0_badvaddr_read(), 341 331 istate->epc, symbol, sym2); 342 332 } … … 345 335 void tlb_invalid_fail(istate_t *istate) 346 336 { 347 char *symbol = ""; 348 349 #ifdef CONFIG_SYMTAB 350 char *s = get_symtab_entry(istate->epc); 351 if (s) 352 symbol = s; 353 #endif 337 char *symbol; 338 339 symbol = symtab_fmt_name_lookup(istate->epc); 354 340 355 341 fault_if_from_uspace(istate, "TLB Invalid Exception on %p.", 356 342 cp0_badvaddr_read()); 357 panic("%x: TLB Invalid Exception at %x (%s).", cp0_badvaddr_read(),343 panic("%x: TLB Invalid Exception at %x (%s).", cp0_badvaddr_read(), 358 344 istate->epc, symbol); 359 345 } … … 361 347 void tlb_modified_fail(istate_t *istate) 362 348 { 363 char *symbol = ""; 364 365 #ifdef CONFIG_SYMTAB 366 char *s = get_symtab_entry(istate->epc); 367 if (s) 368 symbol = s; 369 #endif 349 char *symbol; 350 351 symbol = symtab_fmt_name_lookup(istate->epc); 370 352 371 353 fault_if_from_uspace(istate, "TLB Modified Exception on %p.", 372 354 cp0_badvaddr_read()); 373 panic("%x: TLB Modified Exception at %x (%s).", cp0_badvaddr_read(),355 panic("%x: TLB Modified Exception at %x (%s).", cp0_badvaddr_read(), 374 356 istate->epc, symbol); 375 357 } -
kernel/arch/ppc32/src/mm/tlb.c
rb1c8dc0 re16e0d59 41 41 #include <print.h> 42 42 #include <macros.h> 43 44 #ifdef CONFIG_SYMTAB45 43 #include <symtab.h> 46 #endif47 44 48 45 static unsigned int seed = 10; … … 121 118 static void pht_refill_fail(uintptr_t badvaddr, istate_t *istate) 122 119 { 123 char *symbol = ""; 124 char *sym2 = ""; 125 126 #ifdef CONFIG_SYMTAB 127 char *str = get_symtab_entry(istate->pc); 128 if (str) 129 symbol = str; 130 str = get_symtab_entry(istate->lr); 131 if (str) 132 sym2 = str; 133 #endif 120 char *symbol; 121 char *sym2; 122 123 symbol = symtab_fmt_name_lookup(istate->pc); 124 sym2 = symtab_fmt_name_lookup(istate->lr); 134 125 135 126 fault_if_from_uspace(istate, -
kernel/arch/sparc64/src/trap/exception.c
rb1c8dc0 re16e0d59 42 42 #include <debug.h> 43 43 #include <print.h> 44 45 #ifdef CONFIG_SYMTAB46 44 #include <symtab.h> 47 #endif48 45 49 46 void dump_istate(istate_t *istate) … … 51 48 char *tpcs, *tnpcs; 52 49 53 #ifdef CONFIG_SYMTAB 54 tpcs = get_symtab_entry(istate->tpc); 55 tnpcs = get_symtab_entry(istate->tnpc); 56 #else 57 tpcs = tnpcs = "n/a"; 58 #endif 50 tpcs = symtab_fmt_name_lookup(istate->tpc); 51 tnpcs = symtab_fmt_name_lookup(istate->tnpc); 52 59 53 printf("TSTATE=%#" PRIx64 "\n", istate->tstate); 60 54 printf("TPC=%#" PRIx64 " (%s)\n", istate->tpc, tpcs); -
kernel/generic/include/symtab.h
rb1c8dc0 re16e0d59 45 45 }; 46 46 47 extern char * get_symtab_entry(unative_t addr); 48 extern uintptr_t get_symbol_addr(const char *name); 47 extern int symtab_name_lookup(unative_t addr, char **name); 48 extern char *symtab_fmt_name_lookup(unative_t addr); 49 extern int symtab_addr_lookup(const char *name, uintptr_t *addr); 49 50 extern void symtab_print_search(const char *name); 50 51 extern int symtab_compl(char *name); 52 53 #ifdef CONFIG_SYMTAB 51 54 52 55 /* Symtable linked together by build process */ … … 55 58 #endif 56 59 60 #endif 61 57 62 /** @} 58 63 */ -
kernel/generic/src/console/cmd.c
rb1c8dc0 re16e0d59 65 65 #include <ipc/ipc.h> 66 66 #include <ipc/irq.h> 67 68 #ifdef CONFIG_SYMTAB69 67 #include <symtab.h> 70 # endif68 #include <errno.h> 71 69 72 70 #ifdef CONFIG_TEST … … 171 169 }; 172 170 173 #ifdef CONFIG_SYMTAB174 171 /* Data and methods for 'symaddr' command. */ 175 172 static int cmd_symaddr(cmd_arg_t *argv); … … 187 184 .argv = &symaddr_argv 188 185 }; 189 #endif190 186 191 187 static char set_buf[MAX_CMDLINE+1]; … … 464 460 &set4_info, 465 461 &slabs_info, 466 #ifdef CONFIG_SYMTAB467 462 &symaddr_info, 468 #endif469 463 &sched_info, 470 464 &threads_info, … … 613 607 } 614 608 615 #ifdef CONFIG_SYMTAB616 617 609 /** Search symbol table */ 618 610 int cmd_symaddr(cmd_arg_t *argv) … … 623 615 } 624 616 625 #endif626 627 617 /** Call function with zero parameters */ 628 618 int cmd_call0(cmd_arg_t *argv) 629 619 { 630 #ifdef CONFIG_SYMTAB631 620 uintptr_t symaddr; 621 char *symbol; 632 622 unative_t (*fnc)(void); 633 623 fncptr_t fptr; 634 635 symaddr = get_symbol_addr((char *) argv->buffer); 636 if (!symaddr) 637 printf("Symbol %s not found.\n", argv->buffer); 638 else if (symaddr == (uintptr_t) -1) { 639 symtab_print_search((char *) argv->buffer); 624 int rc; 625 626 symbol = (char *) argv->buffer; 627 rc = symtab_addr_lookup(symbol, &symaddr); 628 629 if (rc == ENOENT) 630 printf("Symbol %s not found.\n", symbol); 631 else if (rc == EOVERFLOW) { 632 symtab_print_search(symbol); 640 633 printf("Duplicate symbol, be more specific.\n"); 634 } else if (rc == EOK) { 635 fnc = (unative_t (*)(void)) arch_construct_function(&fptr, 636 (void *) symaddr, (void *) cmd_call0); 637 printf("Calling %s() (%p)\n", symbol, symaddr); 638 printf("Result: %#" PRIxn "\n", fnc()); 641 639 } else { 642 fnc = (unative_t (*)(void)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call0); 643 printf("Calling %s() (%p)\n", argv->buffer, symaddr); 644 printf("Result: %#" PRIxn "\n", fnc()); 645 } 646 #endif 640 printf("No symbol information available.\n"); 641 } 647 642 return 1; 648 643 } … … 680 675 int cmd_call1(cmd_arg_t *argv) 681 676 { 682 #ifdef CONFIG_SYMTAB683 677 uintptr_t symaddr; 684 678 char *symbol; … … 686 680 unative_t arg1 = argv[1].intval; 687 681 fncptr_t fptr; 688 689 symaddr = get_symbol_addr((char *) argv->buffer); 690 691 if (!symaddr) 692 printf("Symbol %s not found.\n", argv->buffer); 693 else if (symaddr == (uintptr_t) -1) { 694 symtab_print_search((char *) argv->buffer); 682 int rc; 683 684 symbol = (char *) argv->buffer; 685 rc = symtab_addr_lookup(symbol, &symaddr); 686 687 if (rc == ENOENT) { 688 printf("Symbol %s not found.\n", symbol); 689 } else if (rc == EOVERFLOW) { 690 symtab_print_search(symbol); 695 691 printf("Duplicate symbol, be more specific.\n"); 696 } else { 697 symbol = get_symtab_entry(symaddr); 692 } else if (rc == EOK) { 698 693 fnc = (unative_t (*)(unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call1); 699 694 printf("Calling f(%#" PRIxn "): %p: %s\n", arg1, symaddr, symbol); 700 695 printf("Result: %#" PRIxn "\n", fnc(arg1)); 701 } 702 #endif 696 } else { 697 printf("No symbol information available.\n"); 698 } 699 703 700 return 1; 704 701 } … … 707 704 int cmd_call2(cmd_arg_t *argv) 708 705 { 709 #ifdef CONFIG_SYMTAB710 706 uintptr_t symaddr; 711 707 char *symbol; … … 714 710 unative_t arg2 = argv[2].intval; 715 711 fncptr_t fptr; 716 717 symaddr = get_symbol_addr((char *) argv->buffer); 718 if (!symaddr) 719 printf("Symbol %s not found.\n", argv->buffer); 720 else if (symaddr == (uintptr_t) -1) { 721 symtab_print_search((char *) argv->buffer); 712 int rc; 713 714 symbol = (char *) argv->buffer; 715 rc = symtab_addr_lookup(symbol, &symaddr); 716 717 if (rc == ENOENT) { 718 printf("Symbol %s not found.\n", symbol); 719 } else if (rc == EOVERFLOW) { 720 symtab_print_search(symbol); 722 721 printf("Duplicate symbol, be more specific.\n"); 723 } else { 724 symbol = get_symtab_entry(symaddr); 722 } else if (rc == EOK) { 725 723 fnc = (unative_t (*)(unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call2); 726 724 printf("Calling f(%#" PRIxn ", %#" PRIxn "): %p: %s\n", 727 725 arg1, arg2, symaddr, symbol); 728 726 printf("Result: %#" PRIxn "\n", fnc(arg1, arg2)); 729 } 730 #endif 727 } else { 728 printf("No symbol information available.\n"); 729 } 731 730 return 1; 732 731 } … … 735 734 int cmd_call3(cmd_arg_t *argv) 736 735 { 737 #ifdef CONFIG_SYMTAB738 736 uintptr_t symaddr; 739 737 char *symbol; … … 743 741 unative_t arg3 = argv[3].intval; 744 742 fncptr_t fptr; 745 746 symaddr = get_symbol_addr((char *) argv->buffer); 747 if (!symaddr) 748 printf("Symbol %s not found.\n", argv->buffer); 749 else if (symaddr == (uintptr_t) -1) { 750 symtab_print_search((char *) argv->buffer); 743 int rc; 744 745 symbol = (char *) argv->buffer; 746 rc = symtab_addr_lookup(symbol, &symaddr); 747 748 if (rc == ENOENT) { 749 printf("Symbol %s not found.\n", symbol); 750 } else if (rc == EOVERFLOW) { 751 symtab_print_search(symbol); 751 752 printf("Duplicate symbol, be more specific.\n"); 752 } else { 753 symbol = get_symtab_entry(symaddr); 753 } else if (rc == EOK) { 754 754 fnc = (unative_t (*)(unative_t, unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call3); 755 755 printf("Calling f(%#" PRIxn ",%#" PRIxn ", %#" PRIxn "): %p: %s\n", 756 756 arg1, arg2, arg3, symaddr, symbol); 757 757 printf("Result: %#" PRIxn "\n", fnc(arg1, arg2, arg3)); 758 } 759 #endif 758 } else { 759 printf("No symbol information available.\n"); 760 } 760 761 return 1; 761 762 } … … 807 808 int cmd_set4(cmd_arg_t *argv) 808 809 { 809 uint 32_t *addr;810 uintptr_t addr; 810 811 uint32_t arg1 = argv[1].intval; 811 812 bool pointer = false; 813 int rc; 812 814 813 815 if (((char *)argv->buffer)[0] == '*') { 814 #ifdef CONFIG_SYMTAB 815 addr = (uint32_t *) get_symbol_addr((char *) argv->buffer + 1); 816 #else 817 addr = 0; 818 #endif 816 rc = symtab_addr_lookup((char *) argv->buffer + 1, &addr); 819 817 pointer = true; 820 818 } else if (((char *) argv->buffer)[0] >= '0' && 821 819 ((char *)argv->buffer)[0] <= '9') { 822 addr = (uint32_t *)atoi((char *)argv->buffer); 820 rc = EOK; 821 addr = atoi((char *)argv->buffer); 823 822 } else { 824 #ifdef CONFIG_SYMTAB 825 addr = (uint32_t *)get_symbol_addr((char *) argv->buffer); 826 #else 827 addr = 0; 828 #endif 829 } 830 831 if (!addr) 823 rc = symtab_addr_lookup((char *) argv->buffer, &addr); 824 } 825 826 if (rc == ENOENT) 832 827 printf("Symbol %s not found.\n", argv->buffer); 833 else if (addr == (uint32_t *) -1) { 834 #ifdef CONFIG_SYMTAB 828 else if (rc == EOVERFLOW) { 835 829 symtab_print_search((char *) argv->buffer); 836 #endif837 830 printf("Duplicate symbol, be more specific.\n"); 831 } else if (rc == EOK) { 832 if (pointer) 833 addr = *(uintptr_t *) addr; 834 printf("Writing %#" PRIx64 " -> %p\n", arg1, addr); 835 *(uint32_t *) addr = arg1; 838 836 } else { 839 if (pointer) 840 addr = (uint32_t *)(*(unative_t *)addr); 841 printf("Writing %#" PRIx64 " -> %p\n", arg1, addr); 842 *addr = arg1; 843 837 printf("No symbol information available.\n"); 844 838 } 845 839 -
kernel/generic/src/console/kconsole.c
rb1c8dc0 re16e0d59 54 54 #include <sysinfo/sysinfo.h> 55 55 #include <ddi/device.h> 56 57 #ifdef CONFIG_SYMTAB58 56 #include <symtab.h> 59 # endif57 #include <errno.h> 60 58 61 59 /** Simple kernel console. … … 350 348 found = cmdtab_compl(tmp); 351 349 } else { /* Symtab completion */ 352 #ifdef CONFIG_SYMTAB353 350 found = symtab_compl(tmp); 354 #else355 found = 0;356 #endif357 351 } 358 352 … … 525 519 bool isaddr = false; 526 520 bool isptr = false; 527 528 #ifdef CONFIG_SYMTAB 521 int rc; 522 529 523 static char symname[MAX_SYMBOL_NAME]; 530 #endif531 524 532 525 /* If we get a name, try to find it in symbol table */ … … 541 534 } 542 535 if (text[0] < '0' || text[0] > '9') { 543 #ifdef CONFIG_SYMTAB544 536 strncpy(symname, text, min(len + 1, MAX_SYMBOL_NAME)); 545 symaddr = get_symbol_addr(symname); 546 if (!symaddr) { 537 rc = symtab_addr_lookup(symname, &symaddr); 538 switch (rc) { 539 case ENOENT: 547 540 printf("Symbol %s not found.\n", symname); 548 541 return -1; 549 } 550 if (symaddr == (uintptr_t) -1) { 542 case EOVERFLOW: 551 543 printf("Duplicate symbol %s.\n", symname); 552 544 symtab_print_search(symname); 553 545 return -1; 554 } 555 #else 556 symaddr = 0; 557 #endif 546 default: 547 printf("No symbol information available.\n"); 548 return -1; 549 } 550 558 551 if (isaddr) 559 552 *result = (unative_t)symaddr; -
kernel/generic/src/debug/symtab.c
rb1c8dc0 re16e0d59 42 42 #include <arch/types.h> 43 43 #include <typedefs.h> 44 45 /** Return entry that seems most likely to correspond to argument. 46 * 47 * Return entry that seems most likely to correspond 48 * to address passed in the argument. 49 * 50 * @param addr Address. 51 * 52 * @return Pointer to respective symbol string on success, NULL otherwise. 53 */ 54 char * get_symtab_entry(unative_t addr) 55 { 44 #include <errno.h> 45 46 /** Get name of symbol that seems most likely to correspond to address. 47 * 48 * @param addr Address. 49 * @param name Place to store pointer to the symbol name. 50 * 51 * @return Zero on success or negative error code, ENOENT if not found, 52 * ENOTSUP if symbol table not available. 53 */ 54 int symtab_name_lookup(unative_t addr, char **name) 55 { 56 #ifdef CONFIG_SYMTAB 56 57 count_t i; 57 58 … … 60 61 break; 61 62 } 62 if (addr >= uint64_t_le2host(symbol_table[i - 1].address_le)) 63 return symbol_table[i - 1].symbol_name; 64 return NULL; 65 } 63 if (addr >= uint64_t_le2host(symbol_table[i - 1].address_le)) { 64 *name = symbol_table[i - 1].symbol_name; 65 return EOK; 66 } 67 68 *name = NULL; 69 return ENOENT; 70 #else 71 *name = NULL; 72 return ENOTSUP; 73 #endif 74 } 75 76 /** Lookup symbol by address and format for display. 77 * 78 * Returns name of closest corresponding symbol, "Not found" if none exists 79 * or "N/A" if no symbol information is available. 80 * 81 * @param addr Address. 82 * @param name Place to store pointer to the symbol name. 83 * 84 * @return Pointer to a human-readable string. 85 */ 86 char *symtab_fmt_name_lookup(unative_t addr) 87 { 88 int rc; 89 char *name; 90 91 rc = symtab_name_lookup(addr, &name); 92 switch (rc) { 93 case EOK: return name; 94 case ENOENT: return "Not found"; 95 default: return "N/A"; 96 } 97 } 98 99 #ifdef CONFIG_SYMTAB 66 100 67 101 /** Find symbols that match the parameter forward and print them. … … 103 137 } 104 138 139 #endif 140 105 141 /** Return address that corresponds to the entry 106 142 * 107 143 * Search symbol table, and if there is one match, return it 108 144 * 109 * @param name Name of the symbol 110 * @return 0 - Not found, -1 - Duplicate symbol, other - address of symbol 111 */ 112 uintptr_t get_symbol_addr(const char *name) 113 { 145 * @param name Name of the symbol 146 * @param addr Place to store symbol address 147 * 148 * @return Zero on success, ENOENT - not found, EOVERFLOW - duplicate 149 * symbol, ENOTSUP - no symbol information available. 150 */ 151 int symtab_addr_lookup(const char *name, uintptr_t *addr) 152 { 153 #ifdef CONFIG_SYMTAB 114 154 count_t found = 0; 115 uintptr_t addr = NULL;116 155 char *hint; 117 156 int i; … … 120 159 while ((hint = symtab_search_one(name, &i))) { 121 160 if (!strlen(hint)) { 122 addr = uint64_t_le2host(symbol_table[i].address_le);161 *addr = uint64_t_le2host(symbol_table[i].address_le); 123 162 found++; 124 163 } … … 126 165 } 127 166 if (found > 1) 128 return ((uintptr_t) -1); 129 return addr; 167 return EOVERFLOW; 168 if (found < 1) 169 return ENOENT; 170 return EOK; 171 #else 172 return ENOTSUP; 173 #endif 130 174 } 131 175 … … 133 177 void symtab_print_search(const char *name) 134 178 { 179 #ifdef CONFIG_SYMTAB 135 180 int i; 136 181 uintptr_t addr; … … 145 190 i++; 146 191 } 192 #else 193 printf("No symbol information available.\n"); 194 #endif 147 195 } 148 196 … … 154 202 int symtab_compl(char *input) 155 203 { 204 #ifdef CONFIG_SYMTAB 156 205 char output[MAX_SYMBOL_NAME + 1]; 157 206 int startpos = 0; … … 197 246 strncpy(input, output, MAX_SYMBOL_NAME); 198 247 return found; 199 248 #else 249 return 0; 250 #endif 200 251 } 201 252 -
kernel/generic/src/interrupt/interrupt.c
rb1c8dc0 re16e0d59 46 46 #include <panic.h> 47 47 #include <print.h> 48 49 #ifdef CONFIG_SYMTAB50 48 #include <symtab.h> 51 #endif52 49 53 50 static struct { … … 134 131 135 132 for (i = 0; i < IVT_ITEMS; i++) { 136 #ifdef CONFIG_SYMTAB 137 symbol = get_symtab_entry((unative_t) exc_table[i].f); 138 if (!symbol) 139 symbol = "not found"; 140 #else 141 symbol = "n/a"; 142 #endif 133 symbol = symtab_fmt_name_lookup((unative_t) exc_table[i].f); 143 134 144 135 #ifdef __32_BITS__ -
kernel/generic/src/synch/spinlock.c
rb1c8dc0 re16e0d59 43 43 #include <print.h> 44 44 #include <debug.h> 45 46 #ifdef CONFIG_SYMTAB47 45 #include <symtab.h> 48 #endif49 46 50 47 #ifdef CONFIG_FB … … 81 78 count_t i = 0; 82 79 bool deadlock_reported = false; 83 #ifdef CONFIG_SYMTAB84 char *symbol;85 #endif86 80 87 81 preemption_disable(); … … 112 106 #endif 113 107 if (i++ > DEADLOCK_THRESHOLD) { 114 printf("cpu%u: looping on spinlock %" PRIp ":%s, caller=%" PRIp, 115 CPU->id, sl, sl->name, CALLER); 116 #ifdef CONFIG_SYMTAB 117 symbol = get_symtab_entry(CALLER); 118 if (symbol) 119 printf("(%s)", symbol); 120 #endif 121 printf("\n"); 108 printf("cpu%u: looping on spinlock %" PRIp ":%s, " 109 "caller=%" PRIp "(%s)", CPU->id, sl, sl->name, 110 CALLER, symtab_fmt_name_lookup(CALLER)); 111 122 112 i = 0; 123 113 deadlock_reported = true;
Note:
See TracChangeset
for help on using the changeset viewer.