summaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
authorThomas Schwinge <tschwinge@gnu.org>2006-05-08 22:04:40 +0000
committerThomas Schwinge <tschwinge@gnu.org>2009-06-18 00:26:37 +0200
commit30a908607bd75f39b1c56f8a3c73bb7f5f19c8a9 (patch)
tree3241782254a942096b8f8cb02f431a68de369369 /i386
parent1ca2a1632d7325ee26b2c701b38c1d2e2fcb6f80 (diff)
2006-05-08 Thomas Schwinge <tschwinge@gnu.org>
* DEVELOPMENT: Document Samuel's patch. 2006-05-08 Samuel Thibault <samuel.thibault@ens-lyon.org> * i386/i386at/model_dep.c (mem_size_init): Limit memory to what can actually be used (minus a little extra for virtual mappings). * i386/intel/pmap.c (pmap_bootstrap): Extend the virtual mapping area according to memory size for at least being able to manage it. But look out for wrap and limit it to kernel adresses. Remove duplicate computing.
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();