Support atomic printks
[akaros.git] / kern / include / kmalloc.h
index 0ea26d0..f944f8b 100644 (file)
@@ -1,8 +1,8 @@
-/* Copyright (c) 2009 The Regents of the University of California. 
- * See the COPYRIGHT files at the top of this source tree for full 
+/* Copyright (c) 2009 The Regents of the University of California.
+ * See the COPYRIGHT files at the top of this source tree for full
  * license information.
- * 
- * Kevin Klues <klueska@cs.berkeley.edu>    
+ *
+ * Kevin Klues <klueska@cs.berkeley.edu>
  */
 
 #pragma once
@@ -10,7 +10,7 @@
 #include <ros/common.h>
 #include <kref.h>
 
-#define NUM_KMALLOC_CACHES 13
+#define NUM_KMALLOC_CACHES 6
 #define KMALLOC_ALIGNMENT 16
 #define KMALLOC_SMALLEST (sizeof(struct kmalloc_tag) << 1)
 #define KMALLOC_LARGEST KMALLOC_SMALLEST << NUM_KMALLOC_CACHES
@@ -32,6 +32,7 @@ void *debug_canary;
 #define MEM_ATOMIC                             (1 << 1)
 #define MEM_WAIT                               (1 << 2)
 #define MEM_ERROR                              (1 << 3)
+#define MEM_FLAGS (MEM_ATOMIC | MEM_WAIT | MEM_ERROR)
 
 /* Kmalloc tag flags looks like this:
  *
@@ -52,10 +53,19 @@ void *debug_canary;
 struct kmalloc_tag {
        union {
                struct kmem_cache *my_cache;
-               size_t num_pages;
+               size_t amt_alloc;
                uint64_t unused_force_align;
        };
        struct kref kref;
        uint32_t canary;
        int flags;
 };
+
+/* This is aligned so that the buf is aligned to the usual kmalloc alignment. */
+struct sized_alloc {
+       void                                            *buf;
+       size_t                                          size;
+} __attribute__((aligned(KMALLOC_ALIGNMENT)));
+
+/* Allocate a sized_alloc, big enough to hold size bytes.  Free with kfree. */
+struct sized_alloc *sized_kzmalloc(size_t size, int flags);