Rev 4605 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4605 | Rev 4616 | ||
---|---|---|---|
Line 501... | Line 501... | ||
501 | 501 | ||
502 | *buffer = data_buffer; |
502 | *buffer = data_buffer; |
503 | return 0; |
503 | return 0; |
504 | } |
504 | } |
505 | 505 | ||
- | 506 | int udebug_thread_get_thread_struct(thread_t *t, void **buffer) |
|
- | 507 | { |
|
- | 508 | ipl_t ipl = interrupts_disable(); |
|
- | 509 | ||
- | 510 | void *data_buffer = (void *)malloc(sizeof(thread_t), 0); |
|
- | 511 | ||
- | 512 | memcpy(data_buffer, (void *)t, sizeof(thread_t)); |
|
- | 513 | ||
- | 514 | *buffer = data_buffer; |
|
- | 515 | ||
- | 516 | interrupts_restore(ipl); |
|
- | 517 | ||
- | 518 | return (0); |
|
- | 519 | } |
|
- | 520 | ||
- | 521 | int udebug_task_get_memory_areas(void **buffer, size_t buf_size, size_t *n) |
|
- | 522 | { |
|
- | 523 | link_t *cur; |
|
- | 524 | ipl_t ipl; |
|
- | 525 | unative_t *areas_buffer; |
|
- | 526 | size_t max_index; |
|
- | 527 | ||
- | 528 | as_print(TASK->as); |
|
- | 529 | ||
- | 530 | areas_buffer = malloc(buf_size, 0); |
|
- | 531 | ||
- | 532 | mutex_lock(&TASK->udebug.lock); |
|
- | 533 | ||
- | 534 | /* Verify task state */ |
|
- | 535 | if (TASK->udebug.dt_state != UDEBUG_TS_ACTIVE) { |
|
- | 536 | mutex_unlock(&TASK->udebug.lock); |
|
- | 537 | return EINVAL; |
|
- | 538 | } |
|
- | 539 | ||
- | 540 | ipl = interrupts_disable(); |
|
- | 541 | spinlock_lock(&TASK->lock); |
|
- | 542 | ||
- | 543 | max_index = buf_size / sizeof(unative_t); |
|
- | 544 | as_t *as = TASK->as; |
|
- | 545 | ||
- | 546 | mutex_lock(&as->lock); |
|
- | 547 | ||
- | 548 | /* print out info about address space areas */ |
|
- | 549 | unsigned int index = 0; |
|
- | 550 | for (cur = as->as_area_btree.leaf_head.next; |
|
- | 551 | cur != &as->as_area_btree.leaf_head; cur = cur->next) { |
|
- | 552 | btree_node_t *node; |
|
- | 553 | ||
- | 554 | node = list_get_instance(cur, btree_node_t, leaf_link); |
|
- | 555 | ||
- | 556 | unsigned int i; |
|
- | 557 | for (i = 0; i < node->keys; i++) { |
|
- | 558 | if (index >= max_index) |
|
- | 559 | break; |
|
- | 560 | ||
- | 561 | as_area_t *area = node->value[i]; |
|
- | 562 | ||
- | 563 | mutex_lock(&area->lock); |
|
- | 564 | areas_buffer[index++] = area->base; |
|
- | 565 | areas_buffer[index++] = area->base + FRAMES2SIZE(area->pages); |
|
- | 566 | mutex_unlock(&area->lock); |
|
- | 567 | } |
|
- | 568 | } |
|
- | 569 | ||
- | 570 | mutex_unlock(&as->lock); |
|
- | 571 | ||
- | 572 | spinlock_unlock(&TASK->lock); |
|
- | 573 | interrupts_restore(ipl); |
|
- | 574 | ||
- | 575 | mutex_unlock(&TASK->udebug.lock); |
|
- | 576 | ||
- | 577 | *buffer = areas_buffer; |
|
- | 578 | *n = (index) * sizeof(unative_t); |
|
- | 579 | ||
- | 580 | return 0; |
|
- | 581 | ||
- | 582 | } |
|
- | 583 | ||
- | 584 | int udebug_copy_kstack(void *kstack, void **buffer, size_t n) |
|
- | 585 | { |
|
- | 586 | ipl_t ipl = interrupts_disable(); |
|
- | 587 | ||
- | 588 | void *data_buffer = malloc(n, 0); |
|
- | 589 | ||
- | 590 | memcpy(data_buffer, (void *)kstack, n); |
|
- | 591 | ||
- | 592 | *buffer = data_buffer; |
|
- | 593 | ||
- | 594 | interrupts_restore(ipl); |
|
- | 595 | ||
- | 596 | return 0; |
|
- | 597 | } |
|
- | 598 | ||
- | 599 | int udebug_restore_thread_struct(void *buffer, thread_t *t_old) |
|
- | 600 | { |
|
- | 601 | ipl_t ipl = interrupts_disable(); |
|
- | 602 | ||
- | 603 | thread_t *t_new = (thread_t *)buffer; |
|
- | 604 | ||
- | 605 | t_old->thread_code = t_new->thread_code; |
|
- | 606 | ||
- | 607 | printf("old sp: %p, new sp: %p\n", t_old->saved_context.sp, t_new->saved_context.sp); |
|
- | 608 | printf("old kstack: %p, new kstack: %p\n", t_old->kstack, t_new->kstack); |
|
- | 609 | ||
- | 610 | t_old->saved_context = t_new->saved_context; |
|
- | 611 | t_old->saved_context.sp = (uintptr_t)t_old->kstack + ((uintptr_t)t_new->saved_context.sp - (uintptr_t)t_new->kstack); |
|
- | 612 | ||
- | 613 | t_old->sleep_timeout_context = t_new->sleep_timeout_context; |
|
- | 614 | t_old->sleep_timeout = t_new->sleep_timeout; |
|
- | 615 | t_old->timeout_pending = t_new->timeout_pending; |
|
- | 616 | ||
- | 617 | t_old->in_copy_from_uspace = t_new->in_copy_from_uspace; |
|
- | 618 | t_old->in_copy_to_uspace = t_new->in_copy_to_uspace; |
|
- | 619 | ||
- | 620 | t_old->interrupted = t_new->interrupted; |
|
- | 621 | ||
- | 622 | t_old->call_me = t_new->call_me; |
|
- | 623 | t_old->call_me_with = t_new->call_me_with; |
|
- | 624 | ||
- | 625 | t_old->udebug.go_call = t_new->udebug.go_call; |
|
- | 626 | ||
- | 627 | interrupts_restore(ipl); |
|
- | 628 | ||
- | 629 | return (0); |
|
- | 630 | } |
|
- | 631 | ||
- | 632 | int udebug_mem_write(void *buffer, void *start, size_t n) |
|
- | 633 | { |
|
- | 634 | ipl_t ipl = interrupts_disable(); |
|
- | 635 | ||
- | 636 | if (((unsigned) start & 0x80000000) == 0) |
|
- | 637 | copy_to_uspace(start, buffer, n); |
|
- | 638 | ||
- | 639 | interrupts_restore(ipl); |
|
- | 640 | ||
- | 641 | return (0); |
|
- | 642 | } |
|
- | 643 | ||
- | 644 | int udebug_restore_kstack(void *buffer, size_t size, thread_t *t) |
|
- | 645 | { |
|
- | 646 | ipl_t ipl = interrupts_disable(); |
|
- | 647 | ||
- | 648 | memcpy(t->kstack + sizeof(the_t), buffer + sizeof(the_t), size - sizeof(the_t)); |
|
- | 649 | ||
- | 650 | interrupts_restore(ipl); |
|
- | 651 | ||
- | 652 | return (0); |
|
- | 653 | } |
|
- | 654 | ||
- | 655 | ||
506 | /** @} |
656 | /** @} |
507 | */ |
657 | */ |