ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

pfault.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.