Fixed up ivy annotations on the new structure supporting page_coloring.
[akaros.git] / kern / src / kmalloc.c
index acd811b..ba321f1 100644 (file)
@@ -13,7 +13,7 @@
 
 #define kmallocdebug(args...)  printk(args)
 
-physaddr_t boot_freemem;           // Pointer to next byte of free physical mem
+char*BND(end, maxaddrpa_ptr + IVY_KERNBASE) boot_freemem;
 static page_list_t pages_list; //List of physical pages used by kmalloc
 
 /*
@@ -25,9 +25,9 @@ static page_list_t pages_list;        //List of physical pages used by kmalloc
  * This function may ONLY be used during initialization,
  * before the page_free_list has been set up.
  */
-void* boot_alloc(uint32_t size, uint32_t align)
+void* boot_alloc(uint32_t n, uint32_t align)
 {
-       extern char (COUNT(1) end)[]; //Read in from the linker script
+       extern char (SNT end)[];
        void *v;
 
        // Initialize boot_freemem if this is the first time.
@@ -35,23 +35,54 @@ void* boot_alloc(uint32_t size, uint32_t align)
        // which points to the end of the kernel's bss segment -
        // i.e., the first virtual address that the linker
        // did _not_ assign to any kernel code or global variables.
-       if (boot_freemem == 0)
-               boot_freemem = (physaddr_t) end;
+       if (boot_freemem == 0) {
+               boot_freemem = TC(end);
+       }
 
        //      Step 1: round boot_freemem up to be aligned properly
-       boot_freemem = ROUNDUP(boot_freemem, align);
+       boot_freemem = PTRROUNDUP(boot_freemem, align);
 
        //      Step 2: save current value of boot_freemem as allocated chunk
-       v = (void *COUNT(size)) TC(boot_freemem);
+       v = boot_freemem;
        //  Step 2.5: check if we can alloc
-       if (PADDR(boot_freemem + size) > maxaddrpa)
+       if (PADDR(boot_freemem + n) > maxaddrpa)
                panic("Out of memory in boot alloc, you fool!\n");
        //      Step 3: increase boot_freemem to record allocation
-       boot_freemem += size;   
+       boot_freemem += n;      
        //      Step 4: return allocated chunk
        return v;
 }
 
+void* boot_calloc(uint32_t _n, size_t sz, uint32_t align)
+{
+       extern char (SNT end)[];
+       uint32_t n = _n *sz;
+       void *v;
+
+       // Initialize boot_freemem if this is the first time.
+       // 'end' is a magic symbol automatically generated by the linker,
+       // which points to the end of the kernel's bss segment -
+       // i.e., the first virtual address that the linker
+       // did _not_ assign to any kernel code or global variables.
+       if (boot_freemem == 0)
+               boot_freemem = TC(end);
+
+       //      Step 1: round boot_freemem up to be aligned properly
+       boot_freemem = PTRROUNDUP(boot_freemem, align);
+
+       //      Step 2: save current value of boot_freemem as allocated chunk
+       v = boot_freemem;
+       //  Step 2.5: check if we can alloc
+       if (PADDR(boot_freemem + n) > maxaddrpa)
+               panic("Out of memory in boot alloc, you fool!\n");
+       //      Step 3: increase boot_freemem to record allocation
+       boot_freemem += n;
+       //  Step 4: zero allocated chunk
+       memset(v,0,n);
+       //      Step 5: return allocated chunk
+       return v;
+}
+
 void kmalloc_init() 
 {
        LIST_INIT(&pages_list);
@@ -105,4 +136,5 @@ void kfree(void *addr)
                page_free(p);
                kmallocdebug("freeing page: %d\n", page2ppn(p));
        }
-}
\ No newline at end of file
+}
+