Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpfault.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS kernel 00004 * FILE: ntoskrnl/mm/powerpc/pfault.c 00005 * PURPOSE: Paging file functions 00006 * 00007 * PROGRAMMERS: David Welch (welch@mcmail.com) 00008 */ 00009 00010 /* INCLUDES *****************************************************************/ 00011 00012 #include <ntoskrnl.h> 00013 #define NDEBUG 00014 #include <debug.h> 00015 #include <ppcmmu/mmu.h> 00016 00017 /* EXTERNS *******************************************************************/ 00018 00019 NTSTATUS 00020 NTAPI 00021 MmNotPresentFault(KPROCESSOR_MODE Mode, 00022 ULONG_PTR Address, 00023 BOOLEAN FromMdl); 00024 extern ULONG KiKernelTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2); 00025 00026 /* FUNCTIONS *****************************************************************/ 00027 00028 VOID MmpPpcTrapFrameToTrapFrame(ppc_trap_frame_t *frame, PKTRAP_FRAME Tf) 00029 { 00030 RtlCopyMemory(&Tf->Gpr0, frame->gpr, 12 * sizeof(ULONG)); 00031 Tf->Lr = frame->lr; 00032 Tf->Cr = frame->cr; 00033 Tf->Ctr = frame->ctr; 00034 Tf->Xer = frame->xer; 00035 Tf->Iar = frame->srr0; 00036 Tf->Msr = frame->srr1 & 0xffff; 00037 Tf->Dr0 = frame->dar; 00038 Tf->Dr1 = frame->dsisr; 00039 } 00040 00041 void CopyFrame(int *oldframe, int *ourframe) 00042 { 00043 int i; 00044 00045 for (i = 0; i < sizeof(ppc_trap_frame_t) / sizeof(int); i++) 00046 { 00047 ourframe[i] = GetPhys((int)&oldframe[i]); 00048 } 00049 } 00050 00051 void KiPageFaultHandler(int trap, ppc_trap_frame_t *frame) 00052 { 00053 NTSTATUS Status = STATUS_SUCCESS; 00054 KPROCESSOR_MODE Mode; 00055 EXCEPTION_RECORD Er; 00056 KTRAP_FRAME Tf; 00057 BOOLEAN AccessFault = !!(frame->dsisr & (1<<28)); 00058 vaddr_t VirtualAddr; 00059 PVOID TrapInfo = NULL; 00060 00061 /* get the faulting address */ 00062 if (trap == 4) /* Instruction miss */ 00063 VirtualAddr = frame->srr0; 00064 else /* Data miss */ 00065 VirtualAddr = frame->dar; 00066 00067 /* MSR_PR */ 00068 Mode = frame->srr1 & 0x4000 ? UserMode : KernelMode; 00069 DPRINT("Page Fault at %08x\n", frame->srr0); 00070 00071 /* handle the fault */ 00072 if (AccessFault) 00073 { 00074 Status = MmAccessFault(Mode, (PVOID)VirtualAddr, FALSE, TrapInfo); 00075 } 00076 else 00077 { 00078 Status = MmNotPresentFault(Mode, VirtualAddr, FALSE); 00079 } 00080 00081 if (NT_SUCCESS(Status)) 00082 { 00083 MmuCallbackRet(); 00084 } 00085 00086 if (KeGetCurrentThread()->ApcState.UserApcPending) 00087 { 00088 KIRQL oldIrql; 00089 00090 KeRaiseIrql(APC_LEVEL, &oldIrql); 00091 KiDeliverApc(UserMode, NULL, NULL); 00092 KeLowerIrql(oldIrql); 00093 } 00094 00095 MmpPpcTrapFrameToTrapFrame(frame, &Tf); 00096 00097 Er.ExceptionCode = STATUS_ACCESS_VIOLATION; 00098 Er.ExceptionFlags = 0; 00099 Er.ExceptionRecord = NULL; 00100 Er.ExceptionAddress = (PVOID)frame->srr0; 00101 Er.NumberParameters = 2; 00102 Er.ExceptionInformation[0] = AccessFault; 00103 Er.ExceptionInformation[1] = VirtualAddr; 00104 00105 /* FIXME: Which exceptions are noncontinuable? */ 00106 Er.ExceptionFlags = 0; 00107 00108 KiDispatchException(&Er, 0, &Tf, Mode, TRUE); 00109 MmuCallbackRet(); 00110 } 00111 Generated on Sun May 27 2012 04:37:38 for ReactOS by
1.7.6.1
|