MsgUnimplemented:
.asciz "WARNING: %s at %s:%d is UNIMPLEMENTED!\n"
+MsgPageFault:
+.asciz "Page fault! Code = 0x%x, RIP = %p, FaultingAddress = %p\n"
+
+MsgGeneralProtFault:
+.asciz "General protection fault at %p!\n"
+
+MsgBreakpointTrap:
+.asciz "BreakpointTrap at %p\n"
+
+MsgUnexpectedInterrupt:
+.asciz "UnexpectedInterrupt Vector=0x%02lx\n"
+
+MsgInvalidOpcodeFault:
+.asciz "Invalid opcode fault at %p!\n"
+
+MsgDoubleFault:
+.asciz "Double fault at %p, rbp=%p!\n"
+
+MsgTrapInfo:
+.asciz "Trap: %s at %p\n"
+
+MACRO(TRAPINFO, func)
+LOCAL label1, label2
+#if 0
+ jmp label2
+label1: .asciz "\func"
+label2:
+ push rax
+ push rcx
+ push rdx
+ push r8
+ push r9
+ push r10
+ push r11
+ sub rsp, 32
+ lea rcx, MsgTrapInfo[rip]
+ lea rdx, 1b[rip]
+ mov r8, [rbp + KTRAP_FRAME_Rip]
+ call qword ptr FrLdrDbgPrint[rip]
+ pop r11
+ pop r10
+ pop r9
+ pop r8
+ pop rdx
+ pop rcx
+ pop rax
+ add rsp, 32
+#endif
+ENDM
/* Helper Macros *************************************************************/
// rbp = TrapFrame, eax = ExceptionCode, edx = NumParams, r9,r10,r11 = params
-.PROC InternalDispatchException
+FUNC InternalDispatchException
/* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
sub rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH
add rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH
ret
-.ENDP
+ENDFUNC InternalDispatchException
/* CPU EXCEPTION HANDLERS ****************************************************/
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiDivideErrorFault
PUBLIC KiDebugTrapOrFault
/* Push pseudo error code */
EnterTrap TF_SAVE_ALL
+ TRAPINFO KiDebugTrapOrFault
+
/* Check if the frame was from kernelmode */
test word ptr [rbp + KTRAP_FRAME_SegCs], 3
jz KiDebugTrapOrFaultKMode
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiDebugTrapOrFault
PUBLIC KiNmiInterrupt
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiNmiInterrupt
PUBLIC KiBreakpointTrap
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiBreakpointTrap
PUBLIC KiOverflowTrap
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiOverflowTrap
PUBLIC KiBoundFault
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiBoundFault
PUBLIC KiInvalidOpcodeFault
/* No error code */
EnterTrap TF_SAVE_ALL
+ TRAPINFO KiInvalidOpcodeFault
+
+ mov rdx, [rbp + KTRAP_FRAME_Rip]
+ lea rcx, MsgInvalidOpcodeFault[rip]
+ call qword ptr FrLdrDbgPrint[rip]
+
/* Enable interrupts */
sti
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiInvalidOpcodeFault
PUBLIC KiNpxNotAvailableFault
KiNpxNotAvailableFaultExit:
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiNpxNotAvailableFault
PUBLIC KiDoubleFaultAbort
/* No error code */
EnterTrap TF_SAVE_ALL
+ lea rcx, MsgDoubleFault[rip]
+ mov rdx, [rbp + KTRAP_FRAME_FaultAddress]
+ mov r8, rbp
+ call qword ptr FrLdrDbgPrint[rip]
+
/* Bugcheck */
Fatal 8 // EXCEPTION_DOUBLE_FAULT
jmp $
-ENDFUNC
+ENDFUNC KiDoubleFaultAbort
PUBLIC KiNpxSegmentOverrunAbort
/* Bugcheck */
Fatal EXCEPTION_NPX_OVERRUN
+
jmp $
-ENDFUNC
+ENDFUNC KiNpxSegmentOverrunAbort
PUBLIC KiInvalidTssFault
/* Bugcheck */
Fatal EXCEPTION_INVALID_TSS
jmp $
-ENDFUNC
+ENDFUNC KiInvalidTssFault
PUBLIC KiSegmentNotPresentFault
/* Bugcheck */
Fatal EXCEPTION_SEGMENT_NOT_PRESENT
jmp $
-ENDFUNC
+ENDFUNC KiSegmentNotPresentFault
PUBLIC KiStackFault
/* Bugcheck */
Fatal EXCEPTION_STACK_FAULT
jmp $
-ENDFUNC
+ENDFUNC KiStackFault
PUBLIC KiGeneralProtectionFault
/* We have an error code */
EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL)
+ //TRAPINFO KiGeneralProtectionFault
+ //mov rdx, [rbp + KTRAP_FRAME_Rip]
+ //lea rcx, MsgGeneralProtFault[rip]
+ //call qword ptr FrLdrDbgPrint[rip]
+
/* Call the C handler */
mov rcx, rbp
call KiGeneralProtectionFaultHandler
/* Return */
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiGeneralProtectionFault
PUBLIC KiPageFault
/* We have an error code */
EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL)
+ TRAPINFO KiPageFault
+
+#if 0
+ lea rcx, MsgPageFault[rip]
+ mov rdx, [rbp + KTRAP_FRAME_ErrorCode]
+ mov r8, [rbp + KTRAP_FRAME_Rip]
+ mov r9, [rbp + KTRAP_FRAME_FaultAddress]
+ call qword ptr FrLdrDbgPrint[rip]
+#endif
+
/* Save page fault address */
mov rdx, cr2
mov [rbp + KTRAP_FRAME_FaultAddress], rdx
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiFloatingErrorFault
PUBLIC KiAlignmentFault
/* Bugcheck */
Fatal EXCEPTION_ALIGNMENT_CHECK
jmp $
-ENDFUNC
+ENDFUNC KiAlignmentFault
PUBLIC KiMcheckAbort
/* Bugcheck */
Fatal HEX(12)
jmp $
-ENDFUNC
+ENDFUNC KiMcheckAbort
PUBLIC KiXmmException
KiXmmExit:
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiXmmException
/* SOFTWARE INTERRUPT SERVICES ***********************************************/
PUBLIC KiRaiseAssertion
FUNC KiRaiseAssertion
/* We have an error code */
- EnterTrap (TF_SAVE_ALL)
+ EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL)
/* Decrement RIP to point to the INT2C instruction (2 bytes, not 1 like INT3) */
sub qword ptr [rbp + KTRAP_FRAME_Rip], 2
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiRaiseAssertion
PUBLIC KiDebugServiceTrap
-.PROC KiDebugServiceTrap
+FUNC KiDebugServiceTrap
/* No error code */
EnterTrap TF_SAVE_ALL
+ TRAPINFO KiDebugServiceTrap
+
/* Increase Rip to skip the int3 */
inc qword ptr [rbp + KTRAP_FRAME_Rip]
/* Return */
ExitTrap TF_SAVE_ALL
-.ENDP
+ENDFUNC KiDebugServiceTrap
PUBLIC KiApcInterrupt
#endif
/* Return */
ExitTrap TF_SAVE_ALL
-ENDFUNC
+ENDFUNC KiUnexpectedInterrupt
PUBLIC KiInterruptDispatch
FUNC KiInterruptDispatch