-/* 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 KMALLOC_H
-#define KMALLOC_H
+#pragma once
-#include <arch/types.h>
+#include <ros/common.h>
+#include <kref.h>
-void kmalloc_init();
-void *(DALLOC(size) kmalloc)(size_t size, int flags);
-void DFREE(addr) kfree(void* addr);
+#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
-#endif //KMALLOC_H
\ No newline at end of file
+void kmalloc_init(void);
+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;
+
+#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:
+ *
+ * +--------------28---------------+-----4------+
+ * | Flag specific data | Flags |
+ * +-------------------------------+------------+
+ */
+#define KMALLOC_TAG_CACHE 1 /* memory came from slabs */
+#define KMALLOC_TAG_PAGES 2 /* memory came from page allocator */
+#define KMALLOC_TAG_UNALIGN 3 /* not a real tag, jump back by offset */
+#define KMALLOC_ALIGN_SHIFT 4 /* max flag is 16 */
+#define KMALLOC_FLAG_MASK ((1 << KMALLOC_ALIGN_SHIFT) - 1)
+
+#define KMALLOC_CANARY 0xdeadbabe
+
+/* The kmalloc align/free paths require that flags is at the end of this
+ * struct, and that it is not padded. */
+struct kmalloc_tag {
+ union {
+ struct kmem_cache *my_cache;
+ 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);