X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fmm_virt.c;h=c7b7a224da43f1fe4f1280e33ea0cf13289f0311;hb=e7dd0e094f0c23bb20ddb0025f41d1c0c28f5ab2;hp=12bb3a47da50ec66db9d1c3bcf6f7f7497e1b569;hpb=b68b764267d33a45539b4c910db13fbdae48f193;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/mm_virt.c b/Kernel/arch/x86_64/mm_virt.c index 12bb3a47..c7b7a224 100644 --- a/Kernel/arch/x86_64/mm_virt.c +++ b/Kernel/arch/x86_64/mm_virt.c @@ -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; }