Rev 2813 | Rev 2836 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2813 | Rev 2815 | ||
---|---|---|---|
Line 606... | Line 606... | ||
606 | spinlock_unlock(&task->lock); |
606 | spinlock_unlock(&task->lock); |
607 | } |
607 | } |
608 | 608 | ||
609 | #include <ipc/ipcrsc.h> |
609 | #include <ipc/ipcrsc.h> |
610 | #include <console/klog.h> |
610 | #include <console/klog.h> |
611 | #include <syscall/copy.h> |
- | |
612 | #include <udebug/udebug.h> |
611 | #include <udebug/udebug_ipc.h> |
613 | - | ||
614 | static void debug_mem_read(call_t *call) |
- | |
615 | { |
- | |
616 | unative_t uspace_dst; |
- | |
617 | void *uspace_ptr; |
- | |
618 | unsigned size; |
- | |
619 | void *buffer; |
- | |
620 | int rc; |
- | |
621 | - | ||
622 | klog_printf("debug_mem_read()"); |
- | |
623 | uspace_dst = IPC_GET_ARG2(call->data); |
- | |
624 | uspace_ptr = (void *)IPC_GET_ARG3(call->data); |
- | |
625 | size = IPC_GET_ARG4(call->data); |
- | |
626 | - | ||
627 | buffer = malloc(size, 0); // ??? |
- | |
628 | klog_printf("debug_mem_read: src=%u, size=%u", uspace_ptr, size); |
- | |
629 | - | ||
630 | /* NOTE: this is not strictly from a syscall... but that shouldn't |
- | |
631 | * be a problem */ |
- | |
632 | rc = copy_from_uspace(buffer, uspace_ptr, size); |
- | |
633 | if (rc) { |
- | |
634 | IPC_SET_RETVAL(call->data, rc); |
- | |
635 | return; |
- | |
636 | } |
- | |
637 | - | ||
638 | klog_printf("first word: %u", *((unative_t *)buffer)); |
- | |
639 | - | ||
640 | IPC_SET_RETVAL(call->data, 0); |
- | |
641 | /* Hack: ARG1=dest, ARG2=size as in IPC_M_DATA_READ so that |
- | |
642 | same code in process_answer() can be used |
- | |
643 | (no way to distinguish method in answer) */ |
- | |
644 | IPC_SET_ARG1(call->data, uspace_dst); |
- | |
645 | IPC_SET_ARG2(call->data, size); |
- | |
646 | call->buffer = buffer; |
- | |
647 | - | ||
648 | ipc_answer(&TASK->kernel_box, call); |
- | |
649 | } |
- | |
650 | 612 | ||
651 | static void kbox_thread_proc(void *arg) |
613 | static void kbox_thread_proc(void *arg) |
652 | { |
614 | { |
653 | call_t *call; |
615 | call_t *call; |
654 | int method; |
616 | int method; |
655 | int dm; |
- | |
656 | 617 | ||
657 | (void)arg; |
618 | (void)arg; |
658 | klog_printf("kbox_thread_proc()"); |
619 | klog_printf("kbox_thread_proc()"); |
659 | while (1) { |
620 | while (1) { |
660 | klog_printf("kbox: wait for call"); |
621 | klog_printf("kbox: wait for call"); |
661 | call = ipc_wait_for_call(&TASK->kernel_box, SYNCH_NO_TIMEOUT, |
622 | call = ipc_wait_for_call(&TASK->kernel_box, SYNCH_NO_TIMEOUT, |
662 | SYNCH_FLAGS_NONE); |
623 | SYNCH_FLAGS_NONE); |
663 | if (call != NULL) { |
624 | if (call != NULL) { |
664 | method = IPC_GET_METHOD(call->data); |
625 | method = IPC_GET_METHOD(call->data); |
665 | dm = IPC_GET_ARG1(call->data); |
- | |
666 | 626 | ||
667 | if (method == IPC_M_DEBUG_ALL && |
627 | if (method == IPC_M_DEBUG_ALL) { |
668 | dm == UDEBUG_M_MEM_READ) { |
- | |
669 | debug_mem_read(call); |
628 | udebug_call_receive(call); |
670 | } |
629 | } |
671 | } |
630 | } |
672 | } |
631 | } |
673 | } |
632 | } |
674 | 633 |