Changes in kernel/generic/src/ddi/ddi.c [bf9cb2f:8cd680c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ddi/ddi.c
rbf9cb2f r8cd680c 211 211 NO_TRACE static int physmem_unmap(uintptr_t virt) 212 212 { 213 // TODO: implement unmap 214 return EOK; 213 ASSERT(TASK); 214 215 return as_area_destroy(TASK->as, virt); 215 216 } 216 217 … … 255 256 /** Enable range of I/O space for task. 256 257 * 257 * @param id Task ID of the destination task.258 * @param id Task ID of the destination task. 258 259 * @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. 260 261 * 261 262 * @return 0 on success, EPERM if the caller lacks capabilities to use this … … 290 291 int rc = ddi_iospace_enable_arch(task, ioaddr, size); 291 292 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 */ 307 NO_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); 292 334 293 335 return rc; … … 314 356 sysarg_t sys_iospace_disable(ddi_ioarg_t *uspace_io_arg) 315 357 { 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); 318 365 } 319 366
Note:
See TracChangeset
for help on using the changeset viewer.