MFi386: revision 200219

Improve the algorithm the loader uses to choose a memory range for its
  heap when using a range above 1MB.

MFC after:	1 week
This commit is contained in:
nyan 2009-12-08 13:06:35 +00:00
parent 8deeaefd93
commit befb051a26
2 changed files with 25 additions and 8 deletions

View File

@ -34,8 +34,13 @@ __FBSDID("$FreeBSD$");
#include "libi386.h"
#include "btxv86.h"
vm_offset_t memtop, memtop_copyin;
uint32_t bios_basemem, bios_extmem;
vm_offset_t memtop, memtop_copyin, high_heap_base;
uint32_t bios_basemem, bios_extmem, high_heap_size;
/*
* The minimum amount of memory to reserve in bios_extmem for the heap.
*/
#define HEAP_MIN (3 * 1024 * 1024)
void
bios_getmem(void)
@ -48,4 +53,12 @@ bios_getmem(void)
/* Set memtop to actual top of memory */
memtop = memtop_copyin = 0x100000 + bios_extmem;
/*
* If we have extended memory, use the last 3MB of 'extended' memory
* as a high heap candidate.
*/
if (bios_extmem >= HEAP_MIN) {
high_heap_size = HEAP_MIN;
high_heap_base = memtop - HEAP_MIN;
}
}

View File

@ -97,13 +97,17 @@ main(void)
bios_getmem();
#if defined(LOADER_BZIP2_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);
/*