fbd3f643c407b3a26e5738fda9cee1fa7cac54c8
[gpxe.git] / src / include / heap.h
1 #ifndef HEAP_H
2 #define HEAP_H
3
4 /*
5  * Allocate a block with specified (physical) alignment
6  *
7  * "align" must be a power of 2.
8  *
9  * Note that "align" affects the alignment of the physical address,
10  * not the virtual address.  This is almost certainly what you want.
11  *
12  */
13 extern void * emalloc ( size_t size, unsigned int align );
14
15 /*
16  * Allocate all remaining space on the heap
17  *
18  */
19 extern void * emalloc_all ( size_t *size );
20
21 /*
22  * Free a block.
23  *
24  * The caller must ensure that the block being freed is the last (most
25  * recent) block allocated on the heap, otherwise heap corruption will
26  * occur.
27  *
28  */
29 extern void efree ( void *ptr );
30
31 /*
32  * Free all allocated blocks on the heap
33  *
34  */
35 extern void efree_all ( void );
36
37 /*
38  * Resize a block.
39  *
40  * The caller must ensure that the block being resized is the last
41  * (most recent) block allocated on the heap, otherwise heap
42  * corruption will occur.
43  *
44  */
45 extern void * erealloc ( void *ptr, size_t size );
46
47 /*
48  * Allocate, free, and resize blocks without caring about alignment
49  *
50  */
51 static inline void * malloc ( size_t size ) {
52         return emalloc ( size, sizeof ( void * ) );
53 }
54
55 static inline void free ( void *ptr ) {
56         efree ( ptr );
57 }
58
59 static inline void * realloc ( void *ptr, size_t size ) {
60         return erealloc ( ptr, size );
61 }
62
63 /*
64  * Legacy API calls
65  *
66  */
67 static inline void * allot ( size_t size ) {
68         return emalloc ( size, sizeof ( void * ) );
69 }
70
71 static inline void forget ( void *ptr ) {
72         efree ( ptr );
73 }
74
75 static inline void * allot2 ( size_t size, uint32_t mask ) {
76         return emalloc ( size, mask + 1 );
77 }
78
79 static inline void forget2 ( void *ptr ) {
80         efree ( ptr );
81 }
82
83 /*
84  * Heap markers.  osloader.c and other code may wish to know the heap
85  * location, without necessarily wanting to drag in heap.o.  We
86  * therefore declare these as shared (i.e. common) symbols.
87  *
88  */
89 physaddr_t heap_ptr __asm__ ( "_shared_heap_ptr" );
90 physaddr_t heap_end __asm__ ( "_shared_heap_end" );
91
92 #endif /* HEAP_H */