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);
#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)
{
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"
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);