/** * Maps a page table into the root servers page directory * @param vaddr The virtual address of the mapping * @return 0 on success */ static int _map_page_table(addrspace_t *as, seL4_ARM_PageDirectory pd, seL4_Word vpage) { seL4_Word pt_addr; seL4_ARM_PageTable pt_cap; int err; /* Allocate a PT object */ pt_addr = ut_alloc(seL4_PageTableBits); if(pt_addr == 0) { return ENOMEM; } /* Create the frame cap */ err = cspace_ut_retype_addr(pt_addr, seL4_ARM_PageTableObject, seL4_PageTableBits, cur_cspace, &pt_cap); if(err) { ut_free(pt_addr, seL4_PageTableBits); return EFAULT; } /* Tell seL4 to map the PT in for us */ err = seL4_ARM_PageTable_Map(pt_cap, pd, vpage, seL4_ARM_Default_VMAttributes); if (err) { ut_free(pt_addr, seL4_PageTableBits); cspace_delete_cap(cur_cspace, pt_cap); return EFAULT; } _insert_pt(as, pt_cap, pt_addr); return 0; }
static int _dma_morecore(size_t min_size, int cached, struct dma_mem_descriptor* dma_desc) { static uint32_t _vaddr = DMA_VSTART; struct seL4_ARM_Page_GetAddress getaddr_ret; seL4_CPtr frame; seL4_CPtr pd; vka_t* vka; int err; pd = simple_get_pd(&_simple); vka = &_vka; /* Create a frame */ frame = vka_alloc_frame_leaky(vka, 12); assert(frame); if (!frame) { return -1; } /* Try to map the page */ err = seL4_ARM_Page_Map(frame, pd, _vaddr, seL4_AllRights, 0); if (err) { seL4_CPtr pt; /* Allocate a page table */ pt = vka_alloc_page_table_leaky(vka); if (!pt) { printf("Failed to create page table\n"); return -1; } /* Map the page table */ err = seL4_ARM_PageTable_Map(pt, pd, _vaddr, 0); if (err) { printf("Failed to map page table\n"); return -1; } /* Try to map the page again */ err = seL4_ARM_Page_Map(frame, pd, _vaddr, seL4_AllRights, 0); if (err) { printf("Failed to map page\n"); return -1; } } /* Find the physical address of the page */ getaddr_ret = seL4_ARM_Page_GetAddress(frame); assert(!getaddr_ret.error); /* Setup dma memory description */ dma_desc->vaddr = _vaddr; dma_desc->paddr = getaddr_ret.paddr; dma_desc->cached = 0; dma_desc->size_bits = 12; dma_desc->alloc_cookie = (void*)frame; dma_desc->cookie = NULL; /* Advance the virtual address marker */ _vaddr += BIT(12); return 0; }