Ignore:
File:
1 edited

Legend:

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

    rbf9cb2f r8cd680c  
    211211NO_TRACE static int physmem_unmap(uintptr_t virt)
    212212{
    213         // TODO: implement unmap
    214         return EOK;
     213        ASSERT(TASK);
     214
     215        return as_area_destroy(TASK->as, virt);
    215216}
    216217
     
    255256/** Enable range of I/O space for task.
    256257 *
    257  * @param id Task ID of the destination task.
     258 * @param id     Task ID of the destination task.
    258259 * @param ioaddr Starting I/O address.
    259  * @param size Size of the enabled I/O space..
     260 * @param size   Size of the enabled I/O space.
    260261 *
    261262 * @return 0 on success, EPERM if the caller lacks capabilities to use this
     
    290291        int rc = ddi_iospace_enable_arch(task, ioaddr, size);
    291292        irq_spinlock_unlock(&task->lock, true);
     293
     294        return rc;
     295}
     296
     297/** Disable range of I/O space for task.
     298 *
     299 * @param id     Task ID of the destination task.
     300 * @param ioaddr Starting I/O address.
     301 * @param size   Size of the enabled I/O space.
     302 *
     303 * @return 0 on success, EPERM if the caller lacks capabilities to use this
     304 *           syscall, ENOENT if there is no task matching the specified ID.
     305 *
     306 */
     307NO_TRACE static int iospace_disable(task_id_t id, uintptr_t ioaddr, size_t size)
     308{
     309        /*
     310         * Make sure the caller is authorised to make this syscall.
     311         */
     312        cap_t caps = cap_get(TASK);
     313        if (!(caps & CAP_IO_MANAGER))
     314                return EPERM;
     315       
     316        irq_spinlock_lock(&tasks_lock, true);
     317       
     318        task_t *task = task_find_by_id(id);
     319       
     320        if ((!task) || (!container_check(CONTAINER, task->container))) {
     321                /*
     322                 * There is no task with the specified ID
     323                 * or the task belongs to a different security
     324                 * context.
     325                 */
     326                irq_spinlock_unlock(&tasks_lock, true);
     327                return ENOENT;
     328        }
     329       
     330        /* Lock the task and release the lock protecting tasks_btree. */
     331        irq_spinlock_exchange(&tasks_lock, &task->lock);
     332        int rc = ddi_iospace_disable_arch(task, ioaddr, size);
     333        irq_spinlock_unlock(&task->lock, true);
    292334       
    293335        return rc;
     
    314356sysarg_t sys_iospace_disable(ddi_ioarg_t *uspace_io_arg)
    315357{
    316         // TODO: implement
    317         return ENOTSUP;
     358        ddi_ioarg_t arg;
     359        int rc = copy_from_uspace(&arg, uspace_io_arg, sizeof(ddi_ioarg_t));
     360        if (rc != 0)
     361                return (sysarg_t) rc;
     362
     363        return (sysarg_t) iospace_disable((task_id_t) arg.task_id,
     364            (uintptr_t) arg.ioaddr, (size_t) arg.size);
    318365}
    319366
Note: See TracChangeset for help on using the changeset viewer.