Don't initialize the E820 map statically -- it's too big
authorhpa <hpa>
Tue, 11 Dec 2001 01:20:33 +0000 (01:20 +0000)
committerhpa <hpa>
Tue, 11 Dec 2001 01:20:33 +0000 (01:20 +0000)
memdisk/e820.h
memdisk/e820func.c
memdisk/setup.c

index 7f064c4..77dae74 100644 (file)
@@ -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);
index 72e1bf8..d9c8465 100644 (file)
 
 #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)
 {
index 196f33b..a2e71fb 100644 (file)
@@ -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);