1#include <mem/page.h>
2#include <mem/pmm.h>
3#include <mem/simple_alloc.h>
4#include <mem/vas.h>
5#include <mem/vmm.h>
6#include <string.h>
7/* simple alloc used for bootstrapping systems */
8void *simple_alloc(struct vas *space, size_t size) {
9 size_t pages = PAGES_NEEDED_FOR(size);
10 vaddr_t virt_base = vas_alloc(vas: space, size, PAGE_SIZE);
11 if (!virt_base)
12 return NULL;
13
14 for (size_t i = 0; i < pages; i++) {
15 vaddr_t virt = virt_base + (i * PAGE_SIZE);
16 paddr_t phys = enforce(pmm_alloc_page(), OUT_OF_MEMORY);
17 vmm_map_page(virt, phys,
18 .page_flags = PAGE_PRESENT | PAGE_WRITE | PAGE_XD);
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);
32 enforce(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