Author: jhb
Date: Fri Dec 18 20:28:48 2009
New Revision: 200688
URL: http://svn.freebsd.org/changeset/base/200688

Log:
  MFC 200216,200219:
  - Various small whitespace and style fixes.
  - Improve the algorithm the loader uses to choose a memory range for its
    heap when using a range above 1MB.

Modified:
  stable/6/sys/boot/i386/libi386/biosmem.c
  stable/6/sys/boot/i386/libi386/libi386.h
  stable/6/sys/boot/i386/loader/main.c
Directory Properties:
  stable/6/sys/   (props changed)
  stable/6/sys/contrib/pf/   (props changed)
  stable/6/sys/dev/cxgb/   (props changed)

Modified: stable/6/sys/boot/i386/libi386/biosmem.c
==============================================================================
--- stable/6/sys/boot/i386/libi386/biosmem.c    Fri Dec 18 20:28:28 2009        
(r200687)
+++ stable/6/sys/boot/i386/libi386/biosmem.c    Fri Dec 18 20:28:48 2009        
(r200688)
@@ -35,14 +35,20 @@ __FBSDID("$FreeBSD$");
 #include "libi386.h"
 #include "btxv86.h"
 
-vm_offset_t    memtop, memtop_copyin;
-u_int32_t      bios_basemem, bios_extmem;
+vm_offset_t    memtop, memtop_copyin, high_heap_base;
+uint32_t       bios_basemem, bios_extmem, high_heap_size;
 
 static struct bios_smap smap;
 
+/*
+ * The minimum amount of memory to reserve in bios_extmem for the heap.
+ */
+#define        HEAP_MIN        (3 * 1024 * 1024)
+
 void
 bios_getmem(void)
 {
+    uint64_t size;
 
     /* Parse system memory map */
     v86.ebx = 0;
@@ -65,6 +71,26 @@ bios_getmem(void)
        if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base == 0x100000)) {
            bios_extmem = smap.length;
        }
+
+       /*
+        * Look for the largest segment in 'extended' memory beyond
+        * 1MB but below 4GB.
+        */
+       if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base > 0x100000) &&
+           (smap.base < 0x100000000ull)) {
+           size = smap.length;
+
+           /*
+            * If this segment crosses the 4GB boundary, truncate it.
+            */
+           if (smap.base + size > 0x100000000ull)
+               size = 0x100000000ull - smap.base;
+
+           if (size > high_heap_size) {
+               high_heap_size = size;
+               high_heap_base = smap.base;
+           }
+       }
     } while (v86.ebx != 0);
 
     /* Fall back to the old compatibility function for base memory */
@@ -97,5 +123,13 @@ bios_getmem(void)
     /* Set memtop to actual top of memory */
     memtop = memtop_copyin = 0x100000 + bios_extmem;
 
+    /*
+     * If we have extended memory and did not find a suitable heap
+     * region in the SMAP, use the last 3MB of 'extended' memory as a
+     * high heap candidate.
+     */
+    if (bios_extmem >= HEAP_MIN && high_heap_size < HEAP_MIN) {
+       high_heap_size = HEAP_MIN;
+       high_heap_base = memtop - HEAP_MIN;
+    }
 }    
-

Modified: stable/6/sys/boot/i386/libi386/libi386.h
==============================================================================
--- stable/6/sys/boot/i386/libi386/libi386.h    Fri Dec 18 20:28:28 2009        
(r200687)
+++ stable/6/sys/boot/i386/libi386/libi386.h    Fri Dec 18 20:28:48 2009        
(r200688)
@@ -83,9 +83,9 @@ int   bc_add(int biosdev);            /* Register CD
 int    bc_getdev(struct i386_devdesc *dev);    /* return dev_t for (dev) */
 int    bc_bios2unit(int biosdev);      /* xlate BIOS device -> bioscd unit */
 int    bc_unit2bios(int unit);         /* xlate bioscd unit -> BIOS device */
-u_int32_t      bd_getbigeom(int bunit);        /* return geometry in bootinfo 
format */
-int    bd_bios2unit(int biosdev);              /* xlate BIOS device -> 
biosdisk unit */
-int    bd_unit2bios(int unit);                 /* xlate biosdisk unit -> BIOS 
device */
+uint32_t bd_getbigeom(int bunit);      /* return geometry in bootinfo format */
+int    bd_bios2unit(int biosdev);      /* xlate BIOS device -> biosdisk unit */
+int    bd_unit2bios(int unit);         /* xlate biosdisk unit -> BIOS device */
 int    bd_getdev(struct i386_devdesc *dev);    /* return dev_t for (dev) */
 
 ssize_t        i386_copyin(const void *src, vm_offset_t dest, const size_t 
len);
@@ -97,12 +97,15 @@ void        bios_addsmapdata(struct preloaded_f
 void   bios_getsmap(void);
 
 void   bios_getmem(void);
-extern u_int32_t       bios_basemem;                           /* base memory 
in bytes */
-extern u_int32_t       bios_extmem;                            /* extended 
memory in bytes */
+extern uint32_t                bios_basemem;   /* base memory in bytes */
+extern uint32_t                bios_extmem;    /* extended memory in bytes */
 extern vm_offset_t     memtop;         /* last address of physical memory + 1 
*/
 extern vm_offset_t     memtop_copyin;  /* memtop less heap size for the cases 
*/
-                                       /*  when heap is at the top of extended 
memory */
-                                       /*  for other cases - just the same as 
memtop */
+                                       /*  when heap is at the top of         
*/
+                                       /*  extended memory; for other cases   
*/
+                                       /*  just the same as memtop            
*/
+extern uint32_t                high_heap_size; /* extended memory region 
available */
+extern vm_offset_t     high_heap_base; /* for use as the heap */
 
 int biospci_find_devclass(uint32_t class, int index);
 int biospci_write_config(uint32_t locator, int offset, int width, int val);

Modified: stable/6/sys/boot/i386/loader/main.c
==============================================================================
--- stable/6/sys/boot/i386/loader/main.c        Fri Dec 18 20:28:28 2009        
(r200687)
+++ stable/6/sys/boot/i386/loader/main.c        Fri Dec 18 20:28:48 2009        
(r200688)
@@ -97,13 +97,17 @@ main(void)
     bios_getmem();
 
 #if defined(LOADER_BZIP2_SUPPORT) || defined(LOADER_GPT_SUPPORT)
-    heap_top = PTOV(memtop_copyin);
-    memtop_copyin -= 0x300000;
-    heap_bottom = PTOV(memtop_copyin);
-#else
-    heap_top = (void *)bios_basemem;
-    heap_bottom = (void *)end;
+    if (high_heap_size > 0) {
+       heap_top = PTOV(high_heap_base + high_heap_size);
+       heap_bottom = PTOV(high_heap_base);
+       if (high_heap_base < memtop_copyin)
+           memtop_copyin = high_heap_base;
+    } else
 #endif
+    {
+       heap_top = (void *)PTOV(bios_basemem);
+       heap_bottom = (void *)end;
+    }
     setheap(heap_bottom, heap_top);
 
     /* 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to