1 /*
2 * \brief Memory subsystem
3 * \author Christian Helmuth
4 * \date 2008-08-15
5 */
6
7 /*
8 * Copyright (C) 2008-2013 Genode Labs GmbH
9 *
10 * This file is part of the Genode OS framework, which is distributed
11 * under the terms of the GNU General Public License version 2.
12 */
13
14 #ifndef _INCLUDE__DDE_KIT__MEMORY_H_
15 #define _INCLUDE__DDE_KIT__MEMORY_H_
16
17 #include <dde_kit/types.h>
18
19
20 /*******************
21 ** Slab facility **
22 *******************/
23
24 struct dde_kit_slab;
25
26 /**
27 * Store user pointer in slab cache
28 *
29 * \param slab pointer to slab cache
30 * \param data user pointer
31 */
32 void dde_kit_slab_set_data(struct dde_kit_slab * slab, void *data);
33
34 /**
35 * Read user pointer from slab cache
36 *
37 * \param slab pointer to slab cache
38 *
39 * \return stored user pointer or 0
40 */
41 void *dde_kit_slab_get_data(struct dde_kit_slab * slab);
42
43 /**
44 * Allocate slab in slab cache
45 *
46 * \param slab pointer to slab cache
47 *
48 * \return pointer to allocated slab
49 */
50 void *dde_kit_slab_alloc(struct dde_kit_slab * slab);
51
52 /**
53 * Deallocate slab in slab cache
54 *
55 * \param slab pointer to slab cache
56 * \param objp pointer to allocated slab
57 */
58 void dde_kit_slab_free(struct dde_kit_slab * slab, void *objp);
59
60 /**
61 * Destroy slab cache
62 *
63 * \param slab pointer to slab cache structure
64 */
65 void dde_kit_slab_destroy(struct dde_kit_slab * slab);
66
67 /**
68 * Initialize slab cache
69 *
70 * \param size size of cache objects
71 *
72 * \return pointer to new slab cache or 0 on error
73 *
74 * Allocated blocks have valid virt->phys mappings and are physically
75 * contiguous.
76 */
77 struct dde_kit_slab * dde_kit_slab_init(unsigned size);
78
79
80 /**********************************
81 ** Large-block memory allocator **
82 **********************************/
83
84 /**
85 * Allocate large memory block
86 *
87 * \param size block size
88 *
89 * \return pointer to new memory block
90 *
91 * Allocations via this allocator may be slow (because RPCs to remote services
92 * may be involved) and should be used only for large blocks of several pages.
93 * If allocations/deallocations are relatively dynamic the large memory
94 * allocator should be used as backend for a block caching frontend.
95 *
96 * Allocated blocks have valid virt->phys mappings and are physically
97 * contiguous.
98 */
99 void *dde_kit_large_malloc(dde_kit_size_t size);
100
101 /**
102 * Free large memory block
103 *
104 * \param p pointer to memory block
105 */
106 void dde_kit_large_free(void *p);
107
108
109 /*****************************
110 ** Simple memory allocator **
111 *****************************/
112
113 /**
114 * Allocate memory block via simple allocator
115 *
116 * \param size block size
117 *
118 * \return pointer to new memory block
119 *
120 * The blocks allocated via this allocator CANNOT be used for DMA or other
121 * device operations, i.e., there exists no virt->phys mapping.
122 */
123 void *dde_kit_simple_malloc(dde_kit_size_t size);
124
125 /**
126 * Free memory block via simple allocator
127 *
128 * \param p pointer to memory block
129 *
130 * As in C99, if `p` is NULL no operation is performed.
131 */
132 void dde_kit_simple_free(void *p);
133
134 #endif /* _INCLUDE__DDE_KIT__MEMORY_H_ */