Fix incorrect test for whether multiboot info has a memory map.
[akaros.git] / kern / src / multiboot.c
index 2ebf8f2..0ededc9 100644 (file)
 #include <arch/apic.h>
 #endif
 
+/* Misc dead code to read from mboot.  We'll need to do this to run a legit
+ * initrd from grub (module /initramfs.cpio, or whatever). */
+static void mboot_parsing(struct multiboot_info *mbi)
+{
+       if (mbi->flags & MULTIBOOT_INFO_BOOTDEV)
+               printk("MBI: boot_device = 0x%08x\n", mbi->boot_device);
+       if (mbi->flags & MULTIBOOT_INFO_CMDLINE)
+               printk("MBI: command line: %s\n",
+                      (char*)((physaddr_t)mbi->cmdline + KERNBASE));
+       if (mbi->flags & MULTIBOOT_INFO_MODS) {
+               printk("MBI: nr mods, %d: mods addr %p\n", mbi->mods_count,
+                      mbi->mods_addr);
+       }
+}
+
+bool mboot_has_mmaps(struct multiboot_info *mbi)
+{
+       return mbi->flags & MULTIBOOT_INFO_MEM_MAP;
+}
+
 /* This only notices bios detectable memory - there's a lot more in the higher
  * paddrs. */
 void mboot_detect_memory(struct multiboot_info *mbi)
@@ -32,13 +52,21 @@ void mboot_detect_memory(struct multiboot_info *mbi)
        /* mem_lower and upper are measured in KB.  They are 32 bit values, so we're
         * limited to 4TB total. */
        basemem = ROUNDDOWN((size_t)mbi->mem_lower * 1024, PGSIZE);
+       /* On 32 bit, This shift << 10 could cause us to lose some memory, but we
+        * weren't going to access it anyways (won't go beyond ~1GB) */
        extmem = ROUNDDOWN((size_t)mbi->mem_upper * 1024, PGSIZE);
        /* Calculate the maximum physical address based on whether or not there is
         * any extended memory. */
-       if (extmem)
+       if (extmem) {
                max_bios_mem = EXTPHYSMEM + extmem;
-       else
+               /* On 32 bit, if we had enough RAM that adding a little wrapped us
+                * around, we'll back off a little and run with just extmem amount (in
+                * essence, subtracing 1MB). */
+               if (max_bios_mem < extmem)
+                       max_bios_mem = extmem;
+       } else {
                max_bios_mem = basemem;
+       }
        max_bios_addr = MIN(max_bios_mem, KERN_VMAP_TOP - KERNBASE);
        printk("Base memory: %luK, Extended memory: %luK\n", basemem / 1024,
               extmem / 1024);
@@ -53,8 +81,8 @@ void mboot_foreach_mmap(struct multiboot_info *mbi, mboot_foreach_t func,
                         void *data)
 {
        struct multiboot_mmap_entry *mmap_b, *mmap_e, *mmap_i;
-       if (!(mbi->flags & MULTIBOOT_INFO_ELF_SHDR)) {
-               printk("No memory mapping info from multiboot\n");
+       if (!mboot_has_mmaps(mbi)) {
+               printd("No memory mapping info from multiboot\n");
                return;
        }
        mmap_b = (struct multiboot_mmap_entry*)((size_t)mbi->mmap_addr + KERNBASE);