Changes in / [0722869:071a1ddb] in mainline


Ignore:
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/ipc/kbox.h

    r0722869 r071a1ddb  
    5050} kbox_t;
    5151
    52 extern int ipc_connect_kbox(task_id_t, cap_handle_t *);
     52extern int ipc_connect_kbox(task_id_t);
    5353extern void ipc_kbox_cleanup(void);
    5454
  • kernel/generic/include/ipc/sysipc.h

    r0722869 r071a1ddb  
    5959extern sysarg_t sys_ipc_irq_unsubscribe(sysarg_t);
    6060
    61 extern sysarg_t sys_ipc_connect_kbox(task_id_t *, cap_handle_t *);
     61#ifdef __32_BITS__
     62
     63extern sysarg_t sys_ipc_connect_kbox(sysarg64_t *);
     64
     65#endif  /* __32_BITS__ */
     66
     67#ifdef __64_BITS__
     68
     69extern sysarg_t sys_ipc_connect_kbox(sysarg_t);
     70
     71#endif  /* __64_BITS__ */
    6272
    6373#endif
  • kernel/generic/src/ipc/kbox.c

    r0722869 r071a1ddb  
    206206 * cleanup code.
    207207 *
    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 */
     211int ipc_connect_kbox(task_id_t taskid)
    213212{
    214213        irq_spinlock_lock(&tasks_lock, true);
     
    232231        }
    233232       
    234         if (task->kb.finished) {
     233        if (task->kb.finished != false) {
    235234                mutex_unlock(&task->kb.cleanup_lock);
    236235                return EINVAL;
    237236        }
    238237       
    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. */
    254238        cap_handle_t phone_handle = phone_alloc(TASK);
    255239        if (phone_handle < 0) {
     
    264248        (void) ipc_phone_connect(phone_obj->phone, &task->kb.box);
    265249       
     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       
    266266        mutex_unlock(&task->kb.cleanup_lock);
    267         *out_phone = phone_handle;
    268         return EOK;
     267       
     268        return phone_handle;
    269269}
    270270
  • kernel/generic/src/ipc/sysipc.c

    r0722869 r071a1ddb  
    897897}
    898898
    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 */
     906sysarg_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid)
    905907{
    906908#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);
    924915#else
    925916        return (sysarg_t) ENOTSUP;
     
    927918}
    928919
     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 */
     929sysarg_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
    929940/** @}
    930941 */
  • uspace/lib/c/generic/async.c

    r0722869 r071a1ddb  
    23982398        }
    23992399       
    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;
    24042403                free(sess);
    24052404                return NULL;
  • uspace/lib/c/generic/ipc.c

    r0722869 r071a1ddb  
    377377 *
    378378 */
    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);
     379int 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
    382389}
    383390
  • uspace/lib/c/include/ipc/ipc.h

    r0722869 r071a1ddb  
    122122    sysarg_t, sysarg_t, sysarg_t, sysarg_t, unsigned int);
    123123
    124 extern int ipc_connect_kbox(task_id_t, cap_handle_t *);
     124extern int ipc_connect_kbox(task_id_t);
    125125
    126126#endif
Note: See TracChangeset for help on using the changeset viewer.