bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bug #7118] GNU Mach can't handle 1G memory


From: Samuel Thibault
Subject: Re: [bug #7118] GNU Mach can't handle 1G memory
Date: Mon, 9 Jan 2006 00:43:50 +0100
User-agent: Mutt/1.5.9i-nntp

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

[gnumach]/Changelog
2006-01-09  Samuel Thibault  <samuel.thibault@ens-lyon.org>

        * 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();




reply via email to

[Prev in Thread] Current Thread [Next in Thread]