diff options
author | hpa <hpa> | 2001-12-11 01:20:33 +0000 |
---|---|---|
committer | hpa <hpa> | 2001-12-11 01:20:33 +0000 |
commit | 7de02ddf8887f37a5e3c0f810cbf45ac7029c165 (patch) | |
tree | d3c58b134dee7e2a5542bef8ce271a00f589a420 | |
parent | 0d064db972a8bdff2e508a56f07e533348b84017 (diff) | |
download | syslinux-7de02ddf8887f37a5e3c0f810cbf45ac7029c165.tar.gz |
Don't initialize the E820 map statically -- it's too big
-rw-r--r-- | memdisk/e820.h | 1 | ||||
-rw-r--r-- | memdisk/e820func.c | 13 | ||||
-rw-r--r-- | memdisk/setup.c | 12 |
3 files changed, 19 insertions, 7 deletions
diff --git a/memdisk/e820.h b/memdisk/e820.h index 7f064c43..77dae74e 100644 --- a/memdisk/e820.h +++ b/memdisk/e820.h @@ -28,6 +28,7 @@ extern struct e820range ranges[]; extern int nranges; extern uint32_t dos_mem, low_mem, high_mem; +extern void e820map_init(void); extern void insertrange(uint64_t, uint64_t, uint32_t); extern void get_mem(void); extern void parse_mem(void); diff --git a/memdisk/e820func.c b/memdisk/e820func.c index 72e1bf80..d9c8465a 100644 --- a/memdisk/e820func.c +++ b/memdisk/e820func.c @@ -22,8 +22,17 @@ #define MAXRANGES 64 /* All of memory starts out as one range of "indeterminate" type */ -struct e820range ranges[MAXRANGES] = { { 0ULL, 0 }, { 0ULL, (uint32_t)-1 } }; -int nranges = 1; +struct e820range ranges[MAXRANGES]; +int nranges; + + +void e820map_init(void) +{ + nranges = 1; + asm volatile("cld ; rep ; stosl %0,%%es:(%1)" + :: "a" (0), "S" (ranges), "c" (sizeof(ranges) >> 2)); + ranges[1].type = -1; +} static void insertrange_at(int where, uint64_t start, uint32_t type) { diff --git a/memdisk/setup.c b/memdisk/setup.c index 196f33bb..a2e71fba 100644 --- a/memdisk/setup.c +++ b/memdisk/setup.c @@ -213,13 +213,11 @@ uint32_t setup(void) printf("Ramdisk at 0x%08x, length 0x%08x\n", shdr->ramdisk_image, shdr->ramdisk_size); - /* Reserve the ramdisk memory */ - insertrange(shdr->ramdisk_image, shdr->ramdisk_size, 2); - geometry = get_disk_image_geometry(shdr->ramdisk_image, shdr->ramdisk_size); - get_mem(); - parse_mem(); + e820map_init(); /* Initialize memory data structure */ + get_mem(); /* Query BIOS for memory map */ + parse_mem(); /* Parse memory map */ printf("dos_mem = %#10x (%u K)\n" "low_mem = %#10x (%u K)\n" @@ -228,6 +226,10 @@ uint32_t setup(void) low_mem, low_mem >> 10, high_mem, high_mem >> 10); + /* Reserve the ramdisk memory */ + insertrange(shdr->ramdisk_image, shdr->ramdisk_size, 2); + parse_mem(); /* Recompute variables */ + /* Figure out where it needs to go */ hptr = (struct memdisk_header *) &_binary_memdisk_bin_start; pptr = (struct patch_area *)(_binary_memdisk_bin_start + hptr->patch_offs); |