]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ppc32/mem_space-cache.cpp
Inital import
[l4.git] / kernel / fiasco / src / kern / ppc32 / mem_space-cache.cpp
1 /*
2  * PPC page cache
3  */
4 INTERFACE[ppc32]:
5
6
7 EXTENSION class Mem_space
8 {
9 private:
10   Status v_insert_cache(Pte_base *e, Address virt, size_t size, unsigned page_attribs,
11                         Dir_type *dir = 0);
12   unsigned long v_delete_cache(Pt_entry *e, unsigned page_attribs);
13 };
14
15
16 //------------------------------------------------------------------------------
17 IMPLEMENTATION[ppc32]:
18
19 IMPLEMENT
20 Mem_space::Status
21 Mem_space::v_insert_cache(Pte_base *e, Address virt, size_t size,
22                           unsigned page_attribs, Dir_type *dir = 0)
23 {
24   if(!dir) dir = _dir;
25
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()));
29
30   if (EXPECT_FALSE(!i.e->valid() && i.shift() != Config::PAGE_SHIFT))
31     return Insert_err_nomem;
32
33   Address i_phys;
34
35   //get physical addresses
36   Pte_htab::pte_lookup(i.e, &i_phys);
37
38   if(i.e->valid() && e->addr() == i_phys)
39     {
40       Status state = pte_attrib_upgrade(i.e, size, page_attribs);
41       return state;
42     }
43
44   *i.e = e->raw() | page_attribs;
45
46   //if super-page, set Pse_bit in Pdir
47   if(size == Config::SUPERPAGE_SIZE)
48     {
49       i = dir->walk(Addr(virt), Pdir::Super_level);
50       *i.e = i.e->raw() | Pte_base::Pse_bit;
51     }
52
53   return Insert_ok;
54 }
55
56 IMPLEMENT
57 unsigned long
58 Mem_space::v_delete_cache(Pt_entry *e, unsigned page_attribs = Page_all_attribs)
59 {
60   unsigned ret;
61
62   ret = e->raw() & page_attribs;
63
64   if (!(page_attribs & Page_user_accessible))
65     // downgrade PDE (superpage) rights
66     e->del_attr(page_attribs);
67   else
68     // delete PDE (superpage)
69     e = 0;
70
71   return ret;
72 }