Fixes VFS open bug
[akaros.git] / kern / src / kmalloc.c
index 65bc6b0..1ec948f 100644 (file)
@@ -2,6 +2,7 @@
  * See the COPYRIGHT files at the top of this source tree for full 
  * license information.
  * 
+ * Barret Rhoden <brho@cs.berkeley.edu>
  * Kevin Klues <klueska@cs.berkeley.edu>    
  */
 
@@ -15,7 +16,7 @@
 #endif
 
 #include <ros/common.h>
-#include <ros/error.h>
+#include <error.h>
 #include <pmap.h>
 #include <kmalloc.h>
 #include <stdio.h>
 
 #define kmallocdebug(args...)  //printk(args)
 
-char *RO BND(end, maxaddrpa_ptr + IVY_KERNBASE) boot_freemem;
-
 //List of physical pages used by kmalloc
 static spinlock_t pages_list_lock = SPINLOCK_INITIALIZER;
 static page_list_t LCKD(&pages_list_lock)pages_list;
 
-/*
- * Allocate n bytes of physical memory aligned on an 
- * align-byte boundary.  Align must be a power of two.
- * Return kernel virtual address.  Returned memory is uninitialized.
- *
- * If we're out of memory, boot_alloc should panic.
- * This function may ONLY be used during initialization,
- * before the page_free_list has been set up.
- */
-void* boot_alloc(uint32_t n, uint32_t align)
-{
-       extern char (SNT RO end)[];
-       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 = SINIT(TC(end));
-       }
-
-       //      Step 1: round boot_freemem up to be aligned properly
-       char RO*tmp = PTRROUNDUP(boot_freemem, align);
-       boot_freemem = SINIT(tmp);
-
-       //      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 = SINIT(boot_freemem + n);
-       //      Step 4: return allocated chunk
-       return v;
-}
-
-void *boot_calloc(uint32_t n, size_t sz, uint32_t align)
-{
-       void *v = boot_alloc(n * sz, align);    
-       memset(v, 0, n * sz);
-       return v;
-}
-
 struct kmem_cache *kmalloc_caches[NUM_KMALLOC_CACHES];
 void kmalloc_init(void)
 {
@@ -126,6 +80,15 @@ void *kmalloc(size_t size, int flags)
        return buf + KMALLOC_OFFSET;
 }
 
+void *kzmalloc(size_t size, int flags) 
+{
+       void *v = kmalloc(size, flags);
+       if (! v)
+               return v;
+       memset(v, 0, size);
+       return v;
+}
+
 void *krealloc(void* buf, size_t size, int flags) {
        struct kmalloc_tag *tag = (struct kmalloc_tag*)(buf - KMALLOC_OFFSET);
        if (tag->my_cache->obj_size >= size)