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 | ||