Subversion Repositories HelenOS

Rev

Rev 3042 | Rev 3425 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3042 Rev 3424
Line 49... Line 49...
49
#include <proc/task.h>
49
#include <proc/task.h>
50
#include <memstr.h>
50
#include <memstr.h>
51
#include <debug.h>
51
#include <debug.h>
52
 
52
 
53
#include <print.h>
53
#include <print.h>
54
#include <console/klog.h>
54
#include <console/console.h>
55
#include <proc/thread.h>
55
#include <proc/thread.h>
56
#include <arch/interrupt.h>
56
#include <arch/interrupt.h>
57
#include <ipc/irq.h>
57
#include <ipc/irq.h>
58
 
58
 
59
/** Open channel that is assigned automatically to new tasks */
59
/** Open channel that is assigned automatically to new tasks */
Line 65... Line 65...
65
 *
65
 *
66
 * @param call      Call structure to be initialized.
66
 * @param call      Call structure to be initialized.
67
 */
67
 */
68
static void _ipc_call_init(call_t *call)
68
static void _ipc_call_init(call_t *call)
69
{
69
{
70
    memsetb((uintptr_t) call, sizeof(*call), 0);
70
    memsetb(call, sizeof(*call), 0);
71
    call->callerbox = &TASK->answerbox;
71
    call->callerbox = &TASK->answerbox;
72
    call->sender = TASK;
72
    call->sender = TASK;
73
    call->buffer = NULL;
73
    call->buffer = NULL;
74
}
74
}
75
 
75
 
Line 514... Line 514...
514
     * wake up and terminate.
514
     * wake up and terminate.
515
     */
515
     */
516
    ipc_answerbox_slam_phones(&TASK->kernel_box, have_kb_thread);
516
    ipc_answerbox_slam_phones(&TASK->kernel_box, have_kb_thread);
517
   
517
   
518
    if (have_kb_thread) {
518
    if (have_kb_thread) {
519
        klog_printf("join kb_thread..");
519
        printf("join kb_thread..\n");
520
        thread_join(TASK->kb_thread);
520
        thread_join(TASK->kb_thread);
521
        thread_detach(TASK->kb_thread);
521
        thread_detach(TASK->kb_thread);
522
        klog_printf("join done");
522
        printf("join done\n");
523
        TASK->kb_thread = NULL;
523
        TASK->kb_thread = NULL;
524
    }
524
    }
525
 
525
 
526
    /* Answer all messages in 'calls' and 'dispatched_calls' queues */
526
    /* Answer all messages in 'calls' and 'dispatched_calls' queues */
527
    spinlock_lock(&TASK->kernel_box.lock);
527
    spinlock_lock(&TASK->kernel_box.lock);
Line 650... Line 650...
650
                       task->phones[i].callee);
650
                       task->phones[i].callee);
651
                break;
651
                break;
652
            default:
652
            default:
653
                break;
653
                break;
654
            }
654
            }
655
            printf("active: %d\n",
655
            printf("active: %ld\n",
656
                atomic_get(&task->phones[i].active_calls));
656
                atomic_get(&task->phones[i].active_calls));
657
        }
657
        }
658
        mutex_unlock(&task->phones[i].lock);
658
        mutex_unlock(&task->phones[i].lock);
659
    }
659
    }
660
 
660
 
Line 663... Line 663...
663
    spinlock_lock(&task->answerbox.lock);
663
    spinlock_lock(&task->answerbox.lock);
664
    printf("ABOX - CALLS:\n");
664
    printf("ABOX - CALLS:\n");
665
    for (tmp = task->answerbox.calls.next; tmp != &task->answerbox.calls;
665
    for (tmp = task->answerbox.calls.next; tmp != &task->answerbox.calls;
666
        tmp = tmp->next) {
666
        tmp = tmp->next) {
667
        call = list_get_instance(tmp, call_t, link);
667
        call = list_get_instance(tmp, call_t, link);
668
        printf("Callid: %p Srctask:%llu M:%d A1:%d A2:%d A3:%d "
668
        printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun
-
 
669
            " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun
669
            "A4:%d A5:%d Flags:%x\n", call, call->sender->taskid,
670
            " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, call->sender->taskid,
670
            IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data),
671
            IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data),
671
            IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data),
672
            IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data),
672
            IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data),
673
            IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data),
673
            call->flags);
674
            call->flags);
674
    }
675
    }
675
    /* Print answerbox - calls */
676
    /* Print answerbox - calls */
676
    printf("ABOX - DISPATCHED CALLS:\n");
677
    printf("ABOX - DISPATCHED CALLS:\n");
677
    for (tmp = task->answerbox.dispatched_calls.next;
678
    for (tmp = task->answerbox.dispatched_calls.next;
678
         tmp != &task->answerbox.dispatched_calls;
679
        tmp != &task->answerbox.dispatched_calls;
679
         tmp = tmp->next) {
680
        tmp = tmp->next) {
680
        call = list_get_instance(tmp, call_t, link);
681
        call = list_get_instance(tmp, call_t, link);
681
        printf("Callid: %p Srctask:%llu M:%d A1:%d A2:%d A3:%d "
682
        printf("Callid: %p Srctask:%" PRIu64 " M:%" PRIun
-
 
683
            " A1:%" PRIun " A2:%" PRIun " A3:%" PRIun
682
            "A4:%d A5:%d Flags:%x\n", call, call->sender->taskid,
684
            " A4:%" PRIun " A5:%" PRIun " Flags:%x\n", call, call->sender->taskid,
683
            IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data),
685
            IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data),
684
            IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data),
686
            IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data),
685
            IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data),
687
            IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data),
686
            call->flags);
688
            call->flags);
687
    }
689
    }
688
    /* Print answerbox - calls */
690
    /* Print answerbox - calls */
689
    printf("ABOX - ANSWERS:\n");
691
    printf("ABOX - ANSWERS:\n");
690
    for (tmp = task->answerbox.answers.next; tmp != &task->answerbox.answers;
692
    for (tmp = task->answerbox.answers.next; tmp != &task->answerbox.answers;
691
        tmp = tmp->next) {
693
        tmp = tmp->next) {
692
        call = list_get_instance(tmp, call_t, link);
694
        call = list_get_instance(tmp, call_t, link);
693
        printf("Callid:%p M:%d A1:%d A2:%d A3:%d A4:%d A5:%d Flags:%x\n",
695
        printf("Callid:%p M:%" PRIun " A1:%" PRIun " A2:%" PRIun
-
 
696
            " A3:%" PRIun " A4:%" PRIun " A5:%" PRIun " Flags:%x\n",
694
            call, IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data),
697
            call, IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data),
695
            IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data),
698
            IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data),
696
            IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data),
699
            IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data),
697
            call->flags);
700
            call->flags);
698
    }
701
    }
Line 700... Line 703...
700
    spinlock_unlock(&task->answerbox.lock);
703
    spinlock_unlock(&task->answerbox.lock);
701
    spinlock_unlock(&task->lock);
704
    spinlock_unlock(&task->lock);
702
}
705
}
703
 
706
 
704
#include <ipc/ipcrsc.h>
707
#include <ipc/ipcrsc.h>
705
#include <console/klog.h>
708
#include <print.h>
706
#include <udebug/udebug_ipc.h>
709
#include <udebug/udebug_ipc.h>
707
 
710
 
708
static void kbox_thread_proc(void *arg)
711
static void kbox_thread_proc(void *arg)
709
{
712
{
710
    call_t *call;
713
    call_t *call;
711
    int method;
714
    int method;
712
    bool done;
715
    bool done;
713
    ipl_t ipl;
716
    ipl_t ipl;
714
 
717
 
715
    (void)arg;
718
    (void)arg;
716
    klog_printf("kbox_thread_proc()");
719
    printf("kbox_thread_proc()\n");
717
    done = false;
720
    done = false;
718
 
721
 
719
    while (!done) {
722
    while (!done) {
720
        //klog_printf("kbox: wait for call");
723
        //printf("kbox: wait for call\n");
721
        call = ipc_wait_for_call(&TASK->kernel_box, SYNCH_NO_TIMEOUT,
724
        call = ipc_wait_for_call(&TASK->kernel_box, SYNCH_NO_TIMEOUT,
722
            SYNCH_FLAGS_NONE);
725
            SYNCH_FLAGS_NONE);
723
 
726
 
724
        if (call != NULL) {
727
        if (call != NULL) {
725
            method = IPC_GET_METHOD(call->data);
728
            method = IPC_GET_METHOD(call->data);
Line 727... Line 730...
727
            if (method == IPC_M_DEBUG_ALL) {
730
            if (method == IPC_M_DEBUG_ALL) {
728
                udebug_call_receive(call);
731
                udebug_call_receive(call);
729
            }
732
            }
730
 
733
 
731
            if (method == IPC_M_PHONE_HUNGUP) {
734
            if (method == IPC_M_PHONE_HUNGUP) {
732
                klog_printf("kbox: handle hangup message");
735
                printf("kbox: handle hangup message\n");
733
 
736
 
734
                /* Was it our debugger, who hung up? */
737
                /* Was it our debugger, who hung up? */
735
                if (call->sender == TASK->udebug.debugger) {
738
                if (call->sender == TASK->udebug.debugger) {
736
                    /* Terminate debugging session (if any) */
739
                    /* Terminate debugging session (if any) */
737
                    klog_printf("kbox: terminate debug session");
740
                    printf("kbox: terminate debug session\n");
738
                    ipl = interrupts_disable();
741
                    ipl = interrupts_disable();
739
                    spinlock_lock(&TASK->lock);
742
                    spinlock_lock(&TASK->lock);
740
                    udebug_task_cleanup(TASK);
743
                    udebug_task_cleanup(TASK);
741
                    spinlock_unlock(&TASK->lock);
744
                    spinlock_unlock(&TASK->lock);
742
                    interrupts_restore(ipl);
745
                    interrupts_restore(ipl);
743
                } else {
746
                } else {
744
                    klog_printf("kbox: was not debugger");
747
                    printf("kbox: was not debugger\n");
745
                }
748
                }
746
 
749
 
747
                klog_printf("kbox: continue with hangup message");
750
                printf("kbox: continue with hangup message\n");
748
                IPC_SET_RETVAL(call->data, 0);
751
                IPC_SET_RETVAL(call->data, 0);
749
                ipc_answer(&TASK->kernel_box, call);
752
                ipc_answer(&TASK->kernel_box, call);
750
 
753
 
751
                ipl = interrupts_disable();
754
                ipl = interrupts_disable();
752
                spinlock_lock(&TASK->lock);
755
                spinlock_lock(&TASK->lock);
753
                spinlock_lock(&TASK->answerbox.lock);
756
                spinlock_lock(&TASK->answerbox.lock);
754
                if (list_empty(&TASK->answerbox.connected_phones)) {
757
                if (list_empty(&TASK->answerbox.connected_phones)) {
755
                    /* Last phone has been disconnected */
758
                    /* Last phone has been disconnected */
756
                    TASK->kb_thread = NULL;
759
                    TASK->kb_thread = NULL;
757
                    done = true;
760
                    done = true;
758
                    klog_printf("phone list is empty");
761
                    printf("phone list is empty\n");
759
                }
762
                }
760
                spinlock_unlock(&TASK->answerbox.lock);
763
                spinlock_unlock(&TASK->answerbox.lock);
761
                spinlock_unlock(&TASK->lock);
764
                spinlock_unlock(&TASK->lock);
762
                interrupts_restore(ipl);
765
                interrupts_restore(ipl);
763
            }
766
            }
764
        }
767
        }
765
    }
768
    }
766
 
769
 
767
    klog_printf("kbox: finished");
770
    printf("kbox: finished\n");
768
}
771
}
769
 
772
 
770
 
773
 
771
/**
774
/**
772
 * Connect phone to a task kernel-box specified by id.
775
 * Connect phone to a task kernel-box specified by id.