Add simple GDB stub.
[reactos.git] / reactos / ntoskrnl / mm / powerpc / pfault.c
1 /* $Id: pfault.c 24443 2006-10-08 10:01:27Z arty $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/mm/powerpc/pfault.c
6 * PURPOSE: Paging file functions
7 *
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
9 */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <ntoskrnl.h>
14 #define NDEBUG
15 #include <internal/debug.h>
16 #include <ppcmmu/mmu.h>
17
18 /* EXTERNS *******************************************************************/
19
20 extern ULONG KiKernelTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2);
21
22 /* FUNCTIONS *****************************************************************/
23
24 VOID MmpPpcTrapFrameToTrapFrame(ppc_trap_frame_t *frame, PKTRAP_FRAME Tf)
25 {
26 RtlCopyMemory(&Tf->Gpr0, frame->gpr, 12 * sizeof(ULONG));
27 Tf->Lr = frame->lr;
28 Tf->Cr = frame->cr;
29 Tf->Ctr = frame->ctr;
30 Tf->Xer = frame->xer;
31 Tf->Msr = frame->srr1 & 0xffff;
32 Tf->Dr0 = frame->srr0;
33 Tf->Dr1 = frame->srr1;
34 Tf->Dr2 = frame->dar;
35 Tf->Dr3 = frame->dsisr;
36 }
37
38 int KiPageFaultHandler(int trap, ppc_trap_frame_t *frame)
39 {
40 NTSTATUS Status = STATUS_SUCCESS;
41 KPROCESSOR_MODE Mode;
42 EXCEPTION_RECORD Er;
43 KTRAP_FRAME Tf;
44 BOOLEAN AccessFault = !!(frame->dsisr & (1<<28));
45 vaddr_t VirtualAddr;
46 PVOID TrapInfo = NULL;
47
48 /* get the faulting address */
49 if (trap == 4) /* Instruction miss */
50 VirtualAddr = frame->srr0;
51 else /* Data miss */
52 VirtualAddr = frame->dar;
53
54 /* MSR_PR */
55 Mode = frame->srr1 & 0x4000 ? KernelMode : UserMode;
56
57 /* handle the fault */
58 if (AccessFault)
59 {
60 Status = MmAccessFault(Mode, (PVOID)VirtualAddr, FALSE, TrapInfo);
61 }
62 else
63 {
64 KeBugCheck(0);
65 //Status = MmNotPresentFault(Mode, (PVOID)VirtualAddr, FALSE, TrapInfo);
66 }
67
68 if (NT_SUCCESS(Status))
69 return 1;
70
71 if (KeGetCurrentThread()->ApcState.UserApcPending)
72 {
73 KIRQL oldIrql;
74
75 KeRaiseIrql(APC_LEVEL, &oldIrql);
76 KiDeliverApc(UserMode, NULL, NULL);
77 KeLowerIrql(oldIrql);
78 }
79
80 MmpPpcTrapFrameToTrapFrame(frame, &Tf);
81
82 Er.ExceptionCode = STATUS_ACCESS_VIOLATION;
83 Er.ExceptionFlags = 0;
84 Er.ExceptionRecord = NULL;
85 Er.ExceptionAddress = (PVOID)frame->srr0;
86 Er.NumberParameters = 2;
87 Er.ExceptionInformation[0] = AccessFault;
88 Er.ExceptionInformation[1] = VirtualAddr;
89
90 /* FIXME: Which exceptions are noncontinuable? */
91 Er.ExceptionFlags = 0;
92
93 KiDispatchException(&Er, 0, &Tf, Mode, TRUE);
94 return 1;
95 }
96