x86: Panic if there is no x2APIC
[akaros.git] / kern / src / multiboot.c
index 2ebf8f2..2803eeb 100644 (file)
@@ -1,7 +1,7 @@
 /* Copyright (c) 2009,13 The Regents of the University of California
  * Barret Rhoden <brho@cs.berkeley.edu>
  * Kevin Klues <klueska@cs.berkeley.edu>
- * See LICENSE for details. 
+ * See LICENSE for details.
  *
  * Multiboot parsing and helper functions. */
 
 #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);
@@ -93,7 +121,7 @@ bool mboot_region_collides(struct multiboot_info *mbi, uintptr_t base,
                                   (uintptr_t)mbi + sizeof(struct multiboot_info),
                                   base, end))
                return TRUE;
-       if ((mbi->flags & MULTIBOOT_INFO_ELF_SHDR)) {
+       if (mboot_has_mmaps(mbi)) {
                if (regions_collide_unsafe((uintptr_t)mbi->mmap_addr + KERNBASE,
                                           (uintptr_t)mbi->mmap_addr + KERNBASE
                                                                     + mbi->mmap_length,