Subversion Repositories HelenOS

Rev

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

Rev 955 Rev 959
Line 53... Line 53...
53
        putchar(((char *) buf)[i]);
53
        putchar(((char *) buf)[i]);
54
   
54
   
55
    return count;
55
    return count;
56
}
56
}
57
 
57
 
58
/** Send a call over syscall
58
/** Send a call over IPC, wait for reply, return to user
59
 *
59
 *
60
 * @return Call identification, returns -1 on fatal error,
60
 * @return Call identification, returns -1 on fatal error,
61
           -2 on 'Too many async request, handle answers first
61
           -2 on 'Too many async request, handle answers first
62
 */
62
 */
63
static __native sys_ipc_call(__native phoneid, __native arg1, __native arg2)
63
static __native sys_ipc_call_sync(__native phoneid, __native arg1,
-
 
64
                   __native arg2, __native *respdata)
-
 
65
{
-
 
66
    call_t *call;
-
 
67
    phone_t *phone;
-
 
68
    /* Special answerbox for synchronous messages */
-
 
69
 
-
 
70
    if (phoneid >= IPC_MAX_PHONES)
-
 
71
        return -ENOENT;
-
 
72
 
-
 
73
    phone = &TASK->phones[phoneid];
-
 
74
    if (!phone->callee)
-
 
75
        return -ENOENT;
-
 
76
 
-
 
77
    call = ipc_call_alloc();
-
 
78
    call->data[0] = arg1;
-
 
79
    call->data[1] = arg2;
-
 
80
   
-
 
81
    ipc_call_sync(phone, call);
-
 
82
 
-
 
83
    copy_to_uspace(respdata, &call->data, sizeof(__native) * IPC_CALL_LEN);
-
 
84
 
-
 
85
    return 0;
-
 
86
}
-
 
87
 
-
 
88
/** Send an asynchronous call over ipc
-
 
89
 *
-
 
90
 * @return Call identification, returns -1 on fatal error,
-
 
91
           -2 on 'Too many async request, handle answers first
-
 
92
 */
-
 
93
static __native sys_ipc_call_async(__native phoneid, __native arg1,
-
 
94
                   __native arg2)
64
{
95
{
65
    call_t *call;
96
    call_t *call;
66
    phone_t *phone;
97
    phone_t *phone;
67
 
98
 
68
    if (phoneid >= IPC_MAX_PHONES)
99
    if (phoneid >= IPC_MAX_PHONES)
Line 122... Line 153...
122
 
153
 
123
 
154
 
124
syshandler_t syscall_table[SYSCALL_END] = {
155
syshandler_t syscall_table[SYSCALL_END] = {
125
    sys_ctl,
156
    sys_ctl,
126
    sys_io,
157
    sys_io,
127
    sys_ipc_call,
158
    sys_ipc_call_sync,
-
 
159
    sys_ipc_call_async,
128
    sys_ipc_answer,
160
    sys_ipc_answer,
129
    sys_ipc_wait_for_call
161
    sys_ipc_wait_for_call
130
};
162
};