Changes in kernel/generic/src/ddi/ddi.c [f72906c:8cd680c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ddi/ddi.c
rf72906c r8cd680c 121 121 backend_data.base = phys; 122 122 backend_data.frames = pages; 123 backend_data.anonymous = false; 123 124 124 125 /* … … 210 211 NO_TRACE static int physmem_unmap(uintptr_t virt) 211 212 { 212 // TODO: implement unmap 213 return EOK; 213 ASSERT(TASK); 214 215 return as_area_destroy(TASK->as, virt); 214 216 } 215 217 … … 228 230 void *virt_ptr, uintptr_t bound) 229 231 { 230 uintptr_t virt = (uintptr_t) -1; 231 int rc = physmem_map(ALIGN_DOWN(phys, FRAME_SIZE), pages, flags, 232 &virt, bound); 232 uintptr_t virt; 233 int rc = copy_from_uspace(&virt, virt_ptr, sizeof(virt)); 234 if (rc != EOK) 235 return rc; 236 237 rc = physmem_map(ALIGN_DOWN(phys, FRAME_SIZE), pages, flags, &virt, 238 bound); 233 239 if (rc != EOK) 234 240 return rc; … … 250 256 /** Enable range of I/O space for task. 251 257 * 252 * @param id Task ID of the destination task.258 * @param id Task ID of the destination task. 253 259 * @param ioaddr Starting I/O address. 254 * @param size Size of the enabled I/O space..260 * @param size Size of the enabled I/O space. 255 261 * 256 262 * @return 0 on success, EPERM if the caller lacks capabilities to use this … … 285 291 int rc = ddi_iospace_enable_arch(task, ioaddr, size); 286 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); 287 334 288 335 return rc; … … 309 356 sysarg_t sys_iospace_disable(ddi_ioarg_t *uspace_io_arg) 310 357 { 311 // TODO: implement 312 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); 313 365 } 314 366 … … 329 381 330 382 size_t frames = SIZE2FRAMES(size); 331 *phys = frame_alloc(frames, FRAME_ NO_RESERVE, constraint);383 *phys = frame_alloc(frames, FRAME_ATOMIC, constraint); 332 384 if (*phys == 0) 333 385 return ENOMEM; … … 336 388 backend_data.base = *phys; 337 389 backend_data.frames = frames; 390 backend_data.anonymous = true; 338 391 339 392 if (!as_area_create(TASK->as, map_flags, size, 340 393 AS_AREA_ATTR_NONE, &phys_backend, &backend_data, virt, bound)) { 341 frame_free _noreserve(*phys, frames);394 frame_free(*phys, frames); 342 395 return ENOMEM; 343 396 } … … 354 407 NO_TRACE static int dmamem_unmap_anonymous(uintptr_t virt) 355 408 { 356 // TODO: implement unlocking & unmap 357 return EOK; 409 return as_area_destroy(TASK->as, virt); 358 410 } 359 411 … … 389 441 return rc; 390 442 443 uintptr_t virt; 444 rc = copy_from_uspace(&virt, virt_ptr, sizeof(virt)); 445 if (rc != EOK) 446 return rc; 447 391 448 uintptr_t phys; 392 uintptr_t virt = (uintptr_t) -1;393 449 rc = dmamem_map_anonymous(size, constraint, map_flags, flags, 394 450 &phys, &virt, bound);
Note:
See TracChangeset
for help on using the changeset viewer.