summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--kernel/vm.c38
-rw-r--r--kernel/vmtables.c2
2 files changed, 23 insertions, 17 deletions
diff --git a/kernel/vm.c b/kernel/vm.c
index 8b941d0..c9b632d 100644
--- a/kernel/vm.c
+++ b/kernel/vm.c
@@ -353,7 +353,8 @@ pde_t *vm_mkkvm(void)
}
#if TRACING_VM
cio_puts("\nvm_mkkvm() final PD:\n");
- ptdump(pdir, true, 0, N_PDE);
+ ptdump(pdir, true, 0, 16);
+ ptdump(pdir, true, 0x200, 16);
#endif
return pdir;
@@ -595,31 +596,36 @@ int vm_map(pde_t *pdir, void *va, uint32_t pa, uint32_t size, int perm)
(uint32_t)addr, pa, (uint32_t)last, (uint32_t)pte, *pte);
#endif
+ // create the new entry
+ pde_t entry = pa | perm | PTE_P;
+
// if this entry has already been mapped, we're in trouble
if (IS_PRESENT(*pte)) {
+ if (*pte != entry) {
#if TRACING_VM
- cio_puts(" ALREADY MAPPED?");
- cio_printf(" PDIX 0x%x PTIX 0x%x\n", PDIX(addr), PTIX(addr));
+ cio_puts(" ALREADY MAPPED?");
+ cio_printf(" PDIX 0x%x PTIX 0x%x\n", PDIX(addr), PTIX(addr));
- // dump the directory
- ptdump(pdir, true, 0, N_PDE);
+ // dump the directory
+ ptdump(pdir, true, 0, N_PDE);
- // find the relevant PDE entry
- uint32_t ix = PDIX(va);
- pde_t entry = pdir[ix];
- if (!IS_LARGE(entry)) {
- // round the PMT index down
- uint32_t ix2 = PTIX(va) & MOD4_MASK;
- // dump the PMT for the relevant directory entry
- ptdump((void *)P2V(PDE_ADDR(entry)), false, ix2, 8);
- }
+ // find the relevant PDE entry
+ uint32_t ix = PDIX(va);
+ pde_t entry = pdir[ix];
+ if (!IS_LARGE(entry)) {
+ // round the PMT index down
+ uint32_t ix2 = PTIX(va) & MOD4_MASK;
+ // dump the PMT for the relevant directory entry
+ ptdump((void *)P2V(PDE_ADDR(entry)), false, ix2, 8);
+ }
#endif
- PANIC(0, "mapping an already-mapped address");
+ PANIC(0, "mapping an already-mapped address");
+ }
}
// ok, set the PTE as requested
- *pte = pa | perm | PTE_P;
+ *pte = entry;
// nope - move to the next page
addr += SZ_PAGE;
diff --git a/kernel/vmtables.c b/kernel/vmtables.c
index 42bc1ef..ab398f0 100644
--- a/kernel/vmtables.c
+++ b/kernel/vmtables.c
@@ -371,7 +371,7 @@ const pte_t id_map[N_PTE] = {
const mapping_t kmap[] = {
// va pa_start pa_end perms
{ KERN_BASE, 0, EXT_BASE, PDE_RW },
- { KERN_VLINK, KERN_PLINK, V2P(_data), 0 },
+ { KERN_VLINK, KERN_PLINK, V2P(_data), PDE_RW },
{ (uint32_t)_data, V2P(_data), KERN_BASE, PDE_RW },
{ DEV_BASE, DEV_BASE, 0, PDE_RW }
};