Subversion Repositories HelenOS

Rev

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

Rev 2568 Rev 2615
Line 82... Line 82...
82
 
82
 
83
static atomic_t ipc_futex = FUTEX_INITIALIZER;
83
static atomic_t ipc_futex = FUTEX_INITIALIZER;
84
 
84
 
85
/** Make a fast synchronous call.
85
/** Make a fast synchronous call.
86
 *
86
 *
87
 * Only one payload argument can be passed using this function. However, this
87
 * Only three payload arguments can be passed using this function. However, this
88
 * function is faster than the generic ipc_call_sync_3().
88
 * function is faster than the generic ipc_call_sync_slow() because the payload
-
 
89
 * is passed directly in registers.
89
 *
90
 *
90
 * @param phoneid   Phone handle for the call.
91
 * @param phoneid   Phone handle for the call.
91
 * @param method    Requested method.
92
 * @param method    Requested method.
92
 * @param arg1      Service-defined payload argument.
93
 * @param arg1      Service-defined payload argument.
-
 
94
 * @param arg2      Service-defined payload argument.
-
 
95
 * @param arg3      Service-defined payload argument.
93
 * @param result    If non-NULL, the return ARG1 will be stored there.
96
 * @param result1   If non-NULL, the return ARG1 will be stored there.
-
 
97
 * @param result2   If non-NULL, the return ARG2 will be stored there.
-
 
98
 * @param result3   If non-NULL, the return ARG3 will be stored there.
-
 
99
 * @param result4   If non-NULL, the return ARG4 will be stored there.
-
 
100
 * @param result5   If non-NULL, the return ARG5 will be stored there.
94
 *
101
 *
95
 * @return      Negative values represent errors returned by IPC.
102
 * @return      Negative values represent errors returned by IPC.
96
 *          Otherwise the RETVAL of the answer is returned.
103
 *          Otherwise the RETVAL of the answer is returned.
97
 */
104
 */
-
 
105
int
98
int ipc_call_sync(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t *result)
106
ipc_call_sync_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,
-
 
107
    ipcarg_t arg3, ipcarg_t *result1, ipcarg_t *result2, ipcarg_t *result3,
-
 
108
    ipcarg_t *result4, ipcarg_t *result5)
99
{
109
{
100
    ipc_call_t resdata;
110
    ipc_call_t resdata;
101
    int callres;
111
    int callres;
102
   
112
   
103
    callres = __SYSCALL4(SYS_IPC_CALL_SYNC_FAST, phoneid, method, arg1,
113
    callres = __SYSCALL6(SYS_IPC_CALL_SYNC_FAST, phoneid, method, arg1,
104
        (sysarg_t) &resdata);
114
        arg2, arg3, (sysarg_t) &resdata);
105
    if (callres)
115
    if (callres)
106
        return callres;
116
        return callres;
107
    if (result)
117
    if (result1)
108
        *result = IPC_GET_ARG1(resdata);
118
        *result1 = IPC_GET_ARG1(resdata);
-
 
119
    if (result2)
-
 
120
        *result2 = IPC_GET_ARG2(resdata);
-
 
121
    if (result3)
-
 
122
        *result3 = IPC_GET_ARG3(resdata);
-
 
123
    if (result4)
-
 
124
        *result4 = IPC_GET_ARG4(resdata);
-
 
125
    if (result5)
-
 
126
        *result5 = IPC_GET_ARG5(resdata);
-
 
127
 
109
    return IPC_GET_RETVAL(resdata);
128
    return IPC_GET_RETVAL(resdata);
110
}
129
}
111
 
130
 
112
/** Make a synchronous call transmitting 3 arguments of payload.
131
/** Make a synchronous call transmitting 5 arguments of payload.
113
 *
132
 *
114
 * @param phoneid   Phone handle for the call.
133
 * @param phoneid   Phone handle for the call.
115
 * @param method    Requested method.
134
 * @param method    Requested method.
116
 * @param arg1      Service-defined payload argument.
135
 * @param arg1      Service-defined payload argument.
117
 * @param arg2      Service-defined payload argument.
136
 * @param arg2      Service-defined payload argument.
118
 * @param arg3      Service-defined payload argument.
137
 * @param arg3      Service-defined payload argument.
-
 
138
 * @param arg4      Service-defined payload argument.
-
 
139
 * @param arg5      Service-defined payload argument.
119
 * @param result1   If non-NULL, storage for the first return argument.
140
 * @param result1   If non-NULL, storage for the first return argument.
120
 * @param result2   If non-NULL, storage for the second return argument.
141
 * @param result2   If non-NULL, storage for the second return argument.
121
 * @param result3   If non-NULL, storage for the third return argument.
142
 * @param result3   If non-NULL, storage for the third return argument.
-
 
143
 * @param result4   If non-NULL, storage for the fourth return argument.
-
 
144
 * @param result5   If non-NULL, storage for the fifth return argument.
122
 *
145
 *
123
 * @return      Negative value means IPC error.
146
 * @return      Negative value means IPC error.
124
 *          Otherwise the RETVAL of the answer.
147
 *          Otherwise the RETVAL of the answer.
125
 */
148
 */
-
 
149
int
126
int ipc_call_sync_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,
150
ipc_call_sync_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,
-
 
151
    ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *result1,
127
    ipcarg_t arg3, ipcarg_t *result1, ipcarg_t *result2, ipcarg_t *result3)
152
    ipcarg_t *result2, ipcarg_t *result3, ipcarg_t *result4, ipcarg_t *result5)
128
{
153
{
129
    ipc_call_t data;
154
    ipc_call_t data;
130
    int callres;
155
    int callres;
131
 
156
 
132
    IPC_SET_METHOD(data, method);
157
    IPC_SET_METHOD(data, method);
133
    IPC_SET_ARG1(data, arg1);
158
    IPC_SET_ARG1(data, arg1);
134
    IPC_SET_ARG2(data, arg2);
159
    IPC_SET_ARG2(data, arg2);
135
    IPC_SET_ARG3(data, arg3);
160
    IPC_SET_ARG3(data, arg3);
-
 
161
    IPC_SET_ARG4(data, arg4);
-
 
162
    IPC_SET_ARG5(data, arg5);
136
 
163
 
137
    callres = __SYSCALL3(SYS_IPC_CALL_SYNC, phoneid, (sysarg_t) &data,
164
    callres = __SYSCALL3(SYS_IPC_CALL_SYNC_SLOW, phoneid, (sysarg_t) &data,
138
        (sysarg_t) &data);
165
        (sysarg_t) &data);
139
    if (callres)
166
    if (callres)
140
        return callres;
167
        return callres;
141
 
168
 
142
    if (result1)
169
    if (result1)
143
        *result1 = IPC_GET_ARG1(data);
170
        *result1 = IPC_GET_ARG1(data);
144
    if (result2)
171
    if (result2)
145
        *result2 = IPC_GET_ARG2(data);
172
        *result2 = IPC_GET_ARG2(data);
146
    if (result3)
173
    if (result3)
147
        *result3 = IPC_GET_ARG3(data);
174
        *result3 = IPC_GET_ARG3(data);
-
 
175
    if (result4)
-
 
176
        *result4 = IPC_GET_ARG4(data);
-
 
177
    if (result5)
-
 
178
        *result5 = IPC_GET_ARG5(data);
-
 
179
 
148
    return IPC_GET_RETVAL(data);
180
    return IPC_GET_RETVAL(data);
149
}
181
}
150
 
182
 
151
/** Syscall to send asynchronous message.
183
/** Syscall to send asynchronous message.
152
 *
184
 *
Line 513... Line 545...
513
 *
545
 *
514
 * @return      Zero on success or a negative error code.
546
 * @return      Zero on success or a negative error code.
515
 */
547
 */
516
int ipc_connect_to_me(int phoneid, int arg1, int arg2, ipcarg_t *phonehash)
548
int ipc_connect_to_me(int phoneid, int arg1, int arg2, ipcarg_t *phonehash)
517
{
549
{
518
    return ipc_call_sync_3(phoneid, IPC_M_CONNECT_TO_ME, arg1, arg2, 0, 0,
550
    return ipc_call_sync_2_3(phoneid, IPC_M_CONNECT_TO_ME, arg1, arg2,
519
        0, phonehash);
551
        NULL, NULL, phonehash);
520
}
552
}
521
 
553
 
522
/** Ask through phone for a new connection to some service.
554
/** Ask through phone for a new connection to some service.
523
 *
555
 *
524
 * @param phoneid   Phone handle used for contacting the other side.
556
 * @param phoneid   Phone handle used for contacting the other side.
Line 530... Line 562...
530
int ipc_connect_me_to(int phoneid, int arg1, int arg2)
562
int ipc_connect_me_to(int phoneid, int arg1, int arg2)
531
{
563
{
532
    ipcarg_t newphid;
564
    ipcarg_t newphid;
533
    int res;
565
    int res;
534
 
566
 
535
    res = ipc_call_sync_3(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, 0, 0, 0,
567
    res = ipc_call_sync_2_3(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, NULL,
536
        &newphid);
568
        NULL, &newphid);
537
    if (res)
569
    if (res)
538
        return res;
570
        return res;
539
    return newphid;
571
    return newphid;
540
}
572
}
541
 
573
 
Line 603... Line 635...
603
 *
635
 *
604
 * @return      Zero on success or a negative error code from errno.h.
636
 * @return      Zero on success or a negative error code from errno.h.
605
 */
637
 */
606
int ipc_data_send(int phoneid, void *src, size_t size)
638
int ipc_data_send(int phoneid, void *src, size_t size)
607
{
639
{
608
    return ipc_call_sync_3(phoneid, IPC_M_DATA_SEND, 0, (ipcarg_t) src,
640
    return ipc_call_sync_3_0(phoneid, IPC_M_DATA_SEND, 0, (ipcarg_t) src,
609
        (ipcarg_t) size, NULL, NULL, NULL);
641
        (ipcarg_t) size);
610
}
642
}
611
 
643
 
612
/** Wrapper for receiving the IPC_M_DATA_SEND calls.
644
/** Wrapper for receiving the IPC_M_DATA_SEND calls.
613
 *
645
 *
614
 * This wrapper only makes it more comfortable to receive IPC_M_DATA_SEND calls
646
 * This wrapper only makes it more comfortable to receive IPC_M_DATA_SEND calls