Changes in / [0722869:071a1ddb] in mainline
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/ipc/kbox.h
r0722869 r071a1ddb 50 50 } kbox_t; 51 51 52 extern int ipc_connect_kbox(task_id_t , cap_handle_t *);52 extern int ipc_connect_kbox(task_id_t); 53 53 extern void ipc_kbox_cleanup(void); 54 54 -
kernel/generic/include/ipc/sysipc.h
r0722869 r071a1ddb 59 59 extern sysarg_t sys_ipc_irq_unsubscribe(sysarg_t); 60 60 61 extern sysarg_t sys_ipc_connect_kbox(task_id_t *, cap_handle_t *); 61 #ifdef __32_BITS__ 62 63 extern sysarg_t sys_ipc_connect_kbox(sysarg64_t *); 64 65 #endif /* __32_BITS__ */ 66 67 #ifdef __64_BITS__ 68 69 extern sysarg_t sys_ipc_connect_kbox(sysarg_t); 70 71 #endif /* __64_BITS__ */ 62 72 63 73 #endif -
kernel/generic/src/ipc/kbox.c
r0722869 r071a1ddb 206 206 * cleanup code. 207 207 * 208 * @param[out] out_phone Phone capability handle on success. 209 * @return Error code. 210 * 211 */ 212 int ipc_connect_kbox(task_id_t taskid, cap_handle_t *out_phone) 208 * @return Phone capability handle on success, or negative error code. 209 * 210 */ 211 int ipc_connect_kbox(task_id_t taskid) 213 212 { 214 213 irq_spinlock_lock(&tasks_lock, true); … … 232 231 } 233 232 234 if (task->kb.finished ) {233 if (task->kb.finished != false) { 235 234 mutex_unlock(&task->kb.cleanup_lock); 236 235 return EINVAL; 237 236 } 238 237 239 /* Create a kbox thread if necessary. */240 if (task->kb.thread == NULL) {241 thread_t *kb_thread = thread_create(kbox_thread_proc, NULL, task,242 THREAD_FLAG_NONE, "kbox");243 244 if (!kb_thread) {245 mutex_unlock(&task->kb.cleanup_lock);246 return ENOMEM;247 }248 249 task->kb.thread = kb_thread;250 thread_ready(kb_thread);251 }252 253 /* Allocate a new phone. */254 238 cap_handle_t phone_handle = phone_alloc(TASK); 255 239 if (phone_handle < 0) { … … 264 248 (void) ipc_phone_connect(phone_obj->phone, &task->kb.box); 265 249 250 if (task->kb.thread != NULL) { 251 mutex_unlock(&task->kb.cleanup_lock); 252 return phone_handle; 253 } 254 255 /* Create a kbox thread */ 256 thread_t *kb_thread = thread_create(kbox_thread_proc, NULL, task, 257 THREAD_FLAG_NONE, "kbox"); 258 if (!kb_thread) { 259 mutex_unlock(&task->kb.cleanup_lock); 260 return ENOMEM; 261 } 262 263 task->kb.thread = kb_thread; 264 thread_ready(kb_thread); 265 266 266 mutex_unlock(&task->kb.cleanup_lock); 267 *out_phone = phone_handle;268 return EOK;267 268 return phone_handle; 269 269 } 270 270 -
kernel/generic/src/ipc/sysipc.c
r0722869 r071a1ddb 897 897 } 898 898 899 /** Syscall connect to a task by ID 900 * 901 * @return Error code. 902 * 903 */ 904 sysarg_t sys_ipc_connect_kbox(task_id_t *uspace_taskid, cap_handle_t *uspace_phone) 899 #ifdef __32_BITS__ 900 901 /** Syscall connect to a task by ID (32 bits) 902 * 903 * @return Phone id on success, or negative error code. 904 * 905 */ 906 sysarg_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid) 905 907 { 906 908 #ifdef CONFIG_UDEBUG 907 task_id_t taskid; 908 cap_handle_t phone; 909 910 int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(task_id_t)); 911 if (rc == EOK) { 912 rc = ipc_connect_kbox((task_id_t) taskid, &phone); 913 } 914 915 if (rc == EOK) { 916 rc = copy_to_uspace(uspace_phone, &phone, sizeof(cap_handle_t)); 917 if (rc != EOK) { 918 // Clean up the phone on failure. 919 sys_ipc_hangup(phone); 920 } 921 } 922 923 return (sysarg_t) rc; 909 sysarg64_t taskid; 910 int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(sysarg64_t)); 911 if (rc != 0) 912 return (sysarg_t) rc; 913 914 return ipc_connect_kbox((task_id_t) taskid); 924 915 #else 925 916 return (sysarg_t) ENOTSUP; … … 927 918 } 928 919 920 #endif /* __32_BITS__ */ 921 922 #ifdef __64_BITS__ 923 924 /** Syscall connect to a task by ID (64 bits) 925 * 926 * @return Phone id on success, or negative error code. 927 * 928 */ 929 sysarg_t sys_ipc_connect_kbox(sysarg_t taskid) 930 { 931 #ifdef CONFIG_UDEBUG 932 return ipc_connect_kbox((task_id_t) taskid); 933 #else 934 return (sysarg_t) ENOTSUP; 935 #endif 936 } 937 938 #endif /* __64_BITS__ */ 939 929 940 /** @} 930 941 */ -
uspace/lib/c/generic/async.c
r0722869 r071a1ddb 2398 2398 } 2399 2399 2400 cap_handle_t phone; 2401 int rc = ipc_connect_kbox(id, &phone); 2402 if (rc != EOK) { 2403 errno = rc; 2400 int phone = ipc_connect_kbox(id); 2401 if (phone < 0) { 2402 errno = phone; 2404 2403 free(sess); 2405 2404 return NULL; -
uspace/lib/c/generic/ipc.c
r0722869 r071a1ddb 377 377 * 378 378 */ 379 int ipc_connect_kbox(task_id_t id, cap_handle_t *phone) 380 { 381 return __SYSCALL2(SYS_IPC_CONNECT_KBOX, (sysarg_t) &id, (sysarg_t) phone); 379 int ipc_connect_kbox(task_id_t id) 380 { 381 #ifdef __32_BITS__ 382 sysarg64_t arg = (sysarg64_t) id; 383 return __SYSCALL1(SYS_IPC_CONNECT_KBOX, (sysarg_t) &arg); 384 #endif 385 386 #ifdef __64_BITS__ 387 return __SYSCALL1(SYS_IPC_CONNECT_KBOX, (sysarg_t) id); 388 #endif 382 389 } 383 390 -
uspace/lib/c/include/ipc/ipc.h
r0722869 r071a1ddb 122 122 sysarg_t, sysarg_t, sysarg_t, sysarg_t, unsigned int); 123 123 124 extern int ipc_connect_kbox(task_id_t , cap_handle_t *);124 extern int ipc_connect_kbox(task_id_t); 125 125 126 126 #endif
Note:
See TracChangeset
for help on using the changeset viewer.