+
+void MM_ClearUser(void)
+{
+ tVAddr addr = 0;
+ // #1 Traverse the structure < 2^47, Deref'ing all pages
+ // #2 Free tables/dirs/pdps once they have been cleared
+
+ for( addr = 0; addr < 0x800000000000; )
+ {
+ if( PAGEMAPLVL4(addr >> PML4_SHIFT) & 1 )
+ {
+ if( PAGEDIRPTR(addr >> PDP_SHIFT) & 1 )
+ {
+ if( PAGEDIR(addr >> PDIR_SHIFT) & 1 )
+ {
+ // Page
+ if( PAGETABLE(addr >> PTAB_SHIFT) & 1 ) {
+ MM_DerefPhys( PAGETABLE(addr >> PTAB_SHIFT) & PADDR_MASK );
+ PAGETABLE(addr >> PTAB_SHIFT) = 0;
+ }
+ addr += 1 << PTAB_SHIFT;
+ // Dereference the PDIR Entry
+ if( (addr + (1 << PTAB_SHIFT)) >> PDIR_SHIFT != (addr >> PDIR_SHIFT) ) {
+ MM_DerefPhys( PAGEMAPLVL4(addr >> PDIR_SHIFT) & PADDR_MASK );
+ PAGEDIR(addr >> PDIR_SHIFT) = 0;
+ }
+ }
+ else {
+ addr += 1 << PDIR_SHIFT;
+ continue;
+ }
+ // Dereference the PDP Entry
+ if( (addr + (1 << PDIR_SHIFT)) >> PDP_SHIFT != (addr >> PDP_SHIFT) ) {
+ MM_DerefPhys( PAGEMAPLVL4(addr >> PDP_SHIFT) & PADDR_MASK );
+ PAGEDIRPTR(addr >> PDP_SHIFT) = 0;
+ }
+ }
+ else {
+ addr += 1 << PDP_SHIFT;
+ continue;
+ }
+ // Dereference the PML4 Entry
+ if( (addr + (1 << PDP_SHIFT)) >> PML4_SHIFT != (addr >> PML4_SHIFT) ) {
+ MM_DerefPhys( PAGEMAPLVL4(addr >> PML4_SHIFT) & PADDR_MASK );
+ PAGEMAPLVL4(addr >> PML4_SHIFT) = 0;
+ }
+ }
+ else {
+ addr += (tVAddr)1 << PML4_SHIFT;
+ continue;
+ }
+ }
+}