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 = pmm_alloc_page();
16 kassert(phys);
17 vmm_map_page(virt, phys, PAGE_PRESENT | PAGE_WRITE | PAGE_XD,
18 VMM_FLAG_NONE);
19 }
20
21 memset((void *) virt_base, 0, size);
22 return (void *) virt_base;
23}
24
25void simple_free(struct vas *space, void *ptr, size_t size) {
26 vaddr_t real_virt = (vaddr_t) ptr;
27 size_t pages = PAGES_NEEDED_FOR(size);
28
29 for (size_t i = 0; i < pages; i++) {
30 vaddr_t virt = (vaddr_t) real_virt + i * PAGE_SIZE;
31 paddr_t phys = vmm_get_phys(virt, VMM_FLAG_NONE);
32 kassert(phys != (paddr_t) -1);
33 vmm_unmap_page(virt);
34 pmm_free_page(addr: phys);
35 }
36
37 vas_free(vas: space, addr: real_virt, size);
38}
39