Changeset e16e0d59 in mainline for kernel/generic/src/console/cmd.c


Ignore:
Timestamp:
2009-03-17T20:33:18Z (15 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5eb90cb
Parents:
b1c8dc0
Message:

Make optionality of symbol information less intrusive per Jakub's request. Also, improve symtab function names and update their semantics.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/console/cmd.c

    rb1c8dc0 re16e0d59  
    6565#include <ipc/ipc.h>
    6666#include <ipc/irq.h>
    67 
    68 #ifdef CONFIG_SYMTAB
    6967#include <symtab.h>
    70 #endif
     68#include <errno.h>
    7169
    7270#ifdef CONFIG_TEST
     
    171169};
    172170
    173 #ifdef CONFIG_SYMTAB
    174171/* Data and methods for 'symaddr' command. */
    175172static int cmd_symaddr(cmd_arg_t *argv);
     
    187184        .argv = &symaddr_argv
    188185};
    189 #endif
    190186
    191187static char set_buf[MAX_CMDLINE+1];
     
    464460        &set4_info,
    465461        &slabs_info,
    466 #ifdef CONFIG_SYMTAB
    467462        &symaddr_info,
    468 #endif
    469463        &sched_info,
    470464        &threads_info,
     
    613607}
    614608
    615 #ifdef CONFIG_SYMTAB
    616 
    617609/** Search symbol table */
    618610int cmd_symaddr(cmd_arg_t *argv)
     
    623615}
    624616
    625 #endif
    626 
    627617/** Call function with zero parameters */
    628618int cmd_call0(cmd_arg_t *argv)
    629619{
    630 #ifdef CONFIG_SYMTAB
    631620        uintptr_t symaddr;
     621        char *symbol;
    632622        unative_t (*fnc)(void);
    633623        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);
    640633                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());
    641639        } 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        }
    647642        return 1;
    648643}
     
    680675int cmd_call1(cmd_arg_t *argv)
    681676{
    682 #ifdef CONFIG_SYMTAB
    683677        uintptr_t symaddr;
    684678        char *symbol;
     
    686680        unative_t arg1 = argv[1].intval;
    687681        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);
    695691                printf("Duplicate symbol, be more specific.\n");
    696         } else {
    697                 symbol = get_symtab_entry(symaddr);
     692        } else if (rc == EOK) {
    698693                fnc = (unative_t (*)(unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call1);
    699694                printf("Calling f(%#" PRIxn "): %p: %s\n", arg1, symaddr, symbol);
    700695                printf("Result: %#" PRIxn "\n", fnc(arg1));
    701         }
    702 #endif
     696        } else {
     697                printf("No symbol information available.\n");
     698        }
     699
    703700        return 1;
    704701}
     
    707704int cmd_call2(cmd_arg_t *argv)
    708705{
    709 #ifdef CONFIG_SYMTAB
    710706        uintptr_t symaddr;
    711707        char *symbol;
     
    714710        unative_t arg2 = argv[2].intval;
    715711        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);
    722721                printf("Duplicate symbol, be more specific.\n");
    723         } else {
    724                 symbol = get_symtab_entry(symaddr);
     722        } else if (rc == EOK) {
    725723                fnc = (unative_t (*)(unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call2);
    726724                printf("Calling f(%#" PRIxn ", %#" PRIxn "): %p: %s\n",
    727725                       arg1, arg2, symaddr, symbol);
    728726                printf("Result: %#" PRIxn "\n", fnc(arg1, arg2));
    729         }       
    730 #endif
     727        } else {
     728                printf("No symbol information available.\n");
     729        }
    731730        return 1;
    732731}
     
    735734int cmd_call3(cmd_arg_t *argv)
    736735{
    737 #ifdef CONFIG_SYMTAB
    738736        uintptr_t symaddr;
    739737        char *symbol;
     
    743741        unative_t arg3 = argv[3].intval;
    744742        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);
    751752                printf("Duplicate symbol, be more specific.\n");
    752         } else {
    753                 symbol = get_symtab_entry(symaddr);
     753        } else if (rc == EOK) {
    754754                fnc = (unative_t (*)(unative_t, unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call3);
    755755                printf("Calling f(%#" PRIxn ",%#" PRIxn ", %#" PRIxn "): %p: %s\n",
    756756                       arg1, arg2, arg3, symaddr, symbol);
    757757                printf("Result: %#" PRIxn "\n", fnc(arg1, arg2, arg3));
    758         }
    759 #endif
     758        } else {
     759                printf("No symbol information available.\n");
     760        }
    760761        return 1;
    761762}
     
    807808int cmd_set4(cmd_arg_t *argv)
    808809{
    809         uint32_t *addr;
     810        uintptr_t addr;
    810811        uint32_t arg1 = argv[1].intval;
    811812        bool pointer = false;
     813        int rc;
    812814
    813815        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);
    819817                pointer = true;
    820818        } else if (((char *) argv->buffer)[0] >= '0' &&
    821819                   ((char *)argv->buffer)[0] <= '9') {
    822                 addr = (uint32_t *)atoi((char *)argv->buffer);
     820                rc = EOK;
     821                addr = atoi((char *)argv->buffer);
    823822        } 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)
    832827                printf("Symbol %s not found.\n", argv->buffer);
    833         else if (addr == (uint32_t *) -1) {
    834 #ifdef CONFIG_SYMTAB
     828        else if (rc == EOVERFLOW) {
    835829                symtab_print_search((char *) argv->buffer);
    836 #endif
    837830                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;
    838836        } 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");
    844838        }
    845839       
Note: See TracChangeset for help on using the changeset viewer.