xref: /kvm-unit-tests/lib/alloc_page.h (revision 34c95065186175261cd153ad093a772384e4cdb7)
1 /*
2  * This work is licensed under the terms of the GNU LGPL, version 2.
3  *
4  * This is a simple allocator that provides contiguous physical addresses
5  * with byte granularity.
6  */
7 
8 #ifndef ALLOC_PAGE_H
9 #define ALLOC_PAGE_H 1
10 
11 #include <asm/memory_areas.h>
12 
13 /* Returns true if the page allocator has been initialized */
14 bool page_alloc_initialized(void);
15 
16 /*
17  * Initializes a memory area.
18  * n is the number of the area to initialize
19  * base_pfn is the physical frame number of the start of the area to initialize
20  * top_pfn is the physical frame number of the first page immediately after
21  * the end of the area to initialize
22  */
23 void page_alloc_init_area(u8 n, uintptr_t base_pfn, uintptr_t top_pfn);
24 
25 /* Enables the page allocator. At least one area must have been initialized */
26 void page_alloc_ops_enable(void);
27 
28 /*
29  * Allocate aligned memory from the specified areas.
30  * areas is a bitmap of allowed areas
31  * alignment must be a power of 2
32  */
33 void *memalign_pages_area(unsigned int areas, size_t alignment, size_t size);
34 
35 /*
36  * Allocate aligned memory from any area.
37  * Equivalent to memalign_pages_area(~0, alignment, size).
38  */
39 void *memalign_pages(size_t alignment, size_t size);
40 
41 /*
42  * Allocate naturally aligned memory from the specified areas.
43  * Equivalent to memalign_pages_area(areas, 1ull << order, 1ull << order).
44  */
45 void *alloc_pages_area(unsigned int areas, unsigned int order);
46 
47 /*
48  * Allocate one page from any area.
49  * Equivalent to alloc_pages(0);
50  */
51 void *alloc_page(void);
52 
53 /*
54  * Allocate naturally aligned memory from any area.
55  * Equivalent to alloc_pages_area(~0, order);
56  */
57 void *alloc_pages(unsigned int order);
58 
59 /*
60  * Frees a memory block allocated with any of the memalign_pages* or
61  * alloc_pages* functions.
62  * The pointer must point to the start of the block.
63  */
64 void free_pages(void *mem);
65 
66 /* For backwards compatibility */
67 static inline void free_page(void *mem)
68 {
69 	return free_pages(mem);
70 }
71 
72 /* For backwards compatibility */
73 static inline void free_pages_by_order(void *mem, unsigned int order)
74 {
75 	free_pages(mem);
76 }
77 
78 /*
79  * Allocates and reserves the specified memory range if possible.
80  * Returns NULL in case of failure.
81  */
82 void *alloc_pages_special(uintptr_t addr, size_t npages);
83 
84 /*
85  * Frees a reserved memory range that had been reserved with
86  * alloc_pages_special.
87  * The memory range does not need to match a previous allocation
88  * exactly, it can also be a subset, in which case only the specified
89  * pages will be freed and unreserved.
90  */
91 void free_pages_special(uintptr_t addr, size_t npages);
92 
93 #endif
94