Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/proc/task.c

    rbe06914 r5bcf1f9  
    151151        atomic_set(&task->refcount, 0);
    152152        atomic_set(&task->lifecount, 0);
    153         atomic_set(&task->active_calls, 0);
    154153       
    155154        irq_spinlock_initialize(&task->lock, "task_t_lock");
     
    291290}
    292291
    293 /** Syscall for reading task ID from userspace.
    294  *
    295  * @param uspace_task_id Userspace address of 8-byte buffer
    296  *                       where to store current task ID.
     292#ifdef __32_BITS__
     293
     294/** Syscall for reading task ID from userspace (32 bits)
     295 *
     296 * @param uspace_taskid Pointer to user-space buffer
     297 *                      where to store current task ID.
    297298 *
    298299 * @return Zero on success or an error code from @ref errno.h.
    299300 *
    300301 */
    301 unative_t sys_task_get_id(task_id_t *uspace_task_id)
     302sysarg_t sys_task_get_id(sysarg64_t *uspace_taskid)
    302303{
    303304        /*
     
    305306         * the lifespan of the task.
    306307         */
    307         return (unative_t) copy_to_uspace(uspace_task_id, &TASK->taskid,
     308        return (sysarg_t) copy_to_uspace(uspace_taskid, &TASK->taskid,
    308309            sizeof(TASK->taskid));
    309310}
     311
     312#endif  /* __32_BITS__ */
     313
     314#ifdef __64_BITS__
     315
     316/** Syscall for reading task ID from userspace (64 bits)
     317 *
     318 * @return Current task ID.
     319 *
     320 */
     321sysarg_t sys_task_get_id(void)
     322{
     323        /*
     324         * No need to acquire lock on TASK because taskid remains constant for
     325         * the lifespan of the task.
     326         */
     327        return TASK->taskid;
     328}
     329
     330#endif  /* __64_BITS__ */
    310331
    311332/** Syscall for setting the task name.
     
    319340 *
    320341 */
    321 unative_t sys_task_set_name(const char *uspace_name, size_t name_len)
    322 {
    323         int rc;
     342sysarg_t sys_task_set_name(const char *uspace_name, size_t name_len)
     343{
    324344        char namebuf[TASK_NAME_BUFLEN];
    325345       
    326346        /* Cap length of name and copy it from userspace. */
    327        
    328347        if (name_len > TASK_NAME_BUFLEN - 1)
    329348                name_len = TASK_NAME_BUFLEN - 1;
    330349       
    331         rc = copy_from_uspace(namebuf, uspace_name, name_len);
     350        int rc = copy_from_uspace(namebuf, uspace_name, name_len);
    332351        if (rc != 0)
    333                 return (unative_t) rc;
     352                return (sysarg_t) rc;
    334353       
    335354        namebuf[name_len] = '\0';
     355       
     356        /*
     357         * As the task name is referenced also from the
     358         * threads, lock the threads' lock for the course
     359         * of the update.
     360         */
     361       
     362        irq_spinlock_lock(&tasks_lock, true);
     363        irq_spinlock_lock(&TASK->lock, false);
     364        irq_spinlock_lock(&threads_lock, false);
     365       
     366        /* Set task name */
    336367        str_cpy(TASK->name, TASK_NAME_BUFLEN, namebuf);
    337368       
     369        irq_spinlock_unlock(&threads_lock, false);
     370        irq_spinlock_unlock(&TASK->lock, false);
     371        irq_spinlock_unlock(&tasks_lock, true);
     372       
    338373        return EOK;
     374}
     375
     376/** Syscall to forcefully terminate a task
     377 *
     378 * @param uspace_taskid Pointer to task ID in user space.
     379 *
     380 * @return 0 on success or an error code from @ref errno.h.
     381 *
     382 */
     383sysarg_t sys_task_kill(task_id_t *uspace_taskid)
     384{
     385        task_id_t taskid;
     386        int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(taskid));
     387        if (rc != 0)
     388                return (sysarg_t) rc;
     389       
     390        return (sysarg_t) task_kill(taskid);
    339391}
    340392
     
    409461static void task_kill_internal(task_t *task)
    410462{
     463        irq_spinlock_lock(&task->lock, false);
     464        irq_spinlock_lock(&threads_lock, false);
     465       
     466        /*
     467         * Interrupt all threads.
     468         */
     469       
    411470        link_t *cur;
    412        
    413         /*
    414          * Interrupt all threads.
    415          */
    416         irq_spinlock_lock(&task->lock, false);
    417471        for (cur = task->th_head.next; cur != &task->th_head; cur = cur->next) {
    418472                thread_t *thread = list_get_instance(cur, thread_t, th_link);
     
    431485        }
    432486       
     487        irq_spinlock_unlock(&threads_lock, false);
    433488        irq_spinlock_unlock(&task->lock, false);
    434489}
     
    460515        irq_spinlock_unlock(&tasks_lock, true);
    461516       
     517        return EOK;
     518}
     519
     520/** Kill the currently running task.
     521 *
     522 * @param notify Send out fault notifications.
     523 *
     524 * @return Zero on success or an error code from errno.h.
     525 *
     526 */
     527void task_kill_self(bool notify)
     528{
     529        /*
     530         * User space can subscribe for FAULT events to take action
     531         * whenever a task faults (to take a dump, run a debugger, etc.).
     532         * The notification is always available, but unless udebug is enabled,
     533         * that's all you get.
     534        */
     535        if (notify) {
     536                if (event_is_subscribed(EVENT_FAULT)) {
     537                        /* Notify the subscriber that a fault occurred. */
     538                        event_notify_3(EVENT_FAULT, LOWER32(TASK->taskid),
     539                            UPPER32(TASK->taskid), (sysarg_t) THREAD);
     540               
     541#ifdef CONFIG_UDEBUG
     542                        /* Wait for a debugging session. */
     543                        udebug_thread_fault();
     544#endif
     545                }
     546        }
     547       
     548        irq_spinlock_lock(&tasks_lock, true);
     549        task_kill_internal(TASK);
     550        irq_spinlock_unlock(&tasks_lock, true);
     551       
     552        thread_exit();
     553}
     554
     555/** Process syscall to terminate the current task.
     556 *
     557 * @param notify Send out fault notifications.
     558 *
     559 */
     560sysarg_t sys_task_exit(sysarg_t notify)
     561{
     562        task_kill_self(notify);
     563       
     564        /* Unreachable */
    462565        return EOK;
    463566}
     
    478581#ifdef __32_BITS__
    479582        if (*additional)
    480                 printf("%-8" PRIu64 " %9lu %7lu", task->taskid,
    481                     atomic_get(&task->refcount), atomic_get(&task->active_calls));
     583                printf("%-8" PRIu64 " %9" PRIua, task->taskid,
     584                    atomic_get(&task->refcount));
    482585        else
    483586                printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %10p %10p"
     
    489592#ifdef __64_BITS__
    490593        if (*additional)
    491                 printf("%-8" PRIu64 " %9" PRIu64 "%c %9" PRIu64 "%c %9lu %7lu",
    492                     task->taskid, ucycles, usuffix, kcycles, ksuffix,
    493                     atomic_get(&task->refcount), atomic_get(&task->active_calls));
     594                printf("%-8" PRIu64 " %9" PRIu64 "%c %9" PRIu64 "%c "
     595                    "%9" PRIua, task->taskid, ucycles, usuffix, kcycles,
     596                    ksuffix, atomic_get(&task->refcount));
    494597        else
    495598                printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %18p %18p\n",
     
    501604                for (i = 0; i < IPC_MAX_PHONES; i++) {
    502605                        if (task->phones[i].callee)
    503                                 printf(" %" PRIs ":%p", i, task->phones[i].callee);
     606                                printf(" %zu:%p", i, task->phones[i].callee);
    504607                }
    505608                printf("\n");
Note: See TracChangeset for help on using the changeset viewer.