Rev 3397 | Rev 3665 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3397 | Rev 3492 | ||
|---|---|---|---|
| Line 40... | Line 40... | ||
| 40 | #include <debug.h> |
40 | #include <debug.h> |
| 41 | #include <ipc/ipc.h> |
41 | #include <ipc/ipc.h> |
| 42 | #include <ipc/sysipc.h> |
42 | #include <ipc/sysipc.h> |
| 43 | #include <ipc/irq.h> |
43 | #include <ipc/irq.h> |
| 44 | #include <ipc/ipcrsc.h> |
44 | #include <ipc/ipcrsc.h> |
| - | 45 | #include <ipc/kbox.h> |
|
| - | 46 | #include <udebug/udebug_ipc.h> |
|
| 45 | #include <arch/interrupt.h> |
47 | #include <arch/interrupt.h> |
| 46 | #include <print.h> |
- | |
| 47 | #include <syscall/copy.h> |
48 | #include <syscall/copy.h> |
| 48 | #include <security/cap.h> |
49 | #include <security/cap.h> |
| 49 | #include <mm/as.h> |
50 | #include <mm/as.h> |
| 50 | #include <print.h> |
51 | #include <print.h> |
| 51 | 52 | ||
| Line 293... | Line 294... | ||
| 293 | } |
294 | } |
| 294 | 295 | ||
| 295 | /** Called before the request is sent. |
296 | /** Called before the request is sent. |
| 296 | * |
297 | * |
| 297 | * @param call Call structure with the request. |
298 | * @param call Call structure with the request. |
| - | 299 | * @param phone Phone that the call will be sent through. |
|
| 298 | * |
300 | * |
| 299 | * @return Return 0 on success, ELIMIT or EPERM on error. |
301 | * @return Return 0 on success, ELIMIT or EPERM on error. |
| 300 | */ |
302 | */ |
| 301 | static int request_preprocess(call_t *call) |
303 | static int request_preprocess(call_t *call, phone_t *phone) |
| 302 | { |
304 | { |
| 303 | int newphid; |
305 | int newphid; |
| 304 | size_t size; |
306 | size_t size; |
| 305 | uintptr_t src; |
307 | uintptr_t src; |
| 306 | int rc; |
308 | int rc; |
| Line 338... | Line 340... | ||
| 338 | if (rc != 0) { |
340 | if (rc != 0) { |
| 339 | free(call->buffer); |
341 | free(call->buffer); |
| 340 | return rc; |
342 | return rc; |
| 341 | } |
343 | } |
| 342 | break; |
344 | break; |
| - | 345 | #ifdef CONFIG_UDEBUG |
|
| - | 346 | case IPC_M_DEBUG_ALL: |
|
| - | 347 | return udebug_request_preprocess(call, phone); |
|
| - | 348 | #endif |
|
| 343 | default: |
349 | default: |
| 344 | break; |
350 | break; |
| 345 | } |
351 | } |
| 346 | return 0; |
352 | return 0; |
| 347 | } |
353 | } |
| Line 367... | Line 373... | ||
| 367 | IPC_SET_ARG5(call->data, call->priv); |
373 | IPC_SET_ARG5(call->data, call->priv); |
| 368 | } |
374 | } |
| 369 | 375 | ||
| 370 | if (call->buffer) { |
376 | if (call->buffer) { |
| 371 | /* This must be an affirmative answer to IPC_M_DATA_READ. */ |
377 | /* This must be an affirmative answer to IPC_M_DATA_READ. */ |
| - | 378 | /* or IPC_M_DEBUG_ALL/UDEBUG_M_MEM_READ... */ |
|
| 372 | uintptr_t dst = IPC_GET_ARG1(call->data); |
379 | uintptr_t dst = IPC_GET_ARG1(call->data); |
| 373 | size_t size = IPC_GET_ARG2(call->data); |
380 | size_t size = IPC_GET_ARG2(call->data); |
| 374 | int rc = copy_to_uspace((void *) dst, call->buffer, size); |
381 | int rc = copy_to_uspace((void *) dst, call->buffer, size); |
| 375 | if (rc) |
382 | if (rc) |
| 376 | IPC_SET_RETVAL(call->data, rc); |
383 | IPC_SET_RETVAL(call->data, rc); |
| Line 397... | Line 404... | ||
| 397 | IPC_SET_RETVAL(call->data, ELIMIT); |
404 | IPC_SET_RETVAL(call->data, ELIMIT); |
| 398 | ipc_answer(box, call); |
405 | ipc_answer(box, call); |
| 399 | return -1; |
406 | return -1; |
| 400 | } |
407 | } |
| 401 | IPC_SET_ARG5(call->data, phoneid); |
408 | IPC_SET_ARG5(call->data, phoneid); |
| 402 | } |
409 | } |
| - | 410 | switch (IPC_GET_METHOD(call->data)) { |
|
| - | 411 | case IPC_M_DEBUG_ALL: |
|
| - | 412 | return -1; |
|
| - | 413 | default: |
|
| - | 414 | break; |
|
| - | 415 | } |
|
| 403 | return 0; |
416 | return 0; |
| 404 | } |
417 | } |
| 405 | 418 | ||
| 406 | /** Make a fast call over IPC, wait for reply and return to user. |
419 | /** Make a fast call over IPC, wait for reply and return to user. |
| 407 | * |
420 | * |
| Line 439... | Line 452... | ||
| 439 | * the limits of the fast version. |
452 | * the limits of the fast version. |
| 440 | */ |
453 | */ |
| 441 | IPC_SET_ARG4(call.data, 0); |
454 | IPC_SET_ARG4(call.data, 0); |
| 442 | IPC_SET_ARG5(call.data, 0); |
455 | IPC_SET_ARG5(call.data, 0); |
| 443 | 456 | ||
| 444 | if (!(res = request_preprocess(&call))) { |
457 | if (!(res = request_preprocess(&call, phone))) { |
| 445 | rc = ipc_call_sync(phone, &call); |
458 | rc = ipc_call_sync(phone, &call); |
| 446 | if (rc != EOK) |
459 | if (rc != EOK) |
| 447 | return rc; |
460 | return rc; |
| 448 | process_answer(&call); |
461 | process_answer(&call); |
| 449 | } else { |
462 | } else { |
| Line 479... | Line 492... | ||
| 479 | if (rc != 0) |
492 | if (rc != 0) |
| 480 | return (unative_t) rc; |
493 | return (unative_t) rc; |
| 481 | 494 | ||
| 482 | GET_CHECK_PHONE(phone, phoneid, return ENOENT); |
495 | GET_CHECK_PHONE(phone, phoneid, return ENOENT); |
| 483 | 496 | ||
| 484 | if (!(res = request_preprocess(&call))) { |
497 | if (!(res = request_preprocess(&call, phone))) { |
| 485 | rc = ipc_call_sync(phone, &call); |
498 | rc = ipc_call_sync(phone, &call); |
| 486 | if (rc != EOK) |
499 | if (rc != EOK) |
| 487 | return rc; |
500 | return rc; |
| 488 | process_answer(&call); |
501 | process_answer(&call); |
| 489 | } else |
502 | } else |
| Line 548... | Line 561... | ||
| 548 | * To achieve deterministic behavior, zero out arguments that are beyond |
561 | * To achieve deterministic behavior, zero out arguments that are beyond |
| 549 | * the limits of the fast version. |
562 | * the limits of the fast version. |
| 550 | */ |
563 | */ |
| 551 | IPC_SET_ARG5(call->data, 0); |
564 | IPC_SET_ARG5(call->data, 0); |
| 552 | 565 | ||
| 553 | if (!(res = request_preprocess(call))) |
566 | if (!(res = request_preprocess(call, phone))) |
| 554 | ipc_call(phone, call); |
567 | ipc_call(phone, call); |
| 555 | else |
568 | else |
| 556 | ipc_backsend_err(phone, call, res); |
569 | ipc_backsend_err(phone, call, res); |
| 557 | 570 | ||
| 558 | return (unative_t) call; |
571 | return (unative_t) call; |
| Line 582... | Line 595... | ||
| 582 | sizeof(call->data.args)); |
595 | sizeof(call->data.args)); |
| 583 | if (rc != 0) { |
596 | if (rc != 0) { |
| 584 | ipc_call_free(call); |
597 | ipc_call_free(call); |
| 585 | return (unative_t) rc; |
598 | return (unative_t) rc; |
| 586 | } |
599 | } |
| 587 | if (!(res = request_preprocess(call))) |
600 | if (!(res = request_preprocess(call, phone))) |
| 588 | ipc_call(phone, call); |
601 | ipc_call(phone, call); |
| 589 | else |
602 | else |
| 590 | ipc_backsend_err(phone, call, res); |
603 | ipc_backsend_err(phone, call, res); |
| 591 | 604 | ||
| 592 | return (unative_t) call; |
605 | return (unative_t) call; |
| Line 807... | Line 820... | ||
| 807 | if (call->flags & IPC_CALL_ANSWERED) { |
820 | if (call->flags & IPC_CALL_ANSWERED) { |
| 808 | process_answer(call); |
821 | process_answer(call); |
| 809 | 822 | ||
| 810 | ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); |
823 | ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); |
| 811 | 824 | ||
| 812 | atomic_dec(&TASK->active_calls); |
- | |
| 813 | - | ||
| 814 | if (call->flags & IPC_CALL_DISCARD_ANSWER) { |
825 | if (call->flags & IPC_CALL_DISCARD_ANSWER) { |
| 815 | ipc_call_free(call); |
826 | ipc_call_free(call); |
| 816 | goto restart; |
827 | goto restart; |
| - | 828 | } else { |
|
| - | 829 | /* |
|
| - | 830 | * Decrement the counter of active calls only if the |
|
| - | 831 | * call is not an answer to IPC_M_PHONE_HUNGUP, |
|
| - | 832 | * which doesn't contribute to the counter. |
|
| - | 833 | */ |
|
| - | 834 | atomic_dec(&TASK->active_calls); |
|
| 817 | } |
835 | } |
| 818 | 836 | ||
| 819 | STRUCT_TO_USPACE(&calldata->args, &call->data.args); |
837 | STRUCT_TO_USPACE(&calldata->args, &call->data.args); |
| 820 | ipc_call_free(call); |
838 | ipc_call_free(call); |
| 821 | 839 | ||
| Line 866... | Line 884... | ||
| 866 | ipc_irq_unregister(&TASK->answerbox, inr, devno); |
884 | ipc_irq_unregister(&TASK->answerbox, inr, devno); |
| 867 | 885 | ||
| 868 | return 0; |
886 | return 0; |
| 869 | } |
887 | } |
| 870 | 888 | ||
| - | 889 | #include <console/console.h> |
|
| - | 890 | ||
| - | 891 | /** |
|
| - | 892 | * Syscall connect to a task by id. |
|
| - | 893 | * |
|
| - | 894 | * @return Phone id on success, or negative error code. |
|
| - | 895 | */ |
|
| - | 896 | unative_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid_arg) |
|
| - | 897 | { |
|
| - | 898 | #ifdef CONFIG_UDEBUG |
|
| - | 899 | sysarg64_t taskid_arg; |
|
| - | 900 | int rc; |
|
| - | 901 | ||
| - | 902 | rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t)); |
|
| - | 903 | if (rc != 0) |
|
| - | 904 | return (unative_t) rc; |
|
| - | 905 | ||
| - | 906 | LOG("sys_ipc_connect_kbox(%" PRIu64 ")\n", taskid_arg.value); |
|
| - | 907 | ||
| - | 908 | return ipc_connect_kbox(taskid_arg.value); |
|
| - | 909 | #else |
|
| - | 910 | return (unative_t) ENOTSUP; |
|
| - | 911 | #endif |
|
| - | 912 | } |
|
| - | 913 | ||
| 871 | /** @} |
914 | /** @} |
| 872 | */ |
915 | */ |