Changeset 6e716a59 in mainline for generic/src/console/kconsole.c


Ignore:
Timestamp:
2005-12-10T15:05:46Z (20 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
72f5866d
Parents:
a3ac9a7
Message:

Added calling of generic functions to kconsole.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • generic/src/console/kconsole.c

    ra3ac9a7 r6e716a59  
    3939#include <macros.h>
    4040#include <debug.h>
     41#include <symtab.h>
    4142
    4243#define MAX_CMDLINE     256
     
    7374/** Data and methods for 'help' command. */
    7475static int cmd_help(cmd_arg_t *argv);
    75 static cmd_info_t help_info;
     76static cmd_info_t help_info = {
     77        .name = "help",
     78        .description = "List of supported commands.",
     79        .func = cmd_help,
     80        .argc = 0
     81};
    7682
    7783/** Data and methods for 'description' command. */
    7884static int cmd_desc(cmd_arg_t *argv);
    7985static void desc_help(void);
    80 static cmd_info_t desc_info;
    8186static char desc_buf[MAX_CMDLINE+1];
    8287static cmd_arg_t desc_argv = {
     
    8590        .len = sizeof(desc_buf)
    8691};
     92static cmd_info_t desc_info = {
     93        .name = "describe",
     94        .description = "Describe specified command.",
     95        .help = desc_help,
     96        .func = cmd_desc,
     97        .argc = 1,
     98        .argv = &desc_argv
     99};
     100
     101/** Data and methods for 'symaddr' command. */
     102static int cmd_symaddr(cmd_arg_t *argv);
     103static char symaddr_buf[MAX_CMDLINE+1];
     104static cmd_arg_t symaddr_argv = {
     105        .type = ARG_TYPE_STRING,
     106        .buffer = symaddr_buf,
     107        .len = sizeof(symaddr_buf)
     108};
     109static cmd_info_t symaddr_info = {
     110        .name = "symaddr",
     111        .description = "Return symbol address.",
     112        .func = cmd_symaddr,
     113        .argc = 1,
     114        .argv = &symaddr_argv
     115};
     116
     117/** Call0 - call function with no parameters */
     118static char call0_buf[MAX_CMDLINE+1];
     119
     120static int cmd_call0(cmd_arg_t *argv);
     121static cmd_arg_t call0_argv = {
     122        .type = ARG_TYPE_STRING,
     123        .buffer = call0_buf,
     124        .len = sizeof(call0_buf)
     125};
     126static cmd_info_t call0_info = {
     127        .name = "call0",
     128        .description = "call0 <function> -> call function().",
     129        .func = cmd_call0,
     130        .argc = 1,
     131        .argv = &call0_argv
     132};
     133
     134static int cmd_call1(cmd_arg_t *argv);
     135static cmd_arg_t call1_argv[] = {
     136        {
     137                .type = ARG_TYPE_STRING,
     138                .buffer = call0_buf,
     139                .len = sizeof(call0_buf)
     140        },
     141        { .type = ARG_TYPE_INT }
     142};
     143static cmd_info_t call1_info = {
     144        .name = "call1",
     145        .description = "call1 <function> <arg1> -> call function(arg1).",
     146        .func = cmd_call1,
     147        .argc = 2,
     148        .argv = call1_argv
     149};
     150
     151static int cmd_call2(cmd_arg_t *argv);
     152static cmd_arg_t call2_argv[] = {
     153        {
     154                .type = ARG_TYPE_STRING,
     155                .buffer = call0_buf,
     156                .len = sizeof(call0_buf)
     157        },
     158        { .type = ARG_TYPE_INT },
     159        { .type = ARG_TYPE_INT }
     160};
     161static cmd_info_t call2_info = {
     162        .name = "call2",
     163        .description = "call2 <function> <arg1> <arg2> -> call function(arg1,arg2).",
     164        .func = cmd_call2,
     165        .argc = 3,
     166        .argv = call2_argv
     167};
     168
    87169
    88170/** Data and methods for 'halt' command. */
    89171static int cmd_halt(cmd_arg_t *argv);
    90 static cmd_info_t halt_info;
     172static cmd_info_t halt_info = {
     173        .name = "halt",
     174        .description = "Halt the kernel.",
     175        .func = cmd_halt,
     176        .argc = 0
     177};
    91178
    92179/** Initialize kconsole data structures. */
     
    96183        list_initialize(&cmd_head);
    97184       
    98         help_info.name = "help";
    99         help_info.description = "List supported commands.";
    100         help_info.func = cmd_help;
    101         help_info.help = NULL;
    102         help_info.argc = 0;
    103         help_info.argv = NULL;
    104 
    105185        spinlock_initialize(&help_info.lock, "kconsole_help");
    106186        link_initialize(&help_info.link);
    107 
    108187        if (!cmd_register(&help_info))
    109188                panic("could not register command %s\n", help_info.name);
    110189
    111190
    112         desc_info.name = "describe";
    113         desc_info.description = "Describe specified command.";
    114         desc_info.help = desc_help;
    115         desc_info.func = cmd_desc;
    116         desc_info.argc = 1;
    117         desc_info.argv = &desc_argv;
    118        
    119191        spinlock_initialize(&desc_info.lock, "kconsole_desc");
    120192        link_initialize(&desc_info.link);
    121        
    122193        if (!cmd_register(&desc_info))
    123194                panic("could not register command %s\n", desc_info.name);
    124195       
    125        
    126         halt_info.name = "halt";
    127         halt_info.description = "Halt the kernel.";
    128         halt_info.func = cmd_halt;
    129         halt_info.help = NULL;
    130         halt_info.argc = 0;
    131         halt_info.argv = NULL;
    132 
     196        spinlock_initialize(&symaddr_info.lock, "kconsole_symaddr");
     197        link_initialize(&symaddr_info.link);
     198        if (!cmd_register(&symaddr_info))
     199                panic("could not register command %s\n", symaddr_info.name);
     200
     201        spinlock_initialize(&call0_info.lock, "kconsole_call0");
     202        link_initialize(&call0_info.link);
     203        if (!cmd_register(&call0_info))
     204                panic("could not register command %s\n", call0_info.name);
     205
     206        spinlock_initialize(&call1_info.lock, "kconsole_call1");
     207        link_initialize(&call1_info.link);
     208        if (!cmd_register(&call1_info))
     209                panic("could not register command %s\n", call1_info.name);
     210
     211
     212        spinlock_initialize(&call2_info.lock, "kconsole_call2");
     213        link_initialize(&call2_info.link);
     214        if (!cmd_register(&call2_info))
     215                panic("could not register command %s\n", call2_info.name);
     216       
    133217        spinlock_initialize(&halt_info.lock, "kconsole_halt");
    134218        link_initialize(&halt_info.link);
    135 
    136219        if (!cmd_register(&halt_info))
    137220                panic("could not register command %s\n", halt_info.name);
     
    286369               
    287370                switch (cmd->argv[i].type) {
    288                     case ARG_TYPE_STRING:
     371                case ARG_TYPE_STRING:
    289372                        buf = cmd->argv[i].buffer;
    290373                        strncpy(buf, (const char *) &cmdline[start], min((end - start) + 1, cmd->argv[i].len - 1));
    291374                        buf[min((end - start) + 1, cmd->argv[i].len - 1)] = '\0';
    292375                        break;
    293                     case ARG_TYPE_INT:
    294                     case ARG_TYPE_INVALID:
    295                     default:
    296                         panic("invalid argument type\n");
     376                case ARG_TYPE_INT: {
     377                        char symname[MAX_SYMBOL_NAME];
     378                        __address symaddr;
     379
     380                        /* If we get a name, try to find it in symbol table */
     381                        if (cmdline[start] < '0' | cmdline[start] > '9') {
     382                                strncpy(symname, cmdline+start, min((end-start) + 1, MAX_SYMBOL_NAME -1 ));
     383                                symaddr = get_symbol_addr(symname);
     384                                if (!symaddr) {
     385                                        printf("Symbol %s not found.\n",symname);
     386                                        return NULL;
     387                                }
     388                                if (symaddr == (__address) -1) {
     389                                        printf("Duplicate symbol %s.\n",symname);
     390                                        symtab_print_search(symname);
     391                                        return NULL;
     392                                }
     393                                cmd->argv[i].intval = *((__native *)symaddr);
     394                        } else /* It's a number - convert it */
     395                                cmd->argv[i].intval = atoi(cmdline+start);
     396                        break;
     397                        }
     398                case ARG_TYPE_INVALID:
     399                default:
     400                        printf("invalid argument type\n");
     401                        return NULL;
    297402                        break;
    298403                }
     
    413518}
    414519
     520/** Search symbol table */
     521int cmd_symaddr(cmd_arg_t *argv)
     522{
     523        __address symaddr;
     524        char *symbol;
     525
     526        symtab_print_search(argv->buffer);
     527       
     528        return 1;
     529}
     530
     531/** Call function with zero parameters */
     532int cmd_call0(cmd_arg_t *argv)
     533{
     534        __address symaddr;
     535        char *symbol;
     536        __native (*f)(void);
     537
     538        symaddr = get_symbol_addr(argv->buffer);
     539        if (!symaddr)
     540                printf("Symbol not found.\n");
     541        else if (symaddr == (__address) -1) {
     542                symtab_print_search(argv->buffer);
     543                printf("Duplicate symbol, be more specific.\n");
     544        } else {
     545                symbol = get_symtab_entry(symaddr);
     546                printf("Calling f(): 0x%p: %s\n", symaddr, symbol);
     547                f =  (__native (*)(void)) symaddr;
     548                printf("Result: 0x%X\n", f());
     549        }
     550       
     551        return 1;
     552}
     553
     554/** Call function with one parameter */
     555int cmd_call1(cmd_arg_t *argv)
     556{
     557        __address symaddr;
     558        char *symbol;
     559        __native (*f)(__native);
     560        __native arg1 = argv[1].intval;
     561
     562        symaddr = get_symbol_addr(argv->buffer);
     563        if (!symaddr)
     564                printf("Symbol not found.\n");
     565        else if (symaddr == (__address) -1) {
     566                symtab_print_search(argv->buffer);
     567                printf("Duplicate symbol, be more specific.\n");
     568        } else {
     569                symbol = get_symtab_entry(symaddr);
     570                printf("Calling f(0x%x): 0x%p: %s\n", arg1, symaddr, symbol);
     571                f =  (__native (*)(__native)) symaddr;
     572                printf("Result: 0x%x\n", f(arg1));
     573        }
     574       
     575        return 1;
     576}
     577
     578/** Call function with two parameters */
     579int cmd_call2(cmd_arg_t *argv)
     580{
     581        __address symaddr;
     582        char *symbol;
     583        __native (*f)(__native);
     584        __native arg1 = argv[1].intval;
     585        __native arg2 = argv[2].intval;
     586
     587        symaddr = get_symbol_addr(argv->buffer);
     588        if (!symaddr)
     589                printf("Symbol not found.\n");
     590        else if (symaddr == (__address) -1) {
     591                symtab_print_search(argv->buffer);
     592                printf("Duplicate symbol, be more specific.\n");
     593        } else {
     594                symbol = get_symtab_entry(symaddr);
     595                printf("Calling f(0x%x,0x%x): 0x%p: %s\n",
     596                       arg1, arg2, symaddr, symbol);
     597                f =  (__native (*)(__native)) symaddr;
     598                printf("Result: 0x%x\n", f(arg1));
     599        }
     600       
     601        return 1;
     602}
     603
     604
    415605/** Print detailed description of 'describe' command. */
    416606void desc_help(void)
Note: See TracChangeset for help on using the changeset viewer.