Ignore:
File:
1 edited

Legend:

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

    rba2be23 r3772af6  
    314314
    315315NO_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)
    317317{
    318318        ASSERT(TASK);
     
    323323
    324324NO_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)
    326326{
    327327        ASSERT(TASK);
    328328       
    329         size_t frames = SIZE2FRAMES(size);
     329        size_t pages = SIZE2FRAMES(size);
    330330        uint8_t order;
    331331       
    332         /* We need the 2^order >= frames */
    333         if (frames == 1)
     332        /* We need the 2^order >= pages */
     333        if (pages == 1)
    334334                order = 0;
    335335        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)
    340340                return ENOMEM;
    341341       
    342342        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;
    345345       
    346346        if (!as_area_create(TASK->as, map_flags, size,
    347347            AS_AREA_ATTR_NONE, &phys_backend, &backend_data, virt, bound)) {
    348                 frame_free_noreserve(*phys);
     348                frame_free_noreserve((uintptr_t) *phys);
    349349                return ENOMEM;
    350350        }
     
    361361NO_TRACE static int dmamem_unmap_anonymous(uintptr_t virt)
    362362{
    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);
    365379}
    366380
     
    373387                 */
    374388               
    375                 uintptr_t phys;
     389                void *phys;
    376390                int rc = dmamem_map((uintptr_t) virt_ptr, size, map_flags,
    377391                    flags, &phys);
     
    390404                 */
    391405               
    392                 uintptr_t phys;
     406                void *phys;
    393407                uintptr_t virt = (uintptr_t) -1;
    394408                int rc = dmamem_map_anonymous(size, map_flags, flags,
Note: See TracChangeset for help on using the changeset viewer.