-
- // Catch a large COW
- if( (PAGEMAPLVL4(pml4) & PF_COW) ) {
- addr += 1ULL << PML4_SHIFT;
- }
- else
- {
- // TODO: Large pages
-
- // Child entries
- for( pdpt = 0; pdpt < 512; pdpt ++ )
- {
- // Unallocated
- if( !(PAGEDIRPTR(addr >> PDP_SHIFT) & 1) ) {
- addr += 1ULL << PDP_SHIFT;
- continue;
- }
-
- // Catch a large COW
- if( (PAGEDIRPTR(addr >> PDP_SHIFT) & PF_COW) ) {
- addr += 1ULL << PDP_SHIFT;
- }
- else {
- // Child entries
- for( pd = 0; pd < 512; pd ++ )
- {
- // Unallocated PDir entry
- if( !(PAGEDIR(addr >> PDIR_SHIFT) & 1) ) {
- addr += 1ULL << PDIR_SHIFT;
- continue;
- }
-
- // COW Page Table
- if( PAGEDIR(addr >> PDIR_SHIFT) & PF_COW ) {
- addr += 1ULL << PDIR_SHIFT;
- }
- else
- {
- // TODO: Catch large pages
-
- // Child entries
- for( pt = 0; pt < 512; pt ++ )
- {
- // Free page
- if( PAGETABLE(addr >> PTAB_SHIFT) & 1 ) {
- MM_DerefPhys( PAGETABLE(addr >> PTAB_SHIFT) & PADDR_MASK );
- PAGETABLE(addr >> PTAB_SHIFT) = 0;
- }
- addr += 1ULL << 12;
- }
- }
- // Free page table
- MM_DerefPhys( PAGEDIR(addr >> PDIR_SHIFT) & PADDR_MASK );
- PAGEDIR(addr >> PDIR_SHIFT) = 0;
- }
- }
- // Free page directory
- MM_DerefPhys( PAGEDIRPTR(addr >> PDP_SHIFT) & PADDR_MASK );
- PAGEDIRPTR(addr >> PDP_SHIFT) = 0;
- }