Changes in kernel/generic/src/ipc/sysipc.c [a53ed3a:addbce4] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ipc/sysipc.c
ra53ed3a raddbce4 155 155 * @param olddata Saved data of the request. 156 156 * 157 * @return Return EOK on success or a nerror code.158 * 159 */ 160 errno_t answer_preprocess(call_t *answer, ipc_data_t *olddata)161 { 162 errno_t rc = EOK;157 * @return Return EOK on success or a negative error code. 158 * 159 */ 160 int answer_preprocess(call_t *answer, ipc_data_t *olddata) 161 { 162 int rc = EOK; 163 163 164 164 spinlock_lock(&answer->forget_lock); … … 194 194 spinlock_unlock(&answer->forget_lock); 195 195 196 if (( errno_t) IPC_GET_RETVAL(answer->data) == EHANGUP) {196 if ((native_t) IPC_GET_RETVAL(answer->data) == EHANGUP) { 197 197 phone_t *phone = answer->caller_phone; 198 198 mutex_lock(&phone->lock); … … 222 222 * 223 223 */ 224 static errno_t request_preprocess(call_t *call, phone_t *phone)224 static int request_preprocess(call_t *call, phone_t *phone) 225 225 { 226 226 call->request_method = IPC_GET_IMETHOD(call->data); … … 239 239 static void process_answer(call_t *call) 240 240 { 241 if ((( errno_t) IPC_GET_RETVAL(call->data) == EHANGUP) &&241 if (((native_t) IPC_GET_RETVAL(call->data) == EHANGUP) && 242 242 (call->flags & IPC_CALL_FORWARDED)) 243 243 IPC_SET_RETVAL(call->data, EFORWARD); … … 271 271 * 272 272 */ 273 errno_t ipc_req_internal(cap_handle_t handle, ipc_data_t *data, sysarg_t priv)273 int ipc_req_internal(cap_handle_t handle, ipc_data_t *data, sysarg_t priv) 274 274 { 275 275 kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE); … … 281 281 memcpy(call->data.args, data->args, sizeof(data->args)); 282 282 283 errno_t rc = request_preprocess(call, kobj->phone);283 int rc = request_preprocess(call, kobj->phone); 284 284 if (!rc) { 285 285 #ifdef CONFIG_UDEBUG … … 359 359 * 360 360 * @return EOK on success. 361 * @return Anerror code on error.362 * 363 */ 364 sys _errno_t sys_ipc_call_async_fast(sysarg_t handle, sysarg_t imethod,361 * @return Negative error code on error. 362 * 363 */ 364 sysarg_t sys_ipc_call_async_fast(sysarg_t handle, sysarg_t imethod, 365 365 sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t label) 366 366 { … … 389 389 call->data.label = label; 390 390 391 errno_t res = request_preprocess(call, kobj->phone);391 int res = request_preprocess(call, kobj->phone); 392 392 393 393 if (!res) … … 409 409 * 410 410 */ 411 sys _errno_t sys_ipc_call_async_slow(sysarg_t handle, ipc_data_t *data,411 sysarg_t sys_ipc_call_async_slow(sysarg_t handle, ipc_data_t *data, 412 412 sysarg_t label) 413 413 { … … 422 422 423 423 call_t *call = ipc_call_alloc(0); 424 errno_t rc = copy_from_uspace(&call->data.args, &data->args,424 int rc = copy_from_uspace(&call->data.args, &data->args, 425 425 sizeof(call->data.args)); 426 if (rc != EOK) {426 if (rc != 0) { 427 427 kobject_put(call->kobject); 428 428 kobject_put(kobj); 429 return (sys _errno_t) rc;429 return (sysarg_t) rc; 430 430 } 431 431 … … 433 433 call->data.label = label; 434 434 435 errno_t res = request_preprocess(call, kobj->phone);435 int res = request_preprocess(call, kobj->phone); 436 436 437 437 if (!res) … … 466 466 * 467 467 */ 468 static sys _errno_t sys_ipc_forward_common(sysarg_t chandle, sysarg_t phandle,468 static sysarg_t sys_ipc_forward_common(sysarg_t chandle, sysarg_t phandle, 469 469 sysarg_t imethod, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, 470 470 sysarg_t arg4, sysarg_t arg5, unsigned int mode, bool slow) … … 482 482 483 483 bool after_forward = false; 484 errno_t rc;484 int rc; 485 485 486 486 kobject_t *pkobj = kobject_get(TASK, phandle, KOBJECT_TYPE_PHONE); … … 577 577 * 578 578 */ 579 sys _errno_t sys_ipc_forward_fast(sysarg_t chandle, sysarg_t phandle,579 sysarg_t sys_ipc_forward_fast(sysarg_t chandle, sysarg_t phandle, 580 580 sysarg_t imethod, sysarg_t arg1, sysarg_t arg2, unsigned int mode) 581 581 { … … 601 601 * 602 602 */ 603 sys _errno_t sys_ipc_forward_slow(sysarg_t chandle, sysarg_t phandle,603 sysarg_t sys_ipc_forward_slow(sysarg_t chandle, sysarg_t phandle, 604 604 ipc_data_t *data, unsigned int mode) 605 605 { 606 606 ipc_data_t newdata; 607 errno_t rc = copy_from_uspace(&newdata.args, &data->args,607 int rc = copy_from_uspace(&newdata.args, &data->args, 608 608 sizeof(newdata.args)); 609 if (rc != EOK)610 return (sys _errno_t) rc;609 if (rc != 0) 610 return (sysarg_t) rc; 611 611 612 612 return sys_ipc_forward_common(chandle, phandle, … … 631 631 * 632 632 */ 633 sys _errno_t sys_ipc_answer_fast(sysarg_t chandle, sysarg_t retval, sysarg_t arg1,633 sysarg_t sys_ipc_answer_fast(sysarg_t chandle, sysarg_t retval, sysarg_t arg1, 634 634 sysarg_t arg2, sysarg_t arg3, sysarg_t arg4) 635 635 { … … 660 660 */ 661 661 IPC_SET_ARG5(call->data, 0); 662 errno_t rc = answer_preprocess(call, saved ? &saved_data : NULL);662 int rc = answer_preprocess(call, saved ? &saved_data : NULL); 663 663 664 664 ipc_answer(&TASK->answerbox, call); … … 678 678 * 679 679 */ 680 sys _errno_t sys_ipc_answer_slow(sysarg_t chandle, ipc_data_t *data)680 sysarg_t sys_ipc_answer_slow(sysarg_t chandle, ipc_data_t *data) 681 681 { 682 682 kobject_t *kobj = cap_unpublish(TASK, chandle, KOBJECT_TYPE_CALL); … … 695 695 saved = false; 696 696 697 errno_t rc = copy_from_uspace(&call->data.args, &data->args,697 int rc = copy_from_uspace(&call->data.args, &data->args, 698 698 sizeof(call->data.args)); 699 if (rc != EOK) {699 if (rc != 0) { 700 700 /* 701 701 * Republish the capability so that the call does not get lost. … … 722 722 * 723 723 */ 724 sys _errno_t sys_ipc_hangup(sysarg_t handle)724 sysarg_t sys_ipc_hangup(sysarg_t handle) 725 725 { 726 726 kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE); … … 728 728 return ENOENT; 729 729 730 errno_t rc = ipc_phone_hangup(kobj->phone); 730 if (ipc_phone_hangup(kobj->phone)) { 731 kobject_put(kobj); 732 return -1; 733 } 734 731 735 kobject_put(kobj); 732 return rc;736 return 0; 733 737 } 734 738 … … 740 744 * for explanation. 741 745 * 742 * @return An error code on error. 743 */ 744 sys_errno_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec, 746 * @return Capability handle of the received request. 747 * @return CAP_NIL for answers, notifications and when there is no call. 748 * @return Negative error code on error. 749 */ 750 sysarg_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec, 745 751 unsigned int flags) 746 752 { … … 761 767 762 768 if (!call) { 763 ipc_data_t data = {}; 764 data.cap_handle = CAP_NIL; 765 STRUCT_TO_USPACE(calldata, &data); 766 return EOK; 767 } 768 769 call->data.flags = call->flags; 769 STRUCT_TO_USPACE(calldata, &(ipc_data_t){}); 770 return CAP_NIL; 771 } 772 770 773 if (call->flags & IPC_CALL_NOTIF) { 771 774 /* Set in_phone_hash to the interrupt counter */ 772 775 call->data.phone = (void *) call->priv; 773 776 774 call->data. cap_handle = CAP_NIL;777 call->data.flags = IPC_CALL_NOTIF; 775 778 776 779 STRUCT_TO_USPACE(calldata, &call->data); 777 780 kobject_put(call->kobject); 778 781 779 return EOK;782 return CAP_NIL; 780 783 } 781 784 … … 788 791 } 789 792 790 call->data. cap_handle = CAP_NIL;793 call->data.flags = IPC_CALL_ANSWERED; 791 794 792 795 STRUCT_TO_USPACE(calldata, &call->data); 793 796 kobject_put(call->kobject); 794 797 795 return EOK;798 return CAP_NIL; 796 799 } 797 800 … … 799 802 goto restart; 800 803 801 cap_handle_t handle; 802 errno_t rc = cap_alloc(TASK, &handle); 803 if (rc != EOK) { 804 int rc; 805 cap_handle_t handle = cap_alloc(TASK); 806 if (handle < 0) { 807 rc = handle; 804 808 goto error; 805 809 } 806 810 807 call->data.cap_handle = handle;808 809 811 /* 810 812 * Include phone hash of the caller in the request, copy the whole … … 817 819 kobject_add_ref(call->kobject); 818 820 cap_publish(TASK, handle, call->kobject); 819 return EOK;821 return handle; 820 822 821 823 error: … … 825 827 /* 826 828 * The callee will not receive this call and no one else has a chance to 827 * answer it. Set the IPC_CALL_AUTO_REPLY flag and return the EPARTY 828 * error code. 829 * answer it. Reply with the EPARTY error code. 829 830 */ 830 831 ipc_data_t saved_data; … … 839 840 IPC_SET_RETVAL(call->data, EPARTY); 840 841 (void) answer_preprocess(call, saved ? &saved_data : NULL); 841 call->flags |= IPC_CALL_AUTO_REPLY;842 842 ipc_answer(&TASK->answerbox, call); 843 843 … … 848 848 * 849 849 */ 850 sys _errno_t sys_ipc_poke(void)850 sysarg_t sys_ipc_poke(void) 851 851 { 852 852 waitq_unsleep(&TASK->answerbox.wq); … … 860 860 * @param ucode Uspace pointer to the top-half pseudocode. 861 861 * 862 * @param[out] uspace_handle Uspace pointer to IRQ kernel object capability 863 * 862 * @return IRQ kernel object capability 864 863 * @return EPERM 865 864 * @return Error code returned by ipc_irq_subscribe(). 866 865 * 867 866 */ 868 sys_errno_t sys_ipc_irq_subscribe(inr_t inr, sysarg_t imethod, irq_code_t *ucode, 869 cap_handle_t *uspace_handle) 867 sysarg_t sys_ipc_irq_subscribe(inr_t inr, sysarg_t imethod, irq_code_t *ucode) 870 868 { 871 869 if (!(perm_get(TASK) & PERM_IRQ_REG)) 872 870 return EPERM; 873 871 874 return ipc_irq_subscribe(&TASK->answerbox, inr, imethod, ucode , uspace_handle);872 return ipc_irq_subscribe(&TASK->answerbox, inr, imethod, ucode); 875 873 } 876 874 … … 883 881 * 884 882 */ 885 sys _errno_t sys_ipc_irq_unsubscribe(sysarg_t cap)883 sysarg_t sys_ipc_irq_unsubscribe(sysarg_t cap) 886 884 { 887 885 if (!(perm_get(TASK) & PERM_IRQ_REG)) … … 893 891 } 894 892 895 /** Syscall connect to a task by ID 896 * 897 * @return Error code. 898 * 899 */ 900 sys_errno_t sys_ipc_connect_kbox(task_id_t *uspace_taskid, cap_handle_t *uspace_phone) 893 #ifdef __32_BITS__ 894 895 /** Syscall connect to a task by ID (32 bits) 896 * 897 * @return Phone id on success, or negative error code. 898 * 899 */ 900 sysarg_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid) 901 901 { 902 902 #ifdef CONFIG_UDEBUG 903 task_id_t taskid; 904 cap_handle_t phone; 905 906 errno_t rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(task_id_t)); 907 if (rc == EOK) { 908 rc = ipc_connect_kbox((task_id_t) taskid, &phone); 909 } 910 911 if (rc == EOK) { 912 rc = copy_to_uspace(uspace_phone, &phone, sizeof(cap_handle_t)); 913 if (rc != EOK) { 914 // Clean up the phone on failure. 915 sys_ipc_hangup(phone); 916 } 917 } 918 919 return (sys_errno_t) rc; 903 sysarg64_t taskid; 904 int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(sysarg64_t)); 905 if (rc != 0) 906 return (sysarg_t) rc; 907 908 return ipc_connect_kbox((task_id_t) taskid); 920 909 #else 921 return (sys _errno_t) ENOTSUP;910 return (sysarg_t) ENOTSUP; 922 911 #endif 923 912 } 924 913 914 #endif /* __32_BITS__ */ 915 916 #ifdef __64_BITS__ 917 918 /** Syscall connect to a task by ID (64 bits) 919 * 920 * @return Phone id on success, or negative error code. 921 * 922 */ 923 sysarg_t sys_ipc_connect_kbox(sysarg_t taskid) 924 { 925 #ifdef CONFIG_UDEBUG 926 return ipc_connect_kbox((task_id_t) taskid); 927 #else 928 return (sysarg_t) ENOTSUP; 929 #endif 930 } 931 932 #endif /* __64_BITS__ */ 933 925 934 /** @} 926 935 */
Note:
See TracChangeset
for help on using the changeset viewer.