diff --git a/reactos/ntoskrnl/ke/amd64/trap.S b/reactos/ntoskrnl/ke/amd64/trap.S index f690615bc6f..28ec7c0774b 100644 --- a/reactos/ntoskrnl/ke/amd64/trap.S +++ b/reactos/ntoskrnl/ke/amd64/trap.S @@ -8,8 +8,8 @@ /* INCLUDES ******************************************************************/ #include - #include +#include EXTERN KiDispatchException:PROC EXTERN FrLdrDbgPrint:DWORD @@ -28,232 +28,23 @@ PUBLIC MsgUnimplemented 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: - sub rsp, 32 - lea rcx, MsgTrapInfo[rip] - lea rdx, 1b[rip] - mov r8, [rbp + KTRAP_FRAME_Rip] - call qword ptr FrLdrDbgPrint[rip] - add rsp, 32 -#endif -ENDM /* Helper Macros *************************************************************/ -#define TRAPFLAG_VOLATILES HEX(01) -#define TRAPFLAG_NONVOLATILES HEX(02) -#define TRAPFLAG_XMM HEX(04) -#define TRAPFLAG_SEGMENTS HEX(08) -#define TRAPFLAG_DEBUG HEX(10) -#define TRAPFLAG_HAS_ERRORCODE HEX(100) - -#define TRAPFLAG_SYSTEMSERVICE (TRAPFLAG_VOLATILES|TRAPFLAG_DEBUG) -#define TRAPFLAG_ALL HEX(ff) - -/* - * Stack Layout: - * |-------------------| - * | KTRAP_FRAME | - * |-------------------| <- rbp - * | EXCEPTION_RECORD | - * |-------------------| - * | KEXCEPTION_FRAME | - * |-------------------| <- rsp - * - */ - -/* - * ENTER_TRAP_FRAME - Allocate KTRAP_FRAME_LENGTH and save registers to it - */ -MACRO(ENTER_TRAP_FRAME, Flags) -LOCAL dont_swap - - /* Save the trap flags for this trap */ - TRAPFLAGS = VAL(Flags) - - /* Size of hardware trap frame */ -if (TRAPFLAGS AND TRAPFLAG_HAS_ERRORCODE) - .pushframe code - SIZE_INITIAL_FRAME = 6 * 8 -else - .pushframe - SIZE_INITIAL_FRAME = 5 * 8 -endif - - /* Make room for a KTRAP_FRAME */ - sub rsp, (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME) - .allocstack (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME) - .endprolog - - /* Save rbp */ - mov [rsp + KTRAP_FRAME_Rbp], rbp - - /* Point rbp to the KTRAP_FRAME */ - lea rbp, [rsp] - -if (TRAPFLAGS AND TRAPFLAG_NONVOLATILES) - /* Save non-volatile registers */ - mov [rbp + KTRAP_FRAME_Rbx], rbx - mov [rbp + KTRAP_FRAME_Rdi], rdi - mov [rbp + KTRAP_FRAME_Rsi], rsi -endif - -if (TRAPFLAGS AND TRAPFLAG_VOLATILES) - /* Save volatile registers */ - mov [rbp + KTRAP_FRAME_Rax], rax - mov [rbp + KTRAP_FRAME_Rcx], rcx - mov [rbp + KTRAP_FRAME_Rdx], rdx - mov [rbp + KTRAP_FRAME_R8], r8 - mov [rbp + KTRAP_FRAME_R9], r9 - mov [rbp + KTRAP_FRAME_R10], r10 - mov [rbp + KTRAP_FRAME_R11], r11 -endif - -if (TRAPFLAGS AND TRAPFLAG_XMM) - /* Save xmm registers */ - movdqa [rbp + KTRAP_FRAME_Xmm0], xmm0 - movdqa [rbp + KTRAP_FRAME_Xmm1], xmm1 - movdqa [rbp + KTRAP_FRAME_Xmm2], xmm2 - movdqa [rbp + KTRAP_FRAME_Xmm3], xmm3 - movdqa [rbp + KTRAP_FRAME_Xmm4], xmm4 - movdqa [rbp + KTRAP_FRAME_Xmm5], xmm5 -endif - -if (TRAPFLAGS AND TRAPFLAG_SEGMENTS) - /* Save segment selectors */ - mov ax, ds - mov [rbp + KTRAP_FRAME_SegDs], ax - mov ax, es - mov [rbp + KTRAP_FRAME_SegEs], ax - mov ax, fs - mov [rbp + KTRAP_FRAME_SegFs], ax - mov ax, gs - mov [rbp + KTRAP_FRAME_SegGs], ax -endif - - /* Save previous mode and swap gs when it was UserMode */ - mov ax, [rbp + KTRAP_FRAME_SegCs] - and al, 1 - mov [rbp + KTRAP_FRAME_PreviousMode], al - jz dont_swap - swapgs -dont_swap: - - /* Save previous irql */ - mov rax, cr8 - mov [rbp + KTRAP_FRAME_PreviousIrql], al - -// KTRAP_FRAME_FaultIndicator -// KTRAP_FRAME_ExceptionActive -// KTRAP_FRAME_MxCsr - -if (TRAPFLAGS AND TRAPFLAG_DEBUG) - /* Save debug registers */ - mov rax, dr0 - mov [rbp + KTRAP_FRAME_Dr0], rax - mov rax, dr1 - mov [rbp + KTRAP_FRAME_Dr1], rax - mov rax, dr2 - mov [rbp + KTRAP_FRAME_Dr2], rax - mov rax, dr3 - mov [rbp + KTRAP_FRAME_Dr3], rax - mov rax, dr6 - mov [rbp + KTRAP_FRAME_Dr6], rax - mov rax, dr7 - mov [rbp + KTRAP_FRAME_Dr7], rax -endif - -// KTRAP_FRAME_DebugControl -// KTRAP_FRAME_LastBranchToRip -// KTRAP_FRAME_LastBranchFromRip -// KTRAP_FRAME_LastExceptionToRip -// KTRAP_FRAME_LastExceptionFromRip -// KTRAP_FRAME_TrapFrame - - /* Make sure the direction flag is cleared */ - cld +MACRO(DispatchException, Status, Number, P1, P2, P3) + mov eax, Status + mov edx, Number + mov r9, P1 + mov r10, P2 + mov r11, P3 + call InternalDispatchException ENDM - -/* - * LEAVE_TRAP_FRAME - Restore registers and free stack space - */ -MACRO(LEAVE_TRAP_FRAME) -LOCAL dont_swap_back -if (TRAPFLAGS AND TRAPFLAG_SEGMENTS) - /* Restore segment selectors */ - mov ax, [rbp + KTRAP_FRAME_SegDs] - mov ds, ax - mov ax, [rbp + KTRAP_FRAME_SegEs] - mov es, ax - mov ax, [rbp + KTRAP_FRAME_SegFs] - mov fs, ax -endif - - test byte ptr [rbp + KTRAP_FRAME_PreviousMode], 1 - jz dont_swap_back - swapgs -dont_swap_back: - -if (TRAPFLAGS AND TRAPFLAG_NONVOLATILES) - /* Restore non-volatile registers */ - mov rbx, [rbp + KTRAP_FRAME_Rbx] - mov rdi, [rbp + KTRAP_FRAME_Rdi] - mov rsi, [rbp + KTRAP_FRAME_Rsi] -endif - -if (TRAPFLAGS AND TRAPFLAG_VOLATILES) - /* Restore volatile registers */ - mov rax, [rbp + KTRAP_FRAME_Rax] - mov rcx, [rbp + KTRAP_FRAME_Rcx] - mov rdx, [rbp + KTRAP_FRAME_Rdx] - mov r8, [rbp + KTRAP_FRAME_R8] - mov r9, [rbp + KTRAP_FRAME_R9] - mov r10, [rbp + KTRAP_FRAME_R10] - mov r11, [rbp + KTRAP_FRAME_R11] -endif - -if (TRAPFLAGS AND TRAPFLAG_XMM) - /* Restore xmm registers */ - movdqa xmm0, [rbp + KTRAP_FRAME_Xmm0] - movdqa xmm1, [rbp + KTRAP_FRAME_Xmm1] - movdqa xmm2, [rbp + KTRAP_FRAME_Xmm2] - movdqa xmm3, [rbp + KTRAP_FRAME_Xmm3] - movdqa xmm4, [rbp + KTRAP_FRAME_Xmm4] - movdqa xmm5, [rbp + KTRAP_FRAME_Xmm5] -endif - - /* Restore rbp */ - mov rbp, [rbp + KTRAP_FRAME_Rbp] - - /* Adjust stack pointer */ - add rsp, KTRAP_FRAME_Rip +MACRO(Fatal, BugcheckCode) + /* Bugcheck */ + mov ecx, BugcheckCode + mov rdx, rbp + call KiSystemFatalException ENDM @@ -348,33 +139,25 @@ ENDR /* SOFTWARE INTERRUPT SERVICES ***********************************************/ PUBLIC KiDivideErrorFault -.PROC KiDivideErrorFault +FUNC KiDivideErrorFault /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL + EnterTrap TF_SAVE_ALL /* Enable interrupts */ sti /* Dispatch the exception */ - mov eax, STATUS_INTEGER_DIVIDE_BY_ZERO - mov edx, 0 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException STATUS_INTEGER_DIVIDE_BY_ZERO, 0, 0, 0, 0 /* Return */ - LEAVE_TRAP_FRAME - iretq -.ENDP KiDivideErrorFault + ExitTrap TF_SAVE_ALL +ENDFUNC KiDivideErrorFault PUBLIC KiDebugTrapOrFault -.PROC KiDebugTrapOrFault +FUNC KiDebugTrapOrFault /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL - - TRAPINFO KiDebugTrapOrFault + EnterTrap TF_SAVE_ALL /* Check if the frame was from kernelmode */ test word ptr [rbp + KTRAP_FRAME_SegCs], 3 @@ -384,125 +167,84 @@ PUBLIC KiDebugTrapOrFault sti KiDebugTrapOrFaultKMode: - /* Dispatch the exception */ - mov eax, STATUS_SINGLE_STEP - mov edx, 0 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException STATUS_SINGLE_STEP, 0, 0, 0, 0 /* Return */ - LEAVE_TRAP_FRAME - iretq -.ENDP KiDebugTrapOrFault + ExitTrap TF_SAVE_ALL +ENDFUNC KiDebugTrapOrFault PUBLIC KiNmiInterrupt -.PROC KiNmiInterrupt +FUNC KiNmiInterrupt /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL + EnterTrap TF_SAVE_ALL UNIMPLEMENTED KiNmiInterrupt - - jmp $ + int 3 /* Return */ - LEAVE_TRAP_FRAME - iretq -.ENDP KiNmiInterrupt + ExitTrap TF_SAVE_ALL +ENDFUNC KiNmiInterrupt PUBLIC KiBreakpointTrap -.PROC KiBreakpointTrap +FUNC KiBreakpointTrap /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL - - TRAPINFO KiBreakpointTrap - -// lea rcx, MsgBreakpointTrap[rip] -// mov rdx, rsp -// call qword ptr FrLdrDbgPrint[rip] + EnterTrap TF_SAVE_ALL /* Dispatch the exception */ - mov eax, STATUS_BREAKPOINT - mov edx, 3 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException STATUS_BREAKPOINT, 3, 0, 0, 0 /* Return */ - LEAVE_TRAP_FRAME - iretq -.ENDP KiBreakpointTrap + ExitTrap TF_SAVE_ALL +ENDFUNC KiBreakpointTrap PUBLIC KiOverflowTrap -.PROC KiOverflowTrap +FUNC KiOverflowTrap /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL + EnterTrap TF_SAVE_ALL /* Enable interrupts */ sti /* Dispatch the exception */ - mov eax, STATUS_INTEGER_OVERFLOW - mov edx, 3 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException STATUS_INTEGER_OVERFLOW, 3, 0, 0, 0 /* Return */ - LEAVE_TRAP_FRAME - iretq -.ENDP KiOverflowTrap + ExitTrap TF_SAVE_ALL +ENDFUNC KiOverflowTrap PUBLIC KiBoundFault -.PROC KiBoundFault - /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL +FUNC KiBoundFault + /* No error code */ + EnterTrap TF_SAVE_ALL /* Check if the frame was from kernelmode */ test word ptr [rbp + KTRAP_FRAME_SegCs], 3 - jnz KiBoundFaltUserMode + jnz KiBoundFaultUserMode /* Bugcheck */ - mov ecx, EXCEPTION_BOUND_CHECK - mov rdx, rbp - call KiSystemFatalException + Fatal EXCEPTION_BOUND_CHECK -KiBoundFaltUserMode: +KiBoundFaultUserMode: /* Enable interrupts for user-mode */ sti /* Dispatch the exception */ - mov eax, STATUS_INTEGER_OVERFLOW - mov edx, 3 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException STATUS_ARRAY_BOUNDS_EXCEEDED, 0, 0, 0, 0 /* Return */ - LEAVE_TRAP_FRAME - iretq -.ENDP KiBoundFault + ExitTrap TF_SAVE_ALL +ENDFUNC KiBoundFault PUBLIC KiInvalidOpcodeFault -.PROC KiInvalidOpcodeFault - /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL - - TRAPINFO KiInvalidOpcodeFault - - mov rdx, [rbp + KTRAP_FRAME_Rip] - lea rcx, MsgInvalidOpcodeFault[rip] - call qword ptr FrLdrDbgPrint[rip] +FUNC KiInvalidOpcodeFault + /* No error code */ + EnterTrap TF_SAVE_ALL /* Enable interrupts */ sti @@ -517,23 +259,17 @@ KiInvalidOpcodeKernel: /* Kernel mode fault */ /* Dispatch the exception */ - mov eax, STATUS_ILLEGAL_INSTRUCTION - mov edx, 3 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException STATUS_ILLEGAL_INSTRUCTION, 3, 0, 0, 0 /* Return */ - LEAVE_TRAP_FRAME - iretq -.ENDP KiInvalidOpcodeFault + ExitTrap TF_SAVE_ALL +ENDFUNC KiInvalidOpcodeFault PUBLIC KiNpxNotAvailableFault -.PROC KiNpxNotAvailableFault - /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL +FUNC KiNpxNotAvailableFault + /* No error code */ + EnterTrap TF_SAVE_ALL /* Call the C handler */ mov rcx, rbp @@ -544,103 +280,73 @@ PUBLIC KiNpxNotAvailableFault jz KiNpxNotAvailableFaultExit /* Dispatch the exception */ - mov edx, 3 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException eax, 3, 0, 0, 0 KiNpxNotAvailableFaultExit: /* Return */ - LEAVE_TRAP_FRAME - iretq -.ENDP KiNpxNotAvailableFault + ExitTrap TF_SAVE_ALL +ENDFUNC KiNpxNotAvailableFault PUBLIC KiDoubleFaultAbort -.PROC KiDoubleFaultAbort - /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL - - lea rcx, MsgDoubleFault[rip] - mov rdx, [rbp + KTRAP_FRAME_FaultAddress] - mov r8, rbp - call qword ptr FrLdrDbgPrint[rip] +FUNC KiDoubleFaultAbort + /* No error code */ + EnterTrap TF_SAVE_ALL /* Bugcheck */ - mov ecx, 8 // EXCEPTION_DOUBLE_FAULT - mov rdx, rbp - call KiSystemFatalException - + Fatal 8 // EXCEPTION_DOUBLE_FAULT jmp $ -.ENDP KiDoubleFaultAbort +ENDFUNC KiDoubleFaultAbort PUBLIC KiNpxSegmentOverrunAbort -.PROC KiNpxSegmentOverrunAbort - /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL +FUNC KiNpxSegmentOverrunAbort + /* No error code */ + EnterTrap TF_SAVE_ALL /* Bugcheck */ - mov ecx, EXCEPTION_NPX_OVERRUN - mov rdx, rbp - call KiSystemFatalException - + Fatal EXCEPTION_NPX_OVERRUN jmp $ -.ENDP KiNpxSegmentOverrunAbort +ENDFUNC KiNpxSegmentOverrunAbort PUBLIC KiInvalidTssFault -.PROC KiInvalidTssFault +FUNC KiInvalidTssFault /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) /* Bugcheck */ - mov ecx, EXCEPTION_INVALID_TSS - mov rdx, rbp - call KiSystemFatalException - + Fatal EXCEPTION_INVALID_TSS jmp $ -.ENDP KiInvalidTssFault +ENDFUNC KiInvalidTssFault PUBLIC KiSegmentNotPresentFault -.PROC KiSegmentNotPresentFault +FUNC KiSegmentNotPresentFault /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) /* Bugcheck */ - mov ecx, EXCEPTION_SEGMENT_NOT_PRESENT - mov rdx, rbp - call KiSystemFatalException - + Fatal EXCEPTION_SEGMENT_NOT_PRESENT jmp $ -.ENDP KiSegmentNotPresentFault +ENDFUNC KiSegmentNotPresentFault PUBLIC KiStackFault -.PROC KiStackFault +FUNC KiStackFault /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) /* Bugcheck */ - mov ecx, EXCEPTION_STACK_FAULT - mov rdx, rbp - call KiSystemFatalException - + Fatal EXCEPTION_STACK_FAULT jmp $ -.ENDP KiStackFault +ENDFUNC KiStackFault PUBLIC KiGeneralProtectionFault -.PROC KiGeneralProtectionFault +FUNC KiGeneralProtectionFault /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) - - //TRAPINFO KiGeneralProtectionFault - //mov rdx, [rbp + KTRAP_FRAME_Rip] - //lea rcx, MsgGeneralProtFault[rip] - //call qword ptr FrLdrDbgPrint[rip] + EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) /* Call the C handler */ mov rcx, rbp @@ -651,11 +357,7 @@ PUBLIC KiGeneralProtectionFault jge KiGpfExit /* Dispatch the exception */ - mov edx, 3 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException eax, 3, 0, 0, 0 KiGpfFatal: @@ -670,25 +372,15 @@ KiGpfFatal: KiGpfExit: /* Return */ - LEAVE_TRAP_FRAME - iretq -.ENDP KiGeneralProtectionFault + /* Return */ + ExitTrap TF_SAVE_ALL +ENDFUNC KiGeneralProtectionFault PUBLIC KiPageFault -.PROC KiPageFault +FUNC KiPageFault /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_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 + EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) /* Save page fault address */ mov rdx, cr2 @@ -721,6 +413,7 @@ PUBLIC KiPageFault je SpecialCode InPageException: + /* Dispatch in-page exception */ mov r11d, eax // Param3 = Status mov eax, STATUS_IN_PAGE_ERROR // ExceptionCode @@ -738,57 +431,50 @@ SpecialCode: call InternalDispatchException PageFaultReturn: - LEAVE_TRAP_FRAME - iretq -.ENDP KiPageFault + /* Return */ + ExitTrap TF_SAVE_ALL +ENDFUNC KiPageFault PUBLIC KiFloatingErrorFault -.PROC KiFloatingErrorFault - /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL +FUNC KiFloatingErrorFault + /* No error code */ + EnterTrap TF_SAVE_ALL UNIMPLEMENTED KiFloatingErrorFault + int 3 - jmp $ -.ENDP KiFloatingErrorFault + /* Return */ + ExitTrap TF_SAVE_ALL +ENDFUNC KiFloatingErrorFault PUBLIC KiAlignmentFault -.PROC KiAlignmentFault +FUNC KiAlignmentFault /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) - - /* Enable interrupts */ - sti + EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) /* Bugcheck */ - mov ecx, EXCEPTION_ALIGNMENT_CHECK - mov rdx, rbp - call KiSystemFatalException - + Fatal EXCEPTION_ALIGNMENT_CHECK jmp $ -.ENDP KiAlignmentFault +ENDFUNC KiAlignmentFault PUBLIC KiMcheckAbort -.PROC KiMcheckAbort - /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL +FUNC KiMcheckAbort + /* No error code */ + EnterTrap TF_SAVE_ALL /* Bugcheck */ - mov ecx, HEX(12) - mov rdx, rbp - call KiSystemFatalException - + Fatal HEX(12) jmp $ -.ENDP KiMcheckAbort +ENDFUNC KiMcheckAbort PUBLIC KiXmmException -.PROC KiXmmException - /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL +FUNC KiXmmException + /* No error code */ + EnterTrap TF_SAVE_ALL /* Call the C handler */ mov rcx, rbp @@ -799,99 +485,54 @@ PUBLIC KiXmmException jge KiXmmExit /* Dispatch the exception */ - mov edx, 3 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException eax, 3, 0, 0, 0 KiXmmExit: - LEAVE_TRAP_FRAME - iretq -.ENDP KiXmmException - - -PUBLIC KiApcInterrupt -.PROC KiApcInterrupt - /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) - - UNIMPLEMENTED KiApcInterrupt - - jmp $ -.ENDP KiApcInterrupt + /* Return */ + ExitTrap TF_SAVE_ALL +ENDFUNC KiXmmException PUBLIC KiRaiseAssertion -.PROC KiRaiseAssertion +FUNC KiRaiseAssertion /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_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 /* Dispatch the exception */ - mov eax, STATUS_ASSERTION_FAILURE - mov edx, 0 - mov r9, 0 - mov r10, 0 - mov r11, 0 - call InternalDispatchException + DispatchException STATUS_ASSERTION_FAILURE, 0, 0, 0, 0 - LEAVE_TRAP_FRAME - iretq -.ENDP KiRaiseAssertion + /* Return */ + ExitTrap TF_SAVE_ALL +ENDFUNC KiRaiseAssertion PUBLIC KiDebugServiceTrap .PROC KiDebugServiceTrap - /* Push pseudo error code */ - ENTER_TRAP_FRAME TRAPFLAG_ALL - - TRAPINFO KiDebugServiceTrap + /* No error code */ + EnterTrap TF_SAVE_ALL /* Increase Rip to skip the int3 */ inc qword ptr [rbp + KTRAP_FRAME_Rip] - /* Dispatch the exception */ - mov eax, STATUS_BREAKPOINT - mov edx, 3 - mov r9, [rbp+KTRAP_FRAME_Rax] // Service - mov r10, [rbp+KTRAP_FRAME_Rcx] // Buffer - mov r11, [rbp+KTRAP_FRAME_Rdx] // Length - call InternalDispatchException + /* Dispatch the exception (Params = service, buffer, legth) */ + DispatchException STATUS_BREAKPOINT, 3, [rbp+KTRAP_FRAME_Rax], [rbp+KTRAP_FRAME_Rcx], [rbp+KTRAP_FRAME_Rdx] - LEAVE_TRAP_FRAME; - iretq + /* Return */ + ExitTrap TF_SAVE_ALL .ENDP KiDebugServiceTrap - -PUBLIC KiDpcInterrupt -.PROC KiDpcInterrupt - /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) - - UNIMPLEMENTED KiDpcInterrupt - - jmp $ -.ENDP KiDpcInterrupt - - -PUBLIC KiIpiInterrupt -.PROC KiIpiInterrupt - /* We have an error code */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) - - UNIMPLEMENTED KiIpiInterrupt - - jmp $ -.ENDP KiIpiInterrupt +TRAP_ENTRY KiApcInterrupt, (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) +TRAP_ENTRY KiDpcInterrupt, (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) +TRAP_ENTRY KiIpiInterrupt, (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) PUBLIC KiUnexpectedInterrupt -.PROC KiUnexpectedInterrupt +FUNC KiUnexpectedInterrupt /* The error code is the vector */ - ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL) + EnterTrap (TF_HAS_ERROR_CODE OR TF_SAVE_ALL) #if 0 /* Set bugcheck parameters */ @@ -904,9 +545,9 @@ PUBLIC KiUnexpectedInterrupt call KeBugCheckWithTf jmp $ #endif - LEAVE_TRAP_FRAME; - iretq -.ENDP KiUnexpectedInterrupt + /* Return */ + ExitTrap TF_SAVE_ALL +ENDFUNC KiUnexpectedInterrupt #ifdef _MSC_VER #undef lgdt