Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ddi/ddi.c

    r597fa24 r7d83c54  
    5454#include <align.h>
    5555#include <errno.h>
    56 #include <memw.h>
     56#include <mem.h>
    5757#include <trace.h>
    5858#include <bitops.h>
     
    6060
    6161/** This lock protects the @c pareas ordered dictionary. */
    62 static MUTEX_INITIALIZE(pareas_lock, MUTEX_PASSIVE);
     62static mutex_t pareas_lock;
    6363
    6464/** Ordered dictionary of enabled physical memory areas by base address. */
     
    7474{
    7575        odict_initialize(&pareas, pareas_getkey, pareas_cmp);
     76        mutex_initialize(&pareas_lock, MUTEX_PASSIVE);
    7677}
    7778
     
    335336                return EPERM;
    336337
     338        irq_spinlock_lock(&tasks_lock, true);
     339
    337340        task_t *task = task_find_by_id(id);
    338341
    339         if (!task)
     342        if ((!task) || (!container_check(CONTAINER, task->container))) {
     343                /*
     344                 * There is no task with the specified ID
     345                 * or the task belongs to a different security
     346                 * context.
     347                 */
     348                irq_spinlock_unlock(&tasks_lock, true);
    340349                return ENOENT;
    341 
    342         errno_t rc = ENOENT;
    343 
    344         irq_spinlock_lock(&task->lock, true);
    345 
    346         /* Check that the task belongs to the correct security context. */
    347         if (container_check(CONTAINER, task->container))
    348                 rc = ddi_iospace_enable_arch(task, ioaddr, size);
    349 
     350        }
     351
     352        /* Lock the task and release the lock protecting tasks dictionary. */
     353        irq_spinlock_exchange(&tasks_lock, &task->lock);
     354        errno_t rc = ddi_iospace_enable_arch(task, ioaddr, size);
    350355        irq_spinlock_unlock(&task->lock, true);
    351         task_release(task);
     356
    352357        return rc;
    353358}
     
    372377                return EPERM;
    373378
     379        irq_spinlock_lock(&tasks_lock, true);
     380
    374381        task_t *task = task_find_by_id(id);
    375382
    376         if (!task)
     383        if ((!task) || (!container_check(CONTAINER, task->container))) {
     384                /*
     385                 * There is no task with the specified ID
     386                 * or the task belongs to a different security
     387                 * context.
     388                 */
     389                irq_spinlock_unlock(&tasks_lock, true);
    377390                return ENOENT;
    378 
    379         errno_t rc = ENOENT;
    380 
    381         irq_spinlock_lock(&task->lock, true);
    382 
    383         /* Check that the task belongs to the correct security context. */
    384         if (container_check(CONTAINER, task->container))
    385                 rc = ddi_iospace_disable_arch(task, ioaddr, size);
    386 
     391        }
     392
     393        /* Lock the task and release the lock protecting tasks dictionary. */
     394        irq_spinlock_exchange(&tasks_lock, &task->lock);
     395        errno_t rc = ddi_iospace_disable_arch(task, ioaddr, size);
    387396        irq_spinlock_unlock(&task->lock, true);
    388         task_release(task);
     397
    389398        return rc;
    390399}
Note: See TracChangeset for help on using the changeset viewer.