[kernel][vm] Add vmm_free_region and kvaddr_to_paddr

Change-Id: Ieb7a11dcd6d7cd96bfef252b41cc7ccdd4892b8f
This commit is contained in:
Michael Ryleev
2014-10-13 17:31:26 -07:00
parent 49638fbf32
commit ecca4f4aa0
3 changed files with 58 additions and 0 deletions

View File

@@ -504,6 +504,46 @@ err:
return err;
}
static vmm_region_t *vmm_find_region(const vmm_aspace_t *aspace, vaddr_t vaddr)
{
vmm_region_t *r;
DEBUG_ASSERT(aspace);
if (!aspace)
return NULL;
/* search the region list */
list_for_every_entry(&aspace->region_list, r, vmm_region_t, node) {
if ((vaddr >= r->base) && (vaddr < r->base + r->size))
return r;
}
return NULL;
}
status_t vmm_free_region(vmm_aspace_t *aspace, vaddr_t vaddr)
{
vmm_region_t *r = vmm_find_region (aspace, vaddr);
if (!r) {
return ERR_NOT_FOUND;
}
/* remove it from aspace */
list_delete(&r->node);
/* unmap it */
arch_mmu_unmap(r->base, r->size / PAGE_SIZE);
/* return physical pages if any */
pmm_free (&r->page_list);
/* free it */
free (r);
return NO_ERROR;
}
static void dump_region(const vmm_region_t *r)
{
printf("\tregion %p: name '%s' range 0x%lx - 0x%lx size 0x%zx flags 0x%x mmu_flags 0x%x\n",