#include <unistd.h>
#include <sys/mman.h>
+#include "boot_info.h"
#include "kmem_alloc.h"
#include "emulation.h"
IMPLEMENT inline
Mword
Kmem::is_ipc_page_fault(Address addr, Mword error)
-{ return addr < mem_user_max && (error & PF_ERR_REMTADDR); }
+{ return addr <= User_max && (error & PF_ERR_REMTADDR); }
IMPLEMENT inline NEEDS ["regdefs.h"]
Mword
Kmem::is_kmem_page_fault(Address addr, Mword error)
-{ return !(addr < mem_user_max && (error & PF_ERR_USERADDR)); }
+{ return !(addr <= User_max && (error & PF_ERR_USERADDR)); }
/**
* Compute physical address from a kernel-virtual address.
kdir = (Pdir*)alloc->alloc(Config::PAGE_SHIFT);
memset (kdir, 0, Config::PAGE_SIZE);
- Pdir::have_superpages(boot_cpu.superpages());
+ Pt_entry::have_superpages(boot_cpu.superpages());
if (boot_cpu.features() & FEAT_PGE)
- {
- Pt_entry::enable_global();
- }
+ Pt_entry::enable_global();
// set up the kernel mapping for physical memory. mark all pages as
// referenced and modified (so when touching the respective pages
// descriptors later.) (2) a one-to-one phys-to-virt mapping in the
// kernel's page directory sometimes comes in handy
kdir->map(0, Virt_addr(Mem_layout::Physmem), Virt_size(Mem_layout::pmem_size),
- Pt_entry::Writable | Pt_entry::Referenced | Pt_entry::global(),
- Pdir::super_level(), pdir_alloc(alloc));
+ Pt_entry::Writable | Pt_entry::Referenced | Pt_entry::global(),
+ Pt_entry::super_level(), false, pdir_alloc(alloc));
// now switch to our new page table
Emulation::set_pdir_addr (Mem_layout::pmem_to_phys (kdir));
{
// can map as 4MB page because the cpu_page will land within a
// 16-bit range from io_bitmap
- *(kdir->walk(Virt_addr(Mem_layout::Io_bitmap - Config::SUPERPAGE_SIZE),
- Pdir::Super_level, pdir_alloc(alloc)).e)
- = (pmem_cpu_page & Config::SUPERPAGE_MASK)
- | Pt_entry::Pse_bit
- | Pt_entry::Writable | Pt_entry::Referenced
- | Pt_entry::Dirty | Pt_entry::global();
+ kdir->walk(Virt_addr(Mem_layout::Io_bitmap - Config::SUPERPAGE_SIZE),
+ Pdir::Super_level, false, pdir_alloc(alloc)).
+ set_page(pmem_cpu_page & Config::SUPERPAGE_MASK,
+ Pt_entry::Pse_bit
+ | Pt_entry::Writable | Pt_entry::Referenced
+ | Pt_entry::Dirty | Pt_entry::global());
cpu_page_vm = (pmem_cpu_page & ~Config::SUPERPAGE_MASK)
- + (Mem_layout::Io_bitmap - Config::SUPERPAGE_SIZE);
+ + (Mem_layout::Io_bitmap - Config::SUPERPAGE_SIZE);
}
else
{
- Pdir::Iter pt = kdir->walk(Virt_addr(Mem_layout::Io_bitmap - Config::PAGE_SIZE), 100, pdir_alloc(alloc));
+ auto pt = kdir->walk(Virt_addr(Mem_layout::Io_bitmap - Config::PAGE_SIZE),
+ Pdir::Depth, false, pdir_alloc(alloc));
- *pt.e = pmem_cpu_page | Pt_entry::Valid | Pt_entry::Writable
- | Pt_entry::Referenced | Pt_entry::Dirty
- | Pt_entry::global();
+ pt.set_page(pmem_cpu_page,
+ Pt_entry::Writable
+ | Pt_entry::Referenced | Pt_entry::Dirty
+ | Pt_entry::global());
cpu_page_vm = Mem_layout::Io_bitmap - Config::PAGE_SIZE;
}
if (mmap ((void *) cpu_page_vm, Config::PAGE_SIZE, PROT_READ
- | PROT_WRITE, MAP_SHARED | MAP_FIXED, Boot_info::fd(), pmem_cpu_page)
+ | PROT_WRITE, MAP_SHARED | MAP_FIXED, Boot_info::fd(), pmem_cpu_page)
== MAP_FAILED)
printf ("CPU page mapping failed: %s\n", strerror (errno));