Usermode/AxWin3 - More WM IPC messages implemented
[tpg/acess2.git] / Kernel / arch / x86_64 / mm_virt.c
index 12bb3a4..c7b7a22 100644 (file)
@@ -154,6 +154,25 @@ void MM_int_ClonePageEnt( Uint64 *Ent, void *NextLevel, tVAddr Addr, int bTable
  */
 int MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs)
 {
+//     Log_Debug("MMVirt", "Addr = %p, ErrorCode = %x", Addr, ErrorCode);
+
+       // Catch reserved bits first
+       if( ErrorCode & 0x8 )
+       {
+               Log_Warning("MMVirt", "Reserved bits trashed!");
+               Log_Warning("MMVirt", "PML4 Ent   = %P", PAGEMAPLVL4(Addr>>39));
+               if( !(PAGEMAPLVL4(Addr>>39) & PF_PRESENT) )     goto print_done;
+               Log_Warning("MMVirt", "PDP Ent    = %P", PAGEDIRPTR(Addr>>30));
+               if( !(PAGEDIRPTR(Addr>>30) & PF_PRESENT) )      goto print_done;
+               Log_Warning("MMVirt", "PDir Ent   = %P", PAGEDIR(Addr>>21));
+               if( !(PAGEDIR(Addr>>21) & PF_PRESENT) ) goto print_done;
+               Log_Warning("MMVirt", "PTable Ent = %P", PAGETABLE(Addr>>12));
+               if( !(PAGETABLE(Addr>>12) & PF_PRESENT) )       goto print_done;
+       print_done:
+               
+               for(;;);
+       }
+
        // TODO: Implement Copy-on-Write
        #if 1
        if( PAGEMAPLVL4(Addr>>39) & PF_PRESENT
@@ -202,6 +221,7 @@ int MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs)
                Warning("User Pagefault: Instruction at %04x:%p accessed %p",
                        Regs->CS, Regs->RIP, Addr);
                __asm__ __volatile__ ("sti");   // Restart IRQs
+               Error_Backtrace(Regs->RIP, Regs->RBP);
                Threads_SegFault(Addr);
                return 0;
        }
@@ -232,12 +252,13 @@ int MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs)
 void MM_int_DumpTablesEnt(tVAddr RangeStart, size_t Length, tPAddr Expected)
 {
        #define CANOICAL(addr)  ((addr)&0x800000000000?(addr)|0xFFFF000000000000:(addr))
-       LogF("%6llx %6llx %6llx %016llx => ",
-               MM_GetPhysAddr( (tVAddr)&PAGEDIRPTR(RangeStart>>30) ),
-               MM_GetPhysAddr( (tVAddr)&PAGEDIR(RangeStart>>21) ),
-               MM_GetPhysAddr( (tVAddr)&PAGETABLE(RangeStart>>12) ),
-               CANOICAL(RangeStart)
-               );
+       LogF("%016llx => ", CANOICAL(RangeStart));
+//     LogF("%6llx %6llx %6llx %016llx => ",
+//             MM_GetPhysAddr( (tVAddr)&PAGEDIRPTR(RangeStart>>30) ),
+//             MM_GetPhysAddr( (tVAddr)&PAGEDIR(RangeStart>>21) ),
+//             MM_GetPhysAddr( (tVAddr)&PAGETABLE(RangeStart>>12) ),
+//             CANOICAL(RangeStart)
+//             );
        if( gMM_ZeroPage && (PAGETABLE(RangeStart>>12) & PADDR_MASK) == gMM_ZeroPage )
                LogF("%13s", "zero" );
        else
@@ -414,7 +435,7 @@ int MM_MapEx(tVAddr VAddr, tPAddr PAddr, BOOL bTemp, BOOL bLarge)
        tPAddr  *ent;
         int    rv;
        
-       ENTER("xVAddr xPAddr", VAddr, PAddr);
+       ENTER("pVAddr PPAddr", VAddr, PAddr);
        
        // Get page pointer (Allow allocating)
        rv = MM_GetPageEntryPtr(VAddr, bTemp, 1, bLarge, &ent);
@@ -666,6 +687,8 @@ tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number)
                }
                if( num >= 0 )  continue;
                
+//             Log_Debug("MMVirt", "Mapping %i pages to %p (base %P)", Number, ret-Number*0x1000, PAddr);
+
                PAddr += 0x1000 * Number;
                
                while( Number -- )
@@ -679,7 +702,7 @@ tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number)
                return ret;
        }
        
-       Log_KernelPanic("MM", "TODO: Implement MM_MapHWPages");
+       Log_Error("MM", "MM_MapHWPages - No space for %i pages", Number);
        return 0;
 }
 

UCC git Repository :: git.ucc.asn.au