Author: tkreuzer
Date: Mon Dec 28 05:39:02 2009
New Revision: 44788
URL:
http://svn.reactos.org/svn/reactos?rev=44788&view=rev
Log:
Implement KiGeneralProtectionFault a bit
Modified:
branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/trap.S
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/trap.S
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntosk…
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/trap.S [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/trap.S [iso-8859-1] Mon Dec 28
05:39:02 2009
@@ -235,14 +235,13 @@
-// rbp = TrapFrame, ecx = ExceptionCode, edx = NumParams, r9,r10,r11 = params
+// rbp = TrapFrame, eax = ExceptionCode, edx = NumParams, r9,r10,r11 = params
_InternalDispatchException:
/* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME
/* Set up EXCEPTION_RECORD */
- mov eax, ecx
lea rcx, [rsp + SIZE_KEXCEPTION_FRAME]
mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax
xor rax, rax
@@ -313,7 +312,7 @@
KiDebugTrapOrFaultKMode:
/* Dispatch the exception */
- mov ecx, STATUS_SINGLE_STEP
+ mov eax, STATUS_SINGLE_STEP
mov edx, 0
mov r9, 0
mov r10, 0
@@ -351,7 +350,7 @@
// call _FrLdrDbgPrint[rip]
/* Dispatch the exception */
- mov ecx, STATUS_BREAKPOINT
+ mov eax, STATUS_BREAKPOINT
mov edx, 3
mov r9, 0
mov r10, 0
@@ -491,20 +490,111 @@
.pushframe 1
/* We have an error code */
+ cli
ENTER_TRAP_FRAME TRAPFLAG_ALL
TRAPINFO KiGeneralProtectionFault
-
-// DISPATCH_EXCEPTION STATUS_BREAKPOINT, 3, 0, 0, 0
mov rdx, [rbp + KTRAP_FRAME_Rip]
lea rcx, _MsgGeneralProtFault[rip]
call _FrLdrDbgPrint[rip]
- jmp $
+
+ /* Check if this was from user-mode */
+ cmp byte ptr [rbp + KTRAP_FRAME_PreviousMode], KernelMode
+ jnz KiGpfUserMode
+
+ /* Get instruction */
+ mov rax, [rbp + KTRAP_FRAME_Rip]
+ mov rax, [rax]
+
+ /* Check for MSR failure */
+ cmp al, 0xF
+ jz KiGpfMsr
+
+ /* Check for IRET */
+ cmp ax, 0xCF48
+ je KiGpfIret
+
+ /* Check for pop ds/es/fs/gs */
+ xor edx, edx
+ cmp al, 0x1F
+ jz KiGpfPopSegDs
+ cmp al, 0x07
+ jz KiGpfPopSegEs
+ cmp ax, 0xA10F
+ jz KiGpfPopSegFs
+ cmp ax, 0xA90F
+ jz KiGpfPopSegGs
+
+
+ mov dx, 0x002B // KGDT64_R3_DATA | RPL_MASK
+ cmp [rbp + KTRAP_FRAME_SegDs], dx
+ jne KiGpfPopSegDs
+ cmp [rbp + KTRAP_FRAME_SegEs], dx
+ jne KiGpfPopSegEs
+ cmp [rbp + KTRAP_FRAME_SegFs], dx
+ jne KiGpfPopSegFs
+ cmp [rbp + KTRAP_FRAME_SegGs], dx
+ jne KiGpfPopSegGs
+
+KiGpfFatal:
+
+ /* Bugcheck */
+ mov ecx, UNEXPECTED_KERNEL_MODE_TRAP
+ mov rdx, 0x0000D // EXCEPTION_GP_FAULT
+ xor rdx, rdx
+ xor r8, r8
+ xor r9, r9 // Reserved
+ mov [rbp + KTRAP_FRAME_P5], rbp // trap frame
+ call _KeBugCheckWithTf
+
+
+
+KiGpfPopSegDs:
+ mov [rbp + KTRAP_FRAME_SegDs], dx
+ jmp KiGpfPopSeg
+
+KiGpfPopSegEs:
+ mov [rbp + KTRAP_FRAME_SegEs], dx
+ jmp KiGpfPopSeg
+
+KiGpfPopSegFs:
+ mov [rbp + KTRAP_FRAME_SegFs], dx
+ jmp KiGpfPopSeg
+
+KiGpfPopSegGs:
+ mov [rbp + KTRAP_FRAME_SegGs], dx
+ jmp KiGpfPopSeg
+
+KiGpfPopSeg:
+ jmp KiGpfExit
+
+KiGpfIret:
+ /* Get error code */
+ mov ax, [rbp + KTRAP_FRAME_ErrorCode]
+// and ax, ~RPL_MASK
+
+KiGpfMsr:
+
+ jmp KiGpfFatal
+
+
+KiGpfUserMode:
+
+ /* Dispatch the exception */
+ mov eax, STATUS_ACCESS_VIOLATION
+ mov edx, 2
+ mov r9, [rbp + KTRAP_FRAME_ErrorCode]
+ mov r10, 0
+ mov r11, 0
+ call _InternalDispatchException
+
+KiGpfExit:
/* Return */
LEAVE_TRAP_FRAME
iretq
+
.endproc
@@ -556,8 +646,8 @@
InPageException:
/* Dispatch in-page exception */
- mov ecx, STATUS_IN_PAGE_ERROR // ExceptionCode
mov r11d, eax // Param3 = Status
+ mov eax, STATUS_IN_PAGE_ERROR // ExceptionCode
mov edx, 3 // ParamCount
call _InternalDispatchException
jmp PageFaultReturn
@@ -568,7 +658,6 @@
SpecialCode:
/* Setup a normal page fault exception */
- mov ecx, eax // ExceptionCode
mov edx, 2 // ParamCount
call _InternalDispatchException
@@ -650,7 +739,7 @@
inc qword ptr [rbp + KTRAP_FRAME_Rip]
/* Dispatch the exception */
- mov ecx, STATUS_BREAKPOINT
+ mov eax, STATUS_BREAKPOINT
mov edx, 3
mov r9, [rbp+KTRAP_FRAME_Rax] // Service
mov r10, [rbp+KTRAP_FRAME_Rcx] // Buffer
@@ -688,8 +777,18 @@
lea rcx, _MsgUnexpectedInterrupt[rip]
call _FrLdrDbgPrint[rip]
- jmp $
-.endproc
-
-
-
+ mov ecx, TRAP_CAUSE_UNKNOWN
+// mov rdx, // The unexpected interrupt
+// mov rdx, // The unknown floating-point exception
+// mov r8, // The enabled and asserted status bits
+ xor r9, r9 // Reserved
+ mov [rbp + KTRAP_FRAME_P5], rbp // trap frame
+ call _KeBugCheckWithTf
+
+.endproc
+
+
+.proc KiSystemFatalException
+
+.endproc
+