Here is the patch inline. The "15" factor is somewhat arbiratry...

[gnumach]/Changelog
2006-01-09  Samuel Thibault  <[EMAIL PROTECTED]>

        * i386/i386at/model_dep.c(mem_size_init): Limit memory to what gnumach
        is able to use (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.

diff -upr gnumach-20050801/i386/i386at/model_dep.c 
gnumach-mine/i386/i386at/model_dep.c
--- gnumach-20050801/i386/i386at/model_dep.c    2004-11-29 06:34:51.000000000 
+0100
+++ gnumach-mine/i386/i386at/model_dep.c        2006-01-09 00:07:46.000000000 
+0100
@@ -226,6 +226,11 @@ mem_size_init()
                /* This is actually enforced below, in init_alloc_aligned.  */
        }
 
+       /* Reserve 1/16 of memory address space for virtual mappings.
+        * Yes, this looses 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 -upr gnumach-20050801/i386/intel/pmap.c gnumach-mine/i386/intel/pmap.c
--- gnumach-20050801/i386/intel/pmap.c  2001-04-05 08:39:21.000000000 +0200
+++ gnumach-mine/i386/intel/pmap.c      2006-01-09 00:17:26.000000000 +0100
@@ -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();


_______________________________________________
Bug-hurd mailing list
Bug-hurd@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-hurd

Reply via email to