1 //---------------------------------------------------------------------------
7 #include "kmem_alloc.h"
12 #include "ram_quota.h"
13 #include "static_init.h"
21 void *Vmem_alloc::page_alloc(void *address, Zero_fill zf, unsigned mode)
23 void *vpage = Kmem_alloc::allocator()->alloc(Config::PAGE_SHIFT);
25 if (EXPECT_FALSE(!vpage))
28 Address page = Mem_space::kernel_space()->virt_to_phys((Address)vpage);
29 //printf(" allocated page (virt=%p, phys=%08lx\n", vpage, page);
30 Mem_unit::inv_dcache(vpage, ((char*)vpage) + Config::PAGE_SIZE);
32 // insert page into master page table
33 auto pte = Mem_space::kernel_space()->dir()->walk(Virt_addr(address),
34 Pdir::Depth, true, Kmem_alloc::q_allocator(Ram_quota::root));
36 Page::Rights r = Page::Rights::RWX();
38 r |= Page::Rights::U();
40 pte.create_page(Phys_mem_addr(page), Page::Attr(r, Page::Type::Normal(), Page::Kern::Global()));
41 pte.write_back_if(true, Mem_unit::Asid_kernel);
42 Mem_unit::dtlb_flush(address);
45 Mem::memset_mwords((unsigned long *)address, 0, Config::PAGE_SIZE >> 2);