x86: Panic if there is no x2APIC
[akaros.git] / kern / src / multiboot.c
index 8092dc3..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. */
 
@@ -34,7 +34,7 @@ static void mboot_parsing(struct multiboot_info *mbi)
 
 bool mboot_has_mmaps(struct multiboot_info *mbi)
 {
-       return mbi->flags & MULTIBOOT_INFO_ELF_SHDR;
+       return mbi->flags & MULTIBOOT_INFO_MEM_MAP;
 }
 
 /* This only notices bios detectable memory - there's a lot more in the higher
@@ -52,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);
@@ -113,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,