1 #include <lunaix/mm/pmm.h>
2 #include <lunaix/mm/vmm.h>
3 #include <lunaix/spike.h>
5 #include <sys/mm/mempart.h>
7 static ptr_t start = VMAP;
10 vmm_vmap(ptr_t paddr, size_t size, pt_attr attr)
13 assert_msg((paddr & 0xfff) == 0, "vmap: bad alignment");
14 size = ROUNDUP(size, PG_SIZE);
16 ptr_t current_addr = start;
17 size_t examed_size = 0, wrapped = 0;
18 x86_page_table* pd = (x86_page_table*)L1_BASE_VADDR;
20 while (!wrapped || current_addr >= start) {
21 size_t l1inx = L1_INDEX(current_addr);
22 if (!(pd->entry[l1inx])) {
24 examed_size += MEM_4MB;
25 current_addr = (current_addr & 0xffc00000) + MEM_4MB;
27 x86_page_table* ptd = (x86_page_table*)(L2_VADDR(l1inx));
28 size_t i = L2_INDEX(current_addr), j = 0;
29 for (; i < PG_MAX_ENTRIES && examed_size < size; i++, j++) {
31 examed_size += PG_SIZE;
32 } else if (examed_size) {
33 // found a discontinuity, start from beginning
39 current_addr += j << 12;
42 if (examed_size >= size) {
46 if (current_addr >= VMAP_END) {
56 ptr_t alloc_begin = current_addr - examed_size;
57 for (size_t i = 0; i < size; i += PG_SIZE) {
58 vmm_set_mapping(VMS_SELF, alloc_begin + i, paddr + i, PG_PREM_RW, 0);
59 pmm_ref_page(KERNEL_PID, paddr + i);
61 start = alloc_begin + size;
63 return (void*)alloc_begin;