1 //---------------------------------------------------------------------------
6 #include "kmem_space.h"
7 #include "mapped_alloc.h"
12 #include "ram_quota.h"
13 #include "static_init.h"
21 void Vmem_alloc::init()
23 // Allocate a generic zero page
24 printf("Vmem_alloc::init()\n");
26 if(Config::VMEM_ALLOC_TEST)
28 printf("Vmem_alloc::TEST\n");
30 printf(" allocate zero-filled page...");
31 void *p = page_alloc((void*)(0xefc01000), ZERO_FILL );
32 printf(" [%p] done\n",p);
33 printf(" free zero-filled page...");
37 printf(" allocate no-zero-filled page...");
38 p = page_alloc((void*)(0xefc02000), NO_ZERO_FILL );
39 printf(" [%p] done\n",p);
40 printf(" free no-zero-filled page...");
47 void *Vmem_alloc::page_alloc(void *address, Zero_fill zf, unsigned mode)
52 vpage = Mapped_allocator::allocator()->alloc(Config::PAGE_SHIFT);
54 if (EXPECT_FALSE(!vpage))
57 page = Kmem_space::kdir()->walk(vpage, 0, false, 0).phys(vpage);
58 //printf(" allocated page (virt=%p, phys=%08lx\n", vpage, page);
59 Mem_unit::inv_dcache(vpage, ((char*)vpage) + Config::PAGE_SIZE);
61 // insert page into master page table
62 Pte pte = Kmem_space::kdir()->walk(address, Config::PAGE_SIZE, true,
65 unsigned long pa = Page::CACHEABLE;
71 pte.set(page, Config::PAGE_SIZE, Mem_page_attr(pa), true);
73 Mem_unit::dtlb_flush(address);
76 Mem::memset_mwords((unsigned long *)address, 0, Config::PAGE_SIZE >> 2);
82 void Vmem_alloc::page_free(void *page)
84 Pte pte = Kmem_space::kdir()->walk(page, 0, false,0);
88 // Invalidate the page because we remove this alias and use the
89 // mapped_allocator mapping from now on.
90 // Write back is not needed here, because we free the page.
91 Mem_unit::inv_vdcache(page, ((char*)page) + Config::PAGE_SIZE);
93 Address phys = pte.phys(page);
94 pte.set_invalid(0, true);
95 Mem_unit::dtlb_flush(page);
97 Mapped_allocator::allocator()->free_phys(Config::PAGE_SHIFT, phys);
101 void *Vmem_alloc::page_unmap(void *page)
103 Pte pte = Kmem_space::kdir()->walk(page, 0, false,0);
107 Mem_unit::inv_dcache(page, ((char*)page) + Config::PAGE_SIZE);
109 Address phys = pte.phys(page);
110 pte.set_invalid(0, true);
111 Mem_unit::dtlb_flush(page);
113 return (void*)Mem_layout::phys_to_pmem(phys);