Migrated Akaros code to use pragma once (XCC)
[akaros.git] / kern / include / kmalloc.h
1 /* Copyright (c) 2009 The Regents of the University of California. 
2  * See the COPYRIGHT files at the top of this source tree for full 
3  * license information.
4  * 
5  * Kevin Klues <klueska@cs.berkeley.edu>    
6  */
7
8 #pragma once
9
10 #include <ros/common.h>
11 #include <kref.h>
12
13 #define NUM_KMALLOC_CACHES 13
14 #define KMALLOC_ALIGNMENT 16
15 #define KMALLOC_SMALLEST (sizeof(struct kmalloc_tag) << 1)
16 #define KMALLOC_LARGEST KMALLOC_SMALLEST << NUM_KMALLOC_CACHES
17
18 void kmalloc_init(void);
19 void* kmalloc(size_t size, int flags);
20 void* kzmalloc(size_t size, int flags);
21 void *kmalloc_align(size_t size, int flags, size_t align);
22 void *kzmalloc_align(size_t size, int flags, size_t align);
23 void *krealloc(void *buf, size_t size, int flags);
24 int kmalloc_refcnt(void *buf);
25 void kmalloc_incref(void *buf);
26 void kfree(void *buf);
27 void kmalloc_canary_check(char *str);
28 void *debug_canary;
29
30 /* Flags to pass to kmalloc */
31 /* Not implemented yet. Block until it is available. */
32 #define KMALLOC_WAIT                    4
33
34 /* Kmalloc tag flags looks like this:
35  *
36  * +--------------28---------------+-----4------+
37  * |       Flag specific data      |    Flags   |
38  * +-------------------------------+------------+
39  */
40 #define KMALLOC_TAG_CACHE               1       /* memory came from slabs */
41 #define KMALLOC_TAG_PAGES               2       /* memory came from page allocator */
42 #define KMALLOC_TAG_UNALIGN             3       /* not a real tag, jump back by offset */
43 #define KMALLOC_ALIGN_SHIFT             4       /* max flag is 16 */
44 #define KMALLOC_FLAG_MASK               ((1 << KMALLOC_ALIGN_SHIFT) - 1)
45
46 #define KMALLOC_CANARY 0xdeadbabe
47
48 /* The kmalloc align/free paths require that flags is at the end of this
49  * struct, and that it is not padded. */
50 struct kmalloc_tag {
51         union {
52                 struct kmem_cache *my_cache;
53                 size_t num_pages;
54                 uint64_t unused_force_align;
55         };
56         struct kref kref;
57         uint32_t canary;
58         int flags;
59 };