summaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
Diffstat (limited to 'i386')
-rw-r--r--i386/i386at/model_dep.c5
-rw-r--r--i386/intel/pmap.c9
2 files changed, 12 insertions, 2 deletions
diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c
index 8975805..362ba7f 100644
--- a/i386/i386at/model_dep.c
+++ b/i386/i386at/model_dep.c
@@ -207,6 +207,11 @@ mem_size_init()
printf("AT386 boot: physical memory from 0x%x to 0x%x\n",
phys_first_addr, phys_last_addr);
+ /* Reserve 1/16 of the memory address space for virtual mappings.
+ * Yes, this loses memory. Blame i386. */
+ if (phys_last_addr > (VM_MAX_KERNEL_ADDRESS / 16) * 15)
+ phys_last_addr = (VM_MAX_KERNEL_ADDRESS / 16) * 15;
+
phys_first_addr = round_page(phys_first_addr);
phys_last_addr = trunc_page(phys_last_addr);
}
diff --git a/i386/intel/pmap.c b/i386/intel/pmap.c
index fc56e87..540070b 100644
--- a/i386/intel/pmap.c
+++ b/i386/intel/pmap.c
@@ -627,7 +627,12 @@ void pmap_bootstrap()
* and extends to a stupid arbitrary limit beyond that.
*/
kernel_virtual_start = phys_last_addr;
- kernel_virtual_end = phys_last_addr + morevm;
+ kernel_virtual_end = phys_last_addr + morevm
+ + (phys_last_addr - phys_first_addr) / 15;
+
+ if (kernel_virtual_end < phys_last_addr
+ || kernel_virtual_end > VM_MAX_KERNEL_ADDRESS)
+ kernel_virtual_end = VM_MAX_KERNEL_ADDRESS;
/*
* Allocate and clear a kernel page directory.
@@ -656,7 +661,7 @@ void pmap_bootstrap()
* to allocate new kernel page tables later.
* XX fix this
*/
- for (va = phys_first_addr; va < phys_last_addr + morevm; )
+ for (va = phys_first_addr; va < kernel_virtual_end; )
{
pt_entry_t *pde = kernel_page_dir + lin2pdenum(kvtolin(va));
pt_entry_t *ptable = (pt_entry_t*)pmap_grab_page();