- // next fit
- assert_msg((paddr & 0xfff) == 0, "vmap: bad alignment");
- size = ROUNDUP(size, PG_SIZE);
-
- ptr_t current_addr = start;
- size_t examed_size = 0, wrapped = 0;
- x86_page_table* pd = (x86_page_table*)L1_BASE_VADDR;
-
- while (!wrapped || current_addr < start) {
- size_t l1inx = L1_INDEX(current_addr);
- if (!(pd->entry[l1inx])) {
- // empty 4mb region
- examed_size += MEM_4M;
- current_addr = (current_addr & 0xffc00000) + MEM_4M;
- } else {
- x86_page_table* ptd = (x86_page_table*)(L2_VADDR(l1inx));
- size_t i = L2_INDEX(current_addr), j = 0;
- for (; i < PG_MAX_ENTRIES && examed_size < size; i++, j++) {
- if (!ptd->entry[i]) {
- examed_size += PG_SIZE;
- } else if (examed_size) {
- // found a discontinuity, start from beginning
- examed_size = 0;
- j++;
- break;
- }
- }
- current_addr += j << 12;
- }
-
- if (examed_size >= size) {
- goto done;
+ int _n = 0;
+ size_t sz = L0T_SIZE;
+ ptr_t va = page_addr(ptep_pfn(ptep));
+
+ ptep = mkl0tep(ptep);
+
+ while (_n < n && va < VMAP_END) {
+ pte_t pte = *ptep;
+ if (pte_isnull(pte)) {
+ _n += sz / base_sz;
+ }
+ else if ((sz / LEVEL_SIZE) < base_sz) {
+ _n = 0;