- while (!wrapped || current_addr >= start) {
- size_t l1inx = L1_INDEX(current_addr);
- if (!(pd->entry[l1inx])) {
- // empty 4mb region
- examed_size += MEM_4MB;
- current_addr = (current_addr & 0xffc00000) + MEM_4MB;
- } else {
- x86_page_table* ptd = (x86_page_table*)(L2_VADDR(l1inx));
- size_t i = L2_INDEX(current_addr);
- for (; i < 1024 && examed_size < size; i++) {
- if (!ptd->entry[i]) {
- examed_size += PG_SIZE;
- } else if (examed_size) {
- // found a discontinuity, start from beginning
- examed_size = 0;
- i++;
- break;
- }
- }
- current_addr += i << 12;