]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/arm/kmem.cpp
update
[l4.git] / kernel / fiasco / src / kern / arm / kmem.cpp
1 INTERFACE [arm]:
2
3 #include "kip.h"
4 #include "mem_layout.h"
5
6 class Kmem : public Mem_layout
7 {
8 public:
9
10   static Mword is_kmem_page_fault(Mword pfa, Mword error);
11   static Mword is_ipc_page_fault(Mword pfa, Mword error);
12   static Mword is_io_bitmap_page_fault(Mword pfa);
13 };
14
15 //---------------------------------------------------------------------------
16 IMPLEMENTATION [arm]:
17
18 #include "mem_unit.h"
19 #include "kmem_space.h"
20 #include "paging.h"
21 #include <cassert>
22
23 IMPLEMENT inline
24 Mword Kmem::is_kmem_page_fault(Mword pfa, Mword)
25 {
26   return in_kernel(pfa);
27 }
28
29 IMPLEMENT inline
30 Mword Kmem::is_io_bitmap_page_fault(Mword)
31 {
32   return 0;
33 }
34
35 PUBLIC static
36 Address
37 Kmem::mmio_remap(Address phys)
38 {
39   static Address ndev = 0;
40   Address v = phys_to_pmem(phys);
41   if (v != ~0UL)
42     return v;
43
44   Address dm = Mem_layout::Registers_map_start + ndev;
45   assert(dm < Mem_layout::Registers_map_end);
46
47   ndev += Config::SUPERPAGE_SIZE;
48
49   auto m = Kmem_space::kdir()->walk(Virt_addr(dm), Pte_ptr::Super_level);
50   assert (!m.is_valid());
51   assert (m.page_order() == Config::SUPERPAGE_SHIFT);
52   Address phys_page = cxx::mask_lsb(phys, Config::SUPERPAGE_SHIFT);
53   m.create_page(Phys_mem_addr(phys_page), Page::Attr(Page::Rights::RWX(), Page::Type::Uncached(),
54                 Page::Kern::Global()));
55
56   m.write_back_if(true, Mem_unit::Asid_kernel);
57   add_pmem(phys_page, dm, Config::SUPERPAGE_SIZE);
58
59   return phys_to_pmem(phys);
60 }