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 |