diff options
Diffstat (limited to 'i386')
-rw-r--r-- | i386/i386at/model_dep.c | 5 | ||||
-rw-r--r-- | i386/intel/pmap.c | 9 |
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(); |