1 #include <lunaix/status.h>
2 #include <lunaix/mm/pagetable.h>
3 #include <lunaix/spike.h>
5 #include "pmm_internal.h"
8 __check_typemask(struct ppage* page, ppage_type_t typemask)
10 return !page->type || (page->type & typemask);
13 static struct pmem memory;
14 export_symbol(debug, pmm, memory);
17 pmm_init(struct boot_handoff* bctx)
21 llist_init_head(&memory.reserved);
23 pplist_pa = pmm_arch_init_remap(&memory, bctx);
29 pmm_arch_init_pool(&memory);
31 pmm_allocator_init(&memory);
33 for (size_t i = 0; i < POOL_COUNT; i++)
35 pmm_allocator_init_pool(&memory.pool[i]);
38 pfn_t pplist_size = memory.list_len * sizeof(struct ppage);
39 pmm_onhold_range(pfn(pplist_pa), leaf_count(pplist_size));
42 static inline bool must_inline optimize("-fipa-cp-clone")
43 __pmm_mark_range(pfn_t start, size_t npages, const bool hold)
45 if (start >= memory.list_len) {
49 struct ppage *_start, *_end,
50 *_mark_start, *_mark_end;
52 _start = ppage(start);
53 _end = ppage(start + npages - 1);
55 struct pmem_pool* pool;
56 for (int i = 0; npages && i < POOL_COUNT; i++) {
57 pool = &memory.pool[i];
59 _mark_start = MAX(pool->pool_start, _start);
60 _mark_end = MIN(pool->pool_end, _end);
61 if (pool->pool_end < _mark_start || _mark_end < pool->pool_start) {
67 _r = pmm_allocator_trymark_onhold(pool, _mark_start, _mark_end);
69 _r = pmm_allocator_trymark_unhold(pool, _mark_start, _mark_end);
74 npages -= (ppfn(_mark_end) - ppfn(_mark_start)) + 1;
82 pmm_onhold_range(pfn_t start, size_t npages)
84 return __pmm_mark_range(start, npages, true);
88 pmm_unhold_range(pfn_t start, size_t npages)
90 return __pmm_mark_range(start, npages, false);
94 pmm_pool_get(int pool_index)
96 assert(pool_index < POOL_COUNT);
98 return &memory.pool[pool_index];
102 pmm_declare_pool(int pool, pfn_t start, pfn_t size)
104 struct pmem_pool* _pool = &memory.pool[pool];
106 _pool->type = POOL_UNIFIED;
107 _pool->pool_end = ppage(start + size - 1);
108 _pool->pool_start = ppage(start);