4 #include "mem_layout.h"
6 class Kmem : public Mem_layout
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);
15 //---------------------------------------------------------------------------
19 #include "kmem_space.h"
24 Mword Kmem::is_kmem_page_fault(Mword pfa, Mword)
26 return in_kernel(pfa);
30 Mword Kmem::is_io_bitmap_page_fault(Mword)
37 Kmem::mmio_remap(Address phys)
39 static Address ndev = 0;
40 Address v = phys_to_pmem(phys);
44 Address dm = Mem_layout::Registers_map_start + ndev;
45 assert(dm < Mem_layout::Registers_map_end);
47 ndev += Config::SUPERPAGE_SIZE;
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()));
56 m.write_back_if(true, Mem_unit::Asid_kernel);
57 add_pmem(phys_page, dm, Config::SUPERPAGE_SIZE);
59 return phys_to_pmem(phys);