Rev 2216 | Rev 2224 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2216 | Rev 2223 | ||
---|---|---|---|
Line 190... | Line 190... | ||
190 | .argc = 2, |
190 | .argc = 2, |
191 | .argv = set4_argv |
191 | .argv = set4_argv |
192 | }; |
192 | }; |
193 | 193 | ||
194 | /* Data and methods for 'call0' command. */ |
194 | /* Data and methods for 'call0' command. */ |
195 | static char call0_buf[MAX_CMDLINE+1]; |
195 | static char call0_buf[MAX_CMDLINE + 1]; |
196 | static char carg1_buf[MAX_CMDLINE+1]; |
196 | static char carg1_buf[MAX_CMDLINE + 1]; |
197 | static char carg2_buf[MAX_CMDLINE+1]; |
197 | static char carg2_buf[MAX_CMDLINE + 1]; |
198 | static char carg3_buf[MAX_CMDLINE+1]; |
198 | static char carg3_buf[MAX_CMDLINE + 1]; |
199 | 199 | ||
200 | static int cmd_call0(cmd_arg_t *argv); |
200 | static int cmd_call0(cmd_arg_t *argv); |
201 | static cmd_arg_t call0_argv = { |
201 | static cmd_arg_t call0_argv = { |
202 | .type = ARG_TYPE_STRING, |
202 | .type = ARG_TYPE_STRING, |
203 | .buffer = call0_buf, |
203 | .buffer = call0_buf, |
Line 209... | Line 209... | ||
209 | .func = cmd_call0, |
209 | .func = cmd_call0, |
210 | .argc = 1, |
210 | .argc = 1, |
211 | .argv = &call0_argv |
211 | .argv = &call0_argv |
212 | }; |
212 | }; |
213 | 213 | ||
- | 214 | /* Data and methods for 'mcall0' command. */ |
|
- | 215 | static int cmd_mcall0(cmd_arg_t *argv); |
|
- | 216 | static cmd_arg_t mcall0_argv = { |
|
- | 217 | .type = ARG_TYPE_STRING, |
|
- | 218 | .buffer = call0_buf, |
|
- | 219 | .len = sizeof(call0_buf) |
|
- | 220 | }; |
|
- | 221 | static cmd_info_t mcall0_info = { |
|
- | 222 | .name = "mcall0", |
|
- | 223 | .description = "mcall0 <function> -> call function() on each CPU.", |
|
- | 224 | .func = cmd_mcall0, |
|
- | 225 | .argc = 1, |
|
- | 226 | .argv = &mcall0_argv |
|
- | 227 | }; |
|
- | 228 | ||
214 | /* Data and methods for 'call1' command. */ |
229 | /* Data and methods for 'call1' command. */ |
215 | static int cmd_call1(cmd_arg_t *argv); |
230 | static int cmd_call1(cmd_arg_t *argv); |
216 | static cmd_arg_t call1_argv[] = { |
231 | static cmd_arg_t call1_argv[] = { |
217 | { |
232 | { |
218 | .type = ARG_TYPE_STRING, |
233 | .type = ARG_TYPE_STRING, |
Line 404... | Line 419... | ||
404 | .argv = NULL |
419 | .argv = NULL |
405 | }; |
420 | }; |
406 | 421 | ||
407 | static cmd_info_t *basic_commands[] = { |
422 | static cmd_info_t *basic_commands[] = { |
408 | &call0_info, |
423 | &call0_info, |
- | 424 | &mcall0_info, |
|
409 | &call1_info, |
425 | &call1_info, |
410 | &call2_info, |
426 | &call2_info, |
411 | &call3_info, |
427 | &call3_info, |
412 | &continue_info, |
428 | &continue_info, |
413 | &cpus_info, |
429 | &cpus_info, |
Line 538... | Line 554... | ||
538 | unative_t (*f)(void); |
554 | unative_t (*f)(void); |
539 | #ifdef ia64 |
555 | #ifdef ia64 |
540 | struct { |
556 | struct { |
541 | unative_t f; |
557 | unative_t f; |
542 | unative_t gp; |
558 | unative_t gp; |
543 | }fptr; |
559 | } fptr; |
544 | #endif |
560 | #endif |
545 | 561 | ||
546 | symaddr = get_symbol_addr((char *) argv->buffer); |
562 | symaddr = get_symbol_addr((char *) argv->buffer); |
547 | if (!symaddr) |
563 | if (!symaddr) |
548 | printf("Symbol %s not found.\n", argv->buffer); |
564 | printf("Symbol %s not found.\n", argv->buffer); |
549 | else if (symaddr == (uintptr_t) -1) { |
565 | else if (symaddr == (uintptr_t) -1) { |
550 | symtab_print_search((char *) argv->buffer); |
566 | symtab_print_search((char *) argv->buffer); |
551 | printf("Duplicate symbol, be more specific.\n"); |
567 | printf("Duplicate symbol, be more specific.\n"); |
552 | } else { |
568 | } else { |
553 | symbol = get_symtab_entry(symaddr); |
569 | symbol = get_symtab_entry(symaddr); |
554 | printf("Calling f(): %.*p: %s\n", sizeof(uintptr_t) * 2, symaddr, symbol); |
570 | printf("Calling %s() (%.*p)\n", symbol, sizeof(uintptr_t) * 2, symaddr); |
555 | #ifdef ia64 |
571 | #ifdef ia64 |
556 | fptr.f = symaddr; |
572 | fptr.f = symaddr; |
557 | fptr.gp = ((unative_t *)cmd_call2)[1]; |
573 | fptr.gp = ((unative_t *)cmd_call2)[1]; |
558 | f = (unative_t (*)(void)) &fptr; |
574 | f = (unative_t (*)(void)) &fptr; |
559 | #else |
575 | #else |
Line 563... | Line 579... | ||
563 | } |
579 | } |
564 | 580 | ||
565 | return 1; |
581 | return 1; |
566 | } |
582 | } |
567 | 583 | ||
- | 584 | /** Call function with zero parameters on each CPU */ |
|
- | 585 | int cmd_mcall0(cmd_arg_t *argv) |
|
- | 586 | { |
|
- | 587 | /* |
|
- | 588 | * For each CPU, create a thread which will |
|
- | 589 | * call the function. |
|
- | 590 | */ |
|
- | 591 | ||
- | 592 | count_t i; |
|
- | 593 | for (i = 0; i < config.cpu_count; i++) { |
|
- | 594 | thread_t *t; |
|
- | 595 | if ((t = thread_create((void (*)(void *)) cmd_call0, (void *) argv, TASK, THREAD_FLAG_WIRED, "call0", false))) { |
|
- | 596 | spinlock_lock(&t->lock); |
|
- | 597 | t->cpu = &cpus[i]; |
|
- | 598 | spinlock_unlock(&t->lock); |
|
- | 599 | printf("cpu%u: ", i); |
|
- | 600 | thread_ready(t); |
|
- | 601 | thread_join(t); |
|
- | 602 | } else |
|
- | 603 | printf("Unable to create thread for cpu%u\n", i); |
|
- | 604 | } |
|
- | 605 | ||
- | 606 | return 1; |
|
- | 607 | } |
|
- | 608 | ||
568 | /** Call function with one parameter */ |
609 | /** Call function with one parameter */ |
569 | int cmd_call1(cmd_arg_t *argv) |
610 | int cmd_call1(cmd_arg_t *argv) |
570 | { |
611 | { |
571 | uintptr_t symaddr; |
612 | uintptr_t symaddr; |
572 | char *symbol; |
613 | char *symbol; |