*/
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
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;
}
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
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);
}
if( num >= 0 ) continue;
+// Log_Debug("MMVirt", "Mapping %i pages to %p (base %P)", Number, ret-Number*0x1000, PAddr);
+
PAddr += 0x1000 * Number;
while( Number -- )
return ret;
}
- Log_KernelPanic("MM", "TODO: Implement MM_MapHWPages");
+ Log_Error("MM", "MM_MapHWPages - No space for %i pages", Number);
return 0;
}