Support atomic printks
[akaros.git] / kern / include / kmalloc.h
index 03d7c55..f944f8b 100644 (file)
@@ -1,36 +1,38 @@
-/* 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>
  */
 
-#ifndef ROS_KERN_KMALLOC_H
-#define ROS_KERN_KMALLOC_H
+#pragma once
 
 #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
 
 void kmalloc_init(void);
-void* (DALLOC(size) kmalloc)(size_t size, int flags);
-void* (DALLOC(size) kzmalloc)(size_t size, int flags);
+void *kmalloc(size_t size, int flags);
+void *kmalloc_array(size_t nmemb, size_t size, int flags);
+void *kzmalloc(size_t size, int flags);
 void *kmalloc_align(size_t size, int flags, size_t align);
 void *kzmalloc_align(size_t size, int flags, size_t align);
 void *krealloc(void *buf, size_t size, int flags);
+void *kreallocarray(void *buf, size_t nmemb, size_t size, int flags);
 int kmalloc_refcnt(void *buf);
 void kmalloc_incref(void *buf);
 void kfree(void *buf);
 void kmalloc_canary_check(char *str);
 void *debug_canary;
 
-/* Flags to pass to kmalloc */
-/* Not implemented yet. Block until it is available. */
-#define KMALLOC_WAIT                   4
+#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:
  *
@@ -50,8 +52,8 @@ void *debug_canary;
  * struct, and that it is not padded. */
 struct kmalloc_tag {
        union {
-               struct kmem_cache *my_cache WHEN(flags == KMALLOC_TAG_CACHE);
-               size_t num_pages WHEN(flags == KMALLOC_TAG_PAGES);
+               struct kmem_cache *my_cache;
+               size_t amt_alloc;
                uint64_t unused_force_align;
        };
        struct kref kref;
@@ -59,5 +61,11 @@ struct kmalloc_tag {
        int flags;
 };
 
-#endif //ROS_KERN_KMALLOC_H
+/* 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);