Subversion Repositories HelenOS-historic

Rev

Rev 582 | Rev 589 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 582 Rev 585
Line 114... Line 114...
114
    .argv = &symaddr_argv
114
    .argv = &symaddr_argv
115
};
115
};
116
 
116
 
117
/** Call0 - call function with no parameters */
117
/** Call0 - call function with no parameters */
118
static char call0_buf[MAX_CMDLINE+1];
118
static char call0_buf[MAX_CMDLINE+1];
-
 
119
static char carg1_buf[MAX_CMDLINE+1];
-
 
120
static char carg2_buf[MAX_CMDLINE+1];
119
 
121
 
120
static int cmd_call0(cmd_arg_t *argv);
122
static int cmd_call0(cmd_arg_t *argv);
121
static cmd_arg_t call0_argv = {
123
static cmd_arg_t call0_argv = {
122
    .type = ARG_TYPE_STRING,
124
    .type = ARG_TYPE_STRING,
123
    .buffer = call0_buf,
125
    .buffer = call0_buf,
Line 136... Line 138...
136
    {
138
    {
137
        .type = ARG_TYPE_STRING,
139
        .type = ARG_TYPE_STRING,
138
        .buffer = call0_buf,
140
        .buffer = call0_buf,
139
        .len = sizeof(call0_buf)
141
        .len = sizeof(call0_buf)
140
    },
142
    },
-
 
143
    {
141
    { .type = ARG_TYPE_INT }
144
        .type = ARG_TYPE_VAR,
-
 
145
        .buffer = carg1_buf,
-
 
146
        .len = sizeof(carg1_buf)
-
 
147
    }
142
};
148
};
143
static cmd_info_t call1_info = {
149
static cmd_info_t call1_info = {
144
    .name = "call1",
150
    .name = "call1",
145
    .description = "call1 <function> <arg1> -> call function(arg1).",
151
    .description = "call1 <function> <arg1> -> call function(arg1).",
146
    .func = cmd_call1,
152
    .func = cmd_call1,
Line 153... Line 159...
153
    {
159
    {
154
        .type = ARG_TYPE_STRING,
160
        .type = ARG_TYPE_STRING,
155
        .buffer = call0_buf,
161
        .buffer = call0_buf,
156
        .len = sizeof(call0_buf)
162
        .len = sizeof(call0_buf)
157
    },
163
    },
-
 
164
    {
158
    { .type = ARG_TYPE_INT },
165
        .type = ARG_TYPE_VAR,
-
 
166
        .buffer = carg1_buf,
-
 
167
        .len = sizeof(carg1_buf)
-
 
168
    },
-
 
169
    {
159
    { .type = ARG_TYPE_INT }
170
        .type = ARG_TYPE_VAR,
-
 
171
        .buffer = carg2_buf,
-
 
172
        .len = sizeof(carg2_buf)
-
 
173
    }
160
};
174
};
161
static cmd_info_t call2_info = {
175
static cmd_info_t call2_info = {
162
    .name = "call2",
176
    .name = "call2",
163
    .description = "call2 <function> <arg1> <arg2> -> call function(arg1,arg2).",
177
    .description = "call2 <function> <arg1> <arg2> -> call function(arg1,arg2).",
164
    .func = cmd_call2,
178
    .func = cmd_call2,
Line 303... Line 317...
303
            continue;
317
            continue;
304
        (void) cmd_info->func(cmd_info->argv);
318
        (void) cmd_info->func(cmd_info->argv);
305
    }
319
    }
306
}
320
}
307
 
321
 
-
 
322
static int parse_int_arg(char *text, size_t len, __native *result)
-
 
323
{
-
 
324
    char symname[MAX_SYMBOL_NAME];
-
 
325
    __address symaddr;
-
 
326
    bool isaddr = false;
-
 
327
   
-
 
328
    /* If we get a name, try to find it in symbol table */
-
 
329
    if (text[0] < '0' | text[0] > '9') {
-
 
330
        if (text[0] == '&') {
-
 
331
            isaddr = true;
-
 
332
            text++;len--;
-
 
333
        }
-
 
334
        strncpy(symname, text, min(len+1, MAX_SYMBOL_NAME));
-
 
335
        symaddr = get_symbol_addr(symname);
-
 
336
        if (!symaddr) {
-
 
337
            printf("Symbol %s not found.\n",symname);
-
 
338
            return -1;
-
 
339
        }
-
 
340
        if (symaddr == (__address) -1) {
-
 
341
            printf("Duplicate symbol %s.\n",symname);
-
 
342
            symtab_print_search(symname);
-
 
343
            return -1;
-
 
344
        }
-
 
345
        if (isaddr)
-
 
346
            *result = (__native)symaddr;
-
 
347
        else
-
 
348
            *result = *((__native *)symaddr);
-
 
349
    } else /* It's a number - convert it */
-
 
350
        *result = atoi(text);
-
 
351
    return 0;
-
 
352
}
-
 
353
 
308
/** Parse command line.
354
/** Parse command line.
309
 *
355
 *
310
 * @param cmdline Command line as read from input device.
356
 * @param cmdline Command line as read from input device.
311
 * @param len Command line length.
357
 * @param len Command line length.
312
 *
358
 *
Line 368... Line 414...
368
        }
414
        }
369
       
415
       
370
        switch (cmd->argv[i].type) {
416
        switch (cmd->argv[i].type) {
371
        case ARG_TYPE_STRING:
417
        case ARG_TYPE_STRING:
372
                buf = cmd->argv[i].buffer;
418
                buf = cmd->argv[i].buffer;
373
                strncpy(buf, (const char *) &cmdline[start], min((end - start) + 1, cmd->argv[i].len - 1));
419
                strncpy(buf, (const char *) &cmdline[start], min((end - start) + 2, cmd->argv[i].len));
374
            buf[min((end - start) + 1, cmd->argv[i].len - 1)] = '\0';
420
            buf[min((end - start) + 1, cmd->argv[i].len - 1)] = '\0';
375
            break;
421
            break;
376
        case ARG_TYPE_INT: {
422
        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') {
423
            if (parse_int_arg(cmdline+start, end-start+1,
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) {
424
                      &cmd->argv[i].intval))
389
                    printf("Duplicate symbol %s.\n",symname);
-
 
390
                    symtab_print_search(symname);
-
 
391
                    return NULL;
425
                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;
426
            break;
-
 
427
        case ARG_TYPE_VAR:
-
 
428
            if (start != end && cmdline[start] == '"' && cmdline[end] == '"') {
-
 
429
                buf = cmd->argv[i].buffer;
-
 
430
                strncpy(buf, (const char *) &cmdline[start+1],
-
 
431
                    min((end-start), cmd->argv[i].len));
-
 
432
                buf[min((end - start), cmd->argv[i].len - 1)] = '\0';
-
 
433
                cmd->argv[i].intval = (__native) buf;
-
 
434
                cmd->argv[i].vartype = ARG_TYPE_STRING;
-
 
435
            } else if (!parse_int_arg(cmdline+start, end-start+1,
-
 
436
                         &cmd->argv[i].intval))
-
 
437
                cmd->argv[i].vartype = ARG_TYPE_INT;
-
 
438
            else {
-
 
439
                printf("Unrecognized variable argument.\n");
-
 
440
                return NULL;
397
            }
441
            }
-
 
442
            break;
398
        case ARG_TYPE_INVALID:
443
        case ARG_TYPE_INVALID:
399
        default:
444
        default:
400
            printf("invalid argument type\n");
445
            printf("invalid argument type\n");
401
            return NULL;
446
            return NULL;
402
            break;
447
            break;
Line 535... Line 580...
535
    char *symbol;
580
    char *symbol;
536
    __native (*f)(void);
581
    __native (*f)(void);
537
 
582
 
538
    symaddr = get_symbol_addr(argv->buffer);
583
    symaddr = get_symbol_addr(argv->buffer);
539
    if (!symaddr)
584
    if (!symaddr)
540
        printf("Symbol not found.\n");
585
        printf("Symbol %s not found.\n", argv->buffer);
541
    else if (symaddr == (__address) -1) {
586
    else if (symaddr == (__address) -1) {
542
        symtab_print_search(argv->buffer);
587
        symtab_print_search(argv->buffer);
543
        printf("Duplicate symbol, be more specific.\n");
588
        printf("Duplicate symbol, be more specific.\n");
544
    } else {
589
    } else {
545
        symbol = get_symtab_entry(symaddr);
590
        symbol = get_symtab_entry(symaddr);
Line 559... Line 604...
559
    __native (*f)(__native);
604
    __native (*f)(__native);
560
    __native arg1 = argv[1].intval;
605
    __native arg1 = argv[1].intval;
561
 
606
 
562
    symaddr = get_symbol_addr(argv->buffer);
607
    symaddr = get_symbol_addr(argv->buffer);
563
    if (!symaddr)
608
    if (!symaddr)
564
        printf("Symbol not found.\n");
609
        printf("Symbol %s not found.\n", argv->buffer);
565
    else if (symaddr == (__address) -1) {
610
    else if (symaddr == (__address) -1) {
566
        symtab_print_search(argv->buffer);
611
        symtab_print_search(argv->buffer);
567
        printf("Duplicate symbol, be more specific.\n");
612
        printf("Duplicate symbol, be more specific.\n");
568
    } else {
613
    } else {
569
        symbol = get_symtab_entry(symaddr);
614
        symbol = get_symtab_entry(symaddr);
Line 578... Line 623...
578
/** Call function with two parameters */
623
/** Call function with two parameters */
579
int cmd_call2(cmd_arg_t *argv)
624
int cmd_call2(cmd_arg_t *argv)
580
{
625
{
581
    __address symaddr;
626
    __address symaddr;
582
    char *symbol;
627
    char *symbol;
583
    __native (*f)(__native);
628
    __native (*f)(__native,__native);
584
    __native arg1 = argv[1].intval;
629
    __native arg1 = argv[1].intval;
585
    __native arg2 = argv[2].intval;
630
    __native arg2 = argv[2].intval;
586
 
631
 
587
    symaddr = get_symbol_addr(argv->buffer);
632
    symaddr = get_symbol_addr(argv->buffer);
588
    if (!symaddr)
633
    if (!symaddr)
589
        printf("Symbol not found.\n");
634
        printf("Symbol %s not found.\n", argv->buffer);
590
    else if (symaddr == (__address) -1) {
635
    else if (symaddr == (__address) -1) {
591
        symtab_print_search(argv->buffer);
636
        symtab_print_search(argv->buffer);
592
        printf("Duplicate symbol, be more specific.\n");
637
        printf("Duplicate symbol, be more specific.\n");
593
    } else {
638
    } else {
594
        symbol = get_symtab_entry(symaddr);
639
        symbol = get_symtab_entry(symaddr);
595
        printf("Calling f(0x%x,0x%x): 0x%p: %s\n",
640
        printf("Calling f(0x%x,0x%x): 0x%p: %s\n",
596
               arg1, arg2, symaddr, symbol);
641
               arg1, arg2, symaddr, symbol);
597
        f =  (__native (*)(__native)) symaddr;
642
        f =  (__native (*)(__native,__native)) symaddr;
598
        printf("Result: 0x%x\n", f(arg1));
643
        printf("Result: 0x%x\n", f(arg1, arg2));
599
    }
644
    }
600
   
645
   
601
    return 1;
646
    return 1;
602
}
647
}
603
 
648