Adds epoch_*sec() helpers
[akaros.git] / kern / src / pmap.c
index d4ba124..2cd8286 100644 (file)
@@ -33,15 +33,16 @@ uintptr_t boot_freelimit = 0;
 
 static size_t sizeof_mboot_mmentry(struct multiboot_mmap_entry *entry)
 {
-       /* Careful - addr + len is a uint64 (need to cast down for 32 bit) */
-       return (size_t)(entry->addr + entry->len);
+       /* Careful - len is a uint64 (need to cast down for 32 bit) */
+       return (size_t)(entry->len);
 }
 
 static void adjust_max_pmem(struct multiboot_mmap_entry *entry, void *data)
 {
        if (entry->type != MULTIBOOT_MEMORY_AVAILABLE)
                return;
-       max_pmem = MAX(max_pmem, sizeof_mboot_mmentry(entry));
+       /* Careful - addr + len is a uint64 (need to cast down for 32 bit) */
+       max_pmem = MAX(max_pmem, (size_t)(entry->addr + entry->len));
 }
 
 /**
@@ -131,7 +132,7 @@ static void boot_alloc_init(void)
                boot_freelimit = boot_zone_end;
        } else {
                boot_freemem = end_kva;
-               boot_freelimit = max_paddr;
+               boot_freelimit = max_paddr + KERNBASE;
        }
        printd("boot_zone: %p, paddr base: 0x%llx, paddr len: 0x%llx\n", boot_zone,
               boot_zone ? boot_zone->addr : 0,
@@ -151,8 +152,13 @@ void *boot_alloc(size_t amt, size_t align)
                boot_alloc_init();
        boot_freemem = ROUNDUP(boot_freemem, align);
        retval = boot_freemem;
-       if (boot_freemem + amt > boot_freelimit)
+       if (boot_freemem + amt > boot_freelimit){
+               printk("boot_alloc: boot_freemem is 0x%x\n", boot_freemem);
+               printk("boot_alloc: amt is %d\n", amt);
+               printk("boot_freelimit is 0x%x\n", boot_freelimit);
+               printk("boot_freemem + amt is > boot_freelimit\n");
                panic("Out of memory in boot alloc, you fool!\n");
+       }
        boot_freemem += amt;
        printd("boot alloc from %p to %p\n", retval, boot_freemem);
        /* multiboot info probably won't ever conflict with our boot alloc */
@@ -327,3 +333,25 @@ bool regions_collide_unsafe(uintptr_t start1, uintptr_t end1,
                return TRUE;
        }
 }
+
+void print_free_mem(void)
+{
+       static uint8_t *bm = 0;
+       /* racy, but this is debugging code */
+       if (!bm)
+               bm = kzmalloc((max_nr_pages + 1) / 8, 0);
+
+       long x = 0;
+       for (int i = 0; i < max_nr_pages; i++) {
+               if (page_is_free(i)) {
+                       x++;
+                       SET_BITMASK_BIT(bm, i);
+               } else {
+                       if (GET_BITMASK_BIT(bm, i)) {
+                               print_pageinfo(ppn2page(i));
+                               CLR_BITMASK_BIT(bm, i);
+                       }
+               }
+       }
+       printk("Nr Free pages: %lld\n", x);
+}