Rev 1281 | Rev 1293 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1281 | Rev 1288 | ||
|---|---|---|---|
| Line 26... | Line 26... | ||
| 26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | */ |
27 | */ |
| 28 | 28 | ||
| 29 | #include <arch.h> |
29 | #include <arch.h> |
| 30 | #include <proc/task.h> |
30 | #include <proc/task.h> |
| 31 | - | ||
| - | 31 | #include <proc/thread.h> |
|
| 32 | #include <errno.h> |
32 | #include <errno.h> |
| 33 | #include <mm/page.h> |
- | |
| 34 | #include <memstr.h> |
33 | #include <memstr.h> |
| 35 | #include <debug.h> |
34 | #include <debug.h> |
| 36 | #include <ipc/ipc.h> |
35 | #include <ipc/ipc.h> |
| 37 | #include <ipc/sysipc.h> |
36 | #include <ipc/sysipc.h> |
| 38 | #include <ipc/irq.h> |
37 | #include <ipc/irq.h> |
| 39 | #include <ipc/ipcrsc.h> |
38 | #include <ipc/ipcrsc.h> |
| 40 | #include <arch/interrupt.h> |
39 | #include <arch/interrupt.h> |
| 41 | - | ||
| 42 | #include <print.h> |
40 | #include <print.h> |
| 43 | #include <arch.h> |
- | |
| 44 | #include <proc/thread.h> |
41 | #include <syscall/copy.h> |
| 45 | 42 | ||
| 46 | #define GET_CHECK_PHONE(phone,phoneid,err) { \ |
43 | #define GET_CHECK_PHONE(phone,phoneid,err) { \ |
| 47 | if (phoneid > IPC_MAX_PHONES) { err; } \ |
44 | if (phoneid > IPC_MAX_PHONES) { err; } \ |
| 48 | phone = &TASK->phones[phoneid]; \ |
45 | phone = &TASK->phones[phoneid]; \ |
| 49 | } |
46 | } |
| Line 226... | Line 223... | ||
| 226 | ipc_data_t *reply) |
223 | ipc_data_t *reply) |
| 227 | { |
224 | { |
| 228 | call_t call; |
225 | call_t call; |
| 229 | phone_t *phone; |
226 | phone_t *phone; |
| 230 | int res; |
227 | int res; |
| - | 228 | int rc; |
|
| 231 | 229 | ||
| 232 | ipc_call_static_init(&call); |
230 | ipc_call_static_init(&call); |
| 233 | copy_from_uspace(&call.data.args, &question->args, sizeof(call.data.args)); |
231 | rc = copy_from_uspace(&call.data.args, &question->args, sizeof(call.data.args)); |
| - | 232 | if (rc != 0) |
|
| - | 233 | return (__native) rc; |
|
| 234 | 234 | ||
| 235 | GET_CHECK_PHONE(phone, phoneid, return ENOENT); |
235 | GET_CHECK_PHONE(phone, phoneid, return ENOENT); |
| 236 | 236 | ||
| 237 | if (!(res=request_preprocess(&call))) { |
237 | if (!(res=request_preprocess(&call))) { |
| 238 | ipc_call_sync(phone, &call); |
238 | ipc_call_sync(phone, &call); |
| 239 | process_answer(&call); |
239 | process_answer(&call); |
| 240 | } else |
240 | } else |
| 241 | IPC_SET_RETVAL(call.data, res); |
241 | IPC_SET_RETVAL(call.data, res); |
| 242 | 242 | ||
| 243 | STRUCT_TO_USPACE(&reply->args, &call.data.args); |
243 | rc = STRUCT_TO_USPACE(&reply->args, &call.data.args); |
| - | 244 | if (rc != 0) |
|
| - | 245 | return rc; |
|
| 244 | 246 | ||
| 245 | return 0; |
247 | return 0; |
| 246 | } |
248 | } |
| 247 | 249 | ||
| 248 | /** Check that the task did not exceed allowed limit |
250 | /** Check that the task did not exceed allowed limit |
| Line 295... | Line 297... | ||
| 295 | __native sys_ipc_call_async(__native phoneid, ipc_data_t *data) |
297 | __native sys_ipc_call_async(__native phoneid, ipc_data_t *data) |
| 296 | { |
298 | { |
| 297 | call_t *call; |
299 | call_t *call; |
| 298 | phone_t *phone; |
300 | phone_t *phone; |
| 299 | int res; |
301 | int res; |
| - | 302 | int rc; |
|
| 300 | 303 | ||
| 301 | if (check_call_limit()) |
304 | if (check_call_limit()) |
| 302 | return IPC_CALLRET_TEMPORARY; |
305 | return IPC_CALLRET_TEMPORARY; |
| 303 | 306 | ||
| 304 | GET_CHECK_PHONE(phone, phoneid, return IPC_CALLRET_FATAL); |
307 | GET_CHECK_PHONE(phone, phoneid, return IPC_CALLRET_FATAL); |
| 305 | 308 | ||
| 306 | call = ipc_call_alloc(0); |
309 | call = ipc_call_alloc(0); |
| 307 | copy_from_uspace(&call->data.args, &data->args, sizeof(call->data.args)); |
310 | rc = copy_from_uspace(&call->data.args, &data->args, sizeof(call->data.args)); |
| - | 311 | if (rc != 0) |
|
| - | 312 | return (__native) rc; |
|
| 308 | if (!(res=request_preprocess(call))) |
313 | if (!(res=request_preprocess(call))) |
| 309 | ipc_call(phone, call); |
314 | ipc_call(phone, call); |
| 310 | else |
315 | else |
| 311 | ipc_backsend_err(phone, call, res); |
316 | ipc_backsend_err(phone, call, res); |
| 312 | 317 | ||
| Line 391... | Line 396... | ||
| 391 | __native sys_ipc_answer(__native callid, ipc_data_t *data) |
396 | __native sys_ipc_answer(__native callid, ipc_data_t *data) |
| 392 | { |
397 | { |
| 393 | call_t *call; |
398 | call_t *call; |
| 394 | ipc_data_t saved_data; |
399 | ipc_data_t saved_data; |
| 395 | int saveddata = 0; |
400 | int saveddata = 0; |
| - | 401 | int rc; |
|
| 396 | 402 | ||
| 397 | call = get_call(callid); |
403 | call = get_call(callid); |
| 398 | if (!call) |
404 | if (!call) |
| 399 | return ENOENT; |
405 | return ENOENT; |
| 400 | 406 | ||
| 401 | if (answer_need_old(call)) { |
407 | if (answer_need_old(call)) { |
| 402 | memcpy(&saved_data, &call->data, sizeof(call->data)); |
408 | memcpy(&saved_data, &call->data, sizeof(call->data)); |
| 403 | saveddata = 1; |
409 | saveddata = 1; |
| 404 | } |
410 | } |
| 405 | copy_from_uspace(&call->data.args, &data->args, |
411 | rc = copy_from_uspace(&call->data.args, &data->args, |
| 406 | sizeof(call->data.args)); |
412 | sizeof(call->data.args)); |
| - | 413 | if (rc != 0) |
|
| - | 414 | return rc; |
|
| 407 | 415 | ||
| 408 | answer_preprocess(call, saveddata ? &saved_data : NULL); |
416 | answer_preprocess(call, saveddata ? &saved_data : NULL); |
| 409 | 417 | ||
| 410 | ipc_answer(&TASK->answerbox, call); |
418 | ipc_answer(&TASK->answerbox, call); |
| 411 | 419 | ||