summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhpa <hpa>2001-12-11 01:20:33 +0000
committerhpa <hpa>2001-12-11 01:20:33 +0000
commit7de02ddf8887f37a5e3c0f810cbf45ac7029c165 (patch)
treed3c58b134dee7e2a5542bef8ce271a00f589a420
parent0d064db972a8bdff2e508a56f07e533348b84017 (diff)
downloadsyslinux-7de02ddf8887f37a5e3c0f810cbf45ac7029c165.tar.gz
Don't initialize the E820 map statically -- it's too big
-rw-r--r--memdisk/e820.h1
-rw-r--r--memdisk/e820func.c13
-rw-r--r--memdisk/setup.c12
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);