1#include <mem/page.h>
2#include <mem/pmm.h>
3#include <mem/vas.h>
4#include <mem/vmm.h>
5#include <string.h>
6/* simple alloc used for bootstrapping systems */
7void *simple_alloc(struct vas *space, size_t size) {
8 size_t pages = PAGES_NEEDED_FOR(size);
9 vaddr_t virt_base = vas_alloc(vas: space, size, PAGE_SIZE);
10 if (!virt_base)
11 return NULL;
12
13 for (size_t i = 0; i < pages; i++) {
14 vaddr_t virt = virt_base + (i * PAGE_SIZE);
15 paddr_t phys = kassert(pmm_alloc_page());
16 vmm_map_page(virt, phys, PAGE_PRESENT | PAGE_WRITE | PAGE_XD,
17 VMM_FLAG_NONE);
18 }
19
20 memset((void *) virt_base, 0, size);
21 return (void *) virt_base;
22}
23
24void simple_free(struct vas *space, void *ptr, size_t size) {
25 vaddr_t real_virt = (vaddr_t) ptr;
26 size_t pages = PAGES_NEEDED_FOR(size);
27
28 for (size_t i = 0; i < pages; i++) {
29 vaddr_t virt = (vaddr_t) real_virt + i * PAGE_SIZE;
30 paddr_t phys = vmm_get_phys(virt, VMM_FLAG_NONE);
31 kassert(phys != (paddr_t) -1);
32 vmm_unmap_page(virt);
33 pmm_free_page(addr: phys);
34 }
35
36 vas_free(vas: space, addr: real_virt, size);
37}
38