diff options
author | Thomas Schwinge <tschwinge@gnu.org> | 2006-05-08 22:04:40 +0000 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gnu.org> | 2009-06-18 00:26:37 +0200 |
commit | 30a908607bd75f39b1c56f8a3c73bb7f5f19c8a9 (patch) | |
tree | 3241782254a942096b8f8cb02f431a68de369369 /i386 | |
parent | 1ca2a1632d7325ee26b2c701b38c1d2e2fcb6f80 (diff) | |
download | gnumach-30a908607bd75f39b1c56f8a3c73bb7f5f19c8a9.tar.gz gnumach-30a908607bd75f39b1c56f8a3c73bb7f5f19c8a9.tar.bz2 gnumach-30a908607bd75f39b1c56f8a3c73bb7f5f19c8a9.zip |
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.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 8975805c..362ba7fa 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 fc56e873..540070b9 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(); |