Changes in kernel/generic/src/ddi/ddi.c [ba2be23:3772af6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ddi/ddi.c
rba2be23 r3772af6 314 314 315 315 NO_TRACE static int dmamem_map(uintptr_t virt, size_t size, unsigned int map_flags, 316 unsigned int flags, uintptr_t*phys)316 unsigned int flags, void **phys) 317 317 { 318 318 ASSERT(TASK); … … 323 323 324 324 NO_TRACE static int dmamem_map_anonymous(size_t size, unsigned int map_flags, 325 unsigned int flags, uintptr_t*phys, uintptr_t *virt, uintptr_t bound)325 unsigned int flags, void **phys, uintptr_t *virt, uintptr_t bound) 326 326 { 327 327 ASSERT(TASK); 328 328 329 size_t frames = SIZE2FRAMES(size);329 size_t pages = SIZE2FRAMES(size); 330 330 uint8_t order; 331 331 332 /* We need the 2^order >= frames */333 if ( frames == 1)332 /* We need the 2^order >= pages */ 333 if (pages == 1) 334 334 order = 0; 335 335 else 336 order = fnzb( frames - 1) + 1;337 338 *phys = frame_alloc_noreserve(order, 0 , 0);339 if (*phys == 0)336 order = fnzb(pages - 1) + 1; 337 338 *phys = frame_alloc_noreserve(order, 0); 339 if (*phys == NULL) 340 340 return ENOMEM; 341 341 342 342 mem_backend_data_t backend_data; 343 backend_data.base = *phys;344 backend_data.frames = frames;343 backend_data.base = (uintptr_t) *phys; 344 backend_data.frames = pages; 345 345 346 346 if (!as_area_create(TASK->as, map_flags, size, 347 347 AS_AREA_ATTR_NONE, &phys_backend, &backend_data, virt, bound)) { 348 frame_free_noreserve( *phys);348 frame_free_noreserve((uintptr_t) *phys); 349 349 return ENOMEM; 350 350 } … … 361 361 NO_TRACE static int dmamem_unmap_anonymous(uintptr_t virt) 362 362 { 363 // TODO: implement unlocking & unmap 364 return EOK; 363 // TODO: This is an ugly hack 364 as_t *as = TASK->as; 365 366 mutex_lock(&as->lock); 367 as_area_t *area = find_locked_area(as, virt); 368 if (!area) { 369 mutex_unlock(&as->lock); 370 return ENOENT; 371 } 372 frame_free_noreserve(area->backend_data.base); 373 area->backend_data.base = 0; 374 area->backend_data.frames = 0; 375 mutex_unlock(&area->lock); 376 mutex_unlock(&as->lock); 377 378 return as_area_destroy(as, virt); 365 379 } 366 380 … … 373 387 */ 374 388 375 uintptr_tphys;389 void *phys; 376 390 int rc = dmamem_map((uintptr_t) virt_ptr, size, map_flags, 377 391 flags, &phys); … … 390 404 */ 391 405 392 uintptr_tphys;406 void *phys; 393 407 uintptr_t virt = (uintptr_t) -1; 394 408 int rc = dmamem_map_anonymous(size, map_flags, flags,
Note:
See TracChangeset
for help on using the changeset viewer.