7 EXTENSION class Mem_space
10 Status v_insert_cache(Pte_base *e, Address virt, size_t size, unsigned page_attribs,
12 unsigned long v_delete_cache(Pt_entry *e, unsigned page_attribs);
16 //------------------------------------------------------------------------------
17 IMPLEMENTATION[ppc32]:
21 Mem_space::v_insert_cache(Pte_base *e, Address virt, size_t size,
22 unsigned page_attribs, Dir_type *dir = 0)
26 Pdir::Iter i = dir->alloc_cast<Mem_space_q_alloc>()
27 ->walk(Addr(virt), Pdir::Depth,
28 Mem_space_q_alloc(_quota, Mapped_allocator::allocator()));
30 if (EXPECT_FALSE(!i.e->valid() && i.shift() != Config::PAGE_SHIFT))
31 return Insert_err_nomem;
35 //get physical addresses
36 Pte_htab::pte_lookup(i.e, &i_phys);
38 if(i.e->valid() && e->addr() == i_phys)
40 Status state = pte_attrib_upgrade(i.e, size, page_attribs);
44 *i.e = e->raw() | page_attribs;
46 //if super-page, set Pse_bit in Pdir
47 if(size == Config::SUPERPAGE_SIZE)
49 i = dir->walk(Addr(virt), Pdir::Super_level);
50 *i.e = i.e->raw() | Pte_base::Pse_bit;
58 Mem_space::v_delete_cache(Pt_entry *e, unsigned page_attribs = Page_all_attribs)
62 ret = e->raw() & page_attribs;
64 if (!(page_attribs & Page_user_accessible))
65 // downgrade PDE (superpage) rights
66 e->del_attr(page_attribs);
68 // delete PDE (superpage)