2 * FILE: ntoskrnl/ke/amd64/trap.S
3 * COPYRIGHT: See COPYING in the top level directory
4 * PURPOSE: System Traps, Entrypoints and Exitpoints
5 * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
8 /* INCLUDES ******************************************************************/
12 #include <ksamd64.inc>
14 EXTERN KiDispatchException:PROC
15 EXTERN FrLdrDbgPrint:DWORD
16 EXTERN KeBugCheckWithTf:PROC
17 EXTERN MmAccessFault:PROC
18 EXTERN KiSystemFatalException:PROC
19 EXTERN KiNpxNotAvailableFaultHandler:PROC
20 EXTERN KiGeneralProtectionFaultHandler:PROC
21 EXTERN KiXmmExceptionHandler:PROC
23 /* GLOBALS *******************************************************************/
27 PUBLIC MsgUnimplemented
29 .asciz "WARNING: %s at %s:%d is UNIMPLEMENTED!\n"
32 .asciz "Page fault! Code = 0x%x, RIP = %p, FaultingAddress = %p\n"
35 .asciz "General protection fault at %p!\n"
38 .asciz "BreakpointTrap at %p\n"
40 MsgUnexpectedInterrupt:
41 .asciz "UnexpectedInterrupt Vector=0x%02lx\n"
43 MsgInvalidOpcodeFault:
44 .asciz "Invalid opcode fault at %p!\n"
47 .asciz "Double fault at %p, rbp=%p!\n"
50 .asciz "Trap: %s at %p\n"
56 label1: .asciz "\func"
59 lea rcx, MsgTrapInfo[rip]
61 mov r8, [rbp + KTRAP_FRAME_Rip]
62 call qword ptr FrLdrDbgPrint[rip]
67 /* Helper Macros *************************************************************/
69 #define TRAPFLAG_VOLATILES HEX(01)
70 #define TRAPFLAG_NONVOLATILES HEX(02)
71 #define TRAPFLAG_XMM HEX(04)
72 #define TRAPFLAG_SEGMENTS HEX(08)
73 #define TRAPFLAG_DEBUG HEX(10)
74 #define TRAPFLAG_HAS_ERRORCODE HEX(100)
76 #define TRAPFLAG_SYSTEMSERVICE (TRAPFLAG_VOLATILES|TRAPFLAG_DEBUG)
77 #define TRAPFLAG_ALL HEX(ff)
81 * |-------------------|
83 * |-------------------| <- rbp
84 * | EXCEPTION_RECORD |
85 * |-------------------|
86 * | KEXCEPTION_FRAME |
87 * |-------------------| <- rsp
92 * ENTER_TRAP_FRAME - Allocate KTRAP_FRAME_LENGTH and save registers to it
94 MACRO(ENTER_TRAP_FRAME, Flags)
97 /* Save the trap flags for this trap */
98 TRAPFLAGS = VAL(Flags)
100 /* Size of hardware trap frame */
101 if (TRAPFLAGS AND TRAPFLAG_HAS_ERRORCODE)
103 SIZE_INITIAL_FRAME = 6 * 8
106 SIZE_INITIAL_FRAME = 5 * 8
109 /* Make room for a KTRAP_FRAME */
110 sub rsp, (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME)
111 .allocstack (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME)
115 mov [rsp + KTRAP_FRAME_Rbp], rbp
117 /* Point rbp to the KTRAP_FRAME */
120 if (TRAPFLAGS AND TRAPFLAG_NONVOLATILES)
121 /* Save non-volatile registers */
122 mov [rbp + KTRAP_FRAME_Rbx], rbx
123 mov [rbp + KTRAP_FRAME_Rdi], rdi
124 mov [rbp + KTRAP_FRAME_Rsi], rsi
127 if (TRAPFLAGS AND TRAPFLAG_VOLATILES)
128 /* Save volatile registers */
129 mov [rbp + KTRAP_FRAME_Rax], rax
130 mov [rbp + KTRAP_FRAME_Rcx], rcx
131 mov [rbp + KTRAP_FRAME_Rdx], rdx
132 mov [rbp + KTRAP_FRAME_R8], r8
133 mov [rbp + KTRAP_FRAME_R9], r9
134 mov [rbp + KTRAP_FRAME_R10], r10
135 mov [rbp + KTRAP_FRAME_R11], r11
138 if (TRAPFLAGS AND TRAPFLAG_XMM)
139 /* Save xmm registers */
140 movdqa [rbp + KTRAP_FRAME_Xmm0], xmm0
141 movdqa [rbp + KTRAP_FRAME_Xmm1], xmm1
142 movdqa [rbp + KTRAP_FRAME_Xmm2], xmm2
143 movdqa [rbp + KTRAP_FRAME_Xmm3], xmm3
144 movdqa [rbp + KTRAP_FRAME_Xmm4], xmm4
145 movdqa [rbp + KTRAP_FRAME_Xmm5], xmm5
148 if (TRAPFLAGS AND TRAPFLAG_SEGMENTS)
149 /* Save segment selectors */
151 mov [rbp + KTRAP_FRAME_SegDs], ax
153 mov [rbp + KTRAP_FRAME_SegEs], ax
155 mov [rbp + KTRAP_FRAME_SegFs], ax
157 mov [rbp + KTRAP_FRAME_SegGs], ax
160 /* Save previous mode and swap gs when it was UserMode */
161 mov ax, [rbp + KTRAP_FRAME_SegCs]
163 mov [rbp + KTRAP_FRAME_PreviousMode], al
168 /* Save previous irql */
170 mov [rbp + KTRAP_FRAME_PreviousIrql], al
172 // KTRAP_FRAME_FaultIndicator
173 // KTRAP_FRAME_ExceptionActive
176 if (TRAPFLAGS AND TRAPFLAG_DEBUG)
177 /* Save debug registers */
179 mov [rbp + KTRAP_FRAME_Dr0], rax
181 mov [rbp + KTRAP_FRAME_Dr1], rax
183 mov [rbp + KTRAP_FRAME_Dr2], rax
185 mov [rbp + KTRAP_FRAME_Dr3], rax
187 mov [rbp + KTRAP_FRAME_Dr6], rax
189 mov [rbp + KTRAP_FRAME_Dr7], rax
192 // KTRAP_FRAME_DebugControl
193 // KTRAP_FRAME_LastBranchToRip
194 // KTRAP_FRAME_LastBranchFromRip
195 // KTRAP_FRAME_LastExceptionToRip
196 // KTRAP_FRAME_LastExceptionFromRip
197 // KTRAP_FRAME_TrapFrame
199 /* Make sure the direction flag is cleared */
205 * LEAVE_TRAP_FRAME - Restore registers and free stack space
207 MACRO(LEAVE_TRAP_FRAME)
209 if (TRAPFLAGS AND TRAPFLAG_SEGMENTS)
210 /* Restore segment selectors */
211 mov ax, [rbp + KTRAP_FRAME_SegDs]
213 mov ax, [rbp + KTRAP_FRAME_SegEs]
215 mov ax, [rbp + KTRAP_FRAME_SegFs]
219 test byte ptr [rbp + KTRAP_FRAME_PreviousMode], 1
224 if (TRAPFLAGS AND TRAPFLAG_NONVOLATILES)
225 /* Restore non-volatile registers */
226 mov rbx, [rbp + KTRAP_FRAME_Rbx]
227 mov rdi, [rbp + KTRAP_FRAME_Rdi]
228 mov rsi, [rbp + KTRAP_FRAME_Rsi]
231 if (TRAPFLAGS AND TRAPFLAG_VOLATILES)
232 /* Restore volatile registers */
233 mov rax, [rbp + KTRAP_FRAME_Rax]
234 mov rcx, [rbp + KTRAP_FRAME_Rcx]
235 mov rdx, [rbp + KTRAP_FRAME_Rdx]
236 mov r8, [rbp + KTRAP_FRAME_R8]
237 mov r9, [rbp + KTRAP_FRAME_R9]
238 mov r10, [rbp + KTRAP_FRAME_R10]
239 mov r11, [rbp + KTRAP_FRAME_R11]
242 if (TRAPFLAGS AND TRAPFLAG_XMM)
243 /* Restore xmm registers */
244 movdqa xmm0, [rbp + KTRAP_FRAME_Xmm0]
245 movdqa xmm1, [rbp + KTRAP_FRAME_Xmm1]
246 movdqa xmm2, [rbp + KTRAP_FRAME_Xmm2]
247 movdqa xmm3, [rbp + KTRAP_FRAME_Xmm3]
248 movdqa xmm4, [rbp + KTRAP_FRAME_Xmm4]
249 movdqa xmm5, [rbp + KTRAP_FRAME_Xmm5]
253 mov rbp, [rbp + KTRAP_FRAME_Rbp]
255 /* Adjust stack pointer */
256 add rsp, KTRAP_FRAME_Rip
260 /* FUNCTIONS *****************************************************************/
267 PUBLIC InterruptDispatchTable
268 InterruptDispatchTable:
272 jmp KiUnexpectedInterrupt
277 // rbp = TrapFrame, eax = ExceptionCode, edx = NumParams, r9,r10,r11 = params
278 .PROC InternalDispatchException
280 /* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
281 sub rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH
282 .allocstack (EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH)
285 /* Set up EXCEPTION_RECORD */
286 lea rcx, [rsp + KEXCEPTION_FRAME_LENGTH]
287 mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax
289 mov [rcx + EXCEPTION_RECORD_ExceptionFlags], eax
290 mov [rcx + EXCEPTION_RECORD_ExceptionRecord], rax
291 mov rax, [rbp + KTRAP_FRAME_Rip]
292 mov [rcx + EXCEPTION_RECORD_ExceptionAddress], rax
293 mov [rcx + EXCEPTION_RECORD_NumberParameters], edx
294 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(00)], r9
295 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(08)], r10
296 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(10)], r11
298 /* Set up KEXCEPTION_FRAME */
299 mov rax, [rbp + KTRAP_FRAME_Rbp]
300 mov [rsp + KEXCEPTION_FRAME_Rbp], rax
301 mov [rsp + KEXCEPTION_FRAME_Rbx], rbx
302 mov [rsp + KEXCEPTION_FRAME_Rdi], rdi
303 mov [rsp + KEXCEPTION_FRAME_Rsi], rsi
304 mov [rsp + KEXCEPTION_FRAME_R12], r12
305 mov [rsp + KEXCEPTION_FRAME_R13], r13
306 mov [rsp + KEXCEPTION_FRAME_R14], r14
307 mov [rsp + KEXCEPTION_FRAME_R15], r15
308 movdqa [rsp + KEXCEPTION_FRAME_Xmm6], xmm6
309 movdqa [rsp + KEXCEPTION_FRAME_Xmm7], xmm7
310 movdqa [rsp + KEXCEPTION_FRAME_Xmm8], xmm8
311 movdqa [rsp + KEXCEPTION_FRAME_Xmm9], xmm9
312 movdqa [rsp + KEXCEPTION_FRAME_Xmm10], xmm10
313 movdqa [rsp + KEXCEPTION_FRAME_Xmm11], xmm11
314 movdqa [rsp + KEXCEPTION_FRAME_Xmm12], xmm12
315 movdqa [rsp + KEXCEPTION_FRAME_Xmm13], xmm13
316 movdqa [rsp + KEXCEPTION_FRAME_Xmm14], xmm14
317 movdqa [rsp + KEXCEPTION_FRAME_Xmm15], xmm15
318 mov qword ptr [rsp + KEXCEPTION_FRAME_Return], 0
320 /* Call KiDispatchException */
321 // rcx already points to ExceptionRecord
322 mov rdx, rsp // ExceptionFrame
323 mov r8, rbp // TrapFrame
324 mov r9b, [r8 + KTRAP_FRAME_PreviousMode] // PreviousMode
325 mov byte ptr [rsp + KEXCEPTION_FRAME_P5], 1 // FirstChance
326 call KiDispatchException
328 /* Restore registers */
329 mov r12, [rsp + KEXCEPTION_FRAME_R12]
330 mov r13, [rsp + KEXCEPTION_FRAME_R13]
331 mov r14, [rsp + KEXCEPTION_FRAME_R14]
332 mov r15, [rsp + KEXCEPTION_FRAME_R15]
333 movdqa xmm6, [rsp + KEXCEPTION_FRAME_Xmm6]
334 movdqa xmm7, [rsp + KEXCEPTION_FRAME_Xmm7]
335 movdqa xmm8, [rsp + KEXCEPTION_FRAME_Xmm8]
336 movdqa xmm9, [rsp + KEXCEPTION_FRAME_Xmm9]
337 movdqa xmm10, [rsp + KEXCEPTION_FRAME_Xmm10]
338 movdqa xmm11, [rsp + KEXCEPTION_FRAME_Xmm11]
339 movdqa xmm12, [rsp + KEXCEPTION_FRAME_Xmm12]
340 movdqa xmm13, [rsp + KEXCEPTION_FRAME_Xmm13]
341 movdqa xmm14, [rsp + KEXCEPTION_FRAME_Xmm14]
342 movdqa xmm15, [rsp + KEXCEPTION_FRAME_Xmm15]
344 add rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH
346 .ENDP InternalDispatchException
349 /* SOFTWARE INTERRUPT SERVICES ***********************************************/
351 PUBLIC KiDivideErrorFault
352 .PROC KiDivideErrorFault
353 /* Push pseudo error code */
354 ENTER_TRAP_FRAME TRAPFLAG_ALL
356 /* Enable interrupts */
359 /* Dispatch the exception */
360 mov eax, STATUS_INTEGER_DIVIDE_BY_ZERO
365 call InternalDispatchException
370 .ENDP KiDivideErrorFault
373 PUBLIC KiDebugTrapOrFault
374 .PROC KiDebugTrapOrFault
375 /* Push pseudo error code */
376 ENTER_TRAP_FRAME TRAPFLAG_ALL
378 TRAPINFO KiDebugTrapOrFault
380 /* Check if the frame was from kernelmode */
381 test word ptr [rbp + KTRAP_FRAME_SegCs], 3
382 jz KiDebugTrapOrFaultKMode
384 /* Enable interrupts for user-mode */
387 KiDebugTrapOrFaultKMode:
389 /* Dispatch the exception */
390 mov eax, STATUS_SINGLE_STEP
395 call InternalDispatchException
400 .ENDP KiDebugTrapOrFault
403 PUBLIC KiNmiInterrupt
405 /* Push pseudo error code */
406 ENTER_TRAP_FRAME TRAPFLAG_ALL
408 UNIMPLEMENTED KiNmiInterrupt
418 PUBLIC KiBreakpointTrap
419 .PROC KiBreakpointTrap
420 /* Push pseudo error code */
421 ENTER_TRAP_FRAME TRAPFLAG_ALL
423 TRAPINFO KiBreakpointTrap
425 // lea rcx, MsgBreakpointTrap[rip]
427 // call qword ptr FrLdrDbgPrint[rip]
429 /* Dispatch the exception */
430 mov eax, STATUS_BREAKPOINT
435 call InternalDispatchException
440 .ENDP KiBreakpointTrap
443 PUBLIC KiOverflowTrap
445 /* Push pseudo error code */
446 ENTER_TRAP_FRAME TRAPFLAG_ALL
448 /* Enable interrupts */
451 /* Dispatch the exception */
452 mov eax, STATUS_INTEGER_OVERFLOW
457 call InternalDispatchException
467 /* Push pseudo error code */
468 ENTER_TRAP_FRAME TRAPFLAG_ALL
470 /* Check if the frame was from kernelmode */
471 test word ptr [rbp + KTRAP_FRAME_SegCs], 3
472 jnz KiBoundFaltUserMode
475 mov ecx, EXCEPTION_BOUND_CHECK
477 call KiSystemFatalException
480 /* Enable interrupts for user-mode */
483 /* Dispatch the exception */
484 mov eax, STATUS_INTEGER_OVERFLOW
489 call InternalDispatchException
497 PUBLIC KiInvalidOpcodeFault
498 .PROC KiInvalidOpcodeFault
499 /* Push pseudo error code */
500 ENTER_TRAP_FRAME TRAPFLAG_ALL
502 TRAPINFO KiInvalidOpcodeFault
504 mov rdx, [rbp + KTRAP_FRAME_Rip]
505 lea rcx, MsgInvalidOpcodeFault[rip]
506 call qword ptr FrLdrDbgPrint[rip]
508 /* Enable interrupts */
511 /* Check if the frame was from kernelmode */
512 test word ptr [rbp + KTRAP_FRAME_SegCs], 3
513 jz KiInvalidOpcodeKernel
515 // FIXME: handle STATUS_INVALID_LOCK_SEQUENCE
517 KiInvalidOpcodeKernel:
518 /* Kernel mode fault */
520 /* Dispatch the exception */
521 mov eax, STATUS_ILLEGAL_INSTRUCTION
526 call InternalDispatchException
531 .ENDP KiInvalidOpcodeFault
534 PUBLIC KiNpxNotAvailableFault
535 .PROC KiNpxNotAvailableFault
536 /* Push pseudo error code */
537 ENTER_TRAP_FRAME TRAPFLAG_ALL
539 /* Call the C handler */
541 call KiNpxNotAvailableFaultHandler
543 /* Check the return status code */
545 jz KiNpxNotAvailableFaultExit
547 /* Dispatch the exception */
552 call InternalDispatchException
554 KiNpxNotAvailableFaultExit:
558 .ENDP KiNpxNotAvailableFault
561 PUBLIC KiDoubleFaultAbort
562 .PROC KiDoubleFaultAbort
563 /* Push pseudo error code */
564 ENTER_TRAP_FRAME TRAPFLAG_ALL
566 lea rcx, MsgDoubleFault[rip]
567 mov rdx, [rbp + KTRAP_FRAME_FaultAddress]
569 call qword ptr FrLdrDbgPrint[rip]
572 mov ecx, 8 // EXCEPTION_DOUBLE_FAULT
574 call KiSystemFatalException
577 .ENDP KiDoubleFaultAbort
580 PUBLIC KiNpxSegmentOverrunAbort
581 .PROC KiNpxSegmentOverrunAbort
582 /* Push pseudo error code */
583 ENTER_TRAP_FRAME TRAPFLAG_ALL
586 mov ecx, EXCEPTION_NPX_OVERRUN
588 call KiSystemFatalException
591 .ENDP KiNpxSegmentOverrunAbort
594 PUBLIC KiInvalidTssFault
595 .PROC KiInvalidTssFault
596 /* We have an error code */
597 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
600 mov ecx, EXCEPTION_INVALID_TSS
602 call KiSystemFatalException
605 .ENDP KiInvalidTssFault
608 PUBLIC KiSegmentNotPresentFault
609 .PROC KiSegmentNotPresentFault
610 /* We have an error code */
611 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
614 mov ecx, EXCEPTION_SEGMENT_NOT_PRESENT
616 call KiSystemFatalException
619 .ENDP KiSegmentNotPresentFault
624 /* We have an error code */
625 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
628 mov ecx, EXCEPTION_STACK_FAULT
630 call KiSystemFatalException
636 PUBLIC KiGeneralProtectionFault
637 .PROC KiGeneralProtectionFault
638 /* We have an error code */
639 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
641 TRAPINFO KiGeneralProtectionFault
642 mov rdx, [rbp + KTRAP_FRAME_Rip]
643 lea rcx, MsgGeneralProtFault[rip]
644 call qword ptr FrLdrDbgPrint[rip]
646 /* Call the C handler */
647 call KiGeneralProtectionFaultHandler
649 /* Check for success */
653 /* Dispatch the exception */
658 call InternalDispatchException
663 mov ecx, UNEXPECTED_KERNEL_MODE_TRAP
664 mov rdx, HEX(000D) // EXCEPTION_GP_FAULT
666 mov r9, [rbp + KTRAP_FRAME_ErrorCode] // error code
668 mov [rsp + KTRAP_FRAME_P5+8], rbp // trap frame
669 call KeBugCheckWithTf
675 .ENDP KiGeneralProtectionFault
680 /* We have an error code */
681 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
686 lea rcx, MsgPageFault[rip]
687 mov rdx, [rbp + KTRAP_FRAME_ErrorCode]
688 mov r8, [rbp + KTRAP_FRAME_Rip]
689 mov r9, [rbp + KTRAP_FRAME_FaultAddress]
690 call qword ptr FrLdrDbgPrint[rip]
693 /* Save page fault address */
695 mov [rbp + KTRAP_FRAME_FaultAddress], rdx
697 /* Call page fault handler */
698 mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // StoreInstruction
701 mov r8b, [rbp + KTRAP_FRAME_SegCs] // Mode
703 mov r9, rbp // TrapInformation
706 /* Check for success */
710 /* Set parameter 1 to error code */
711 mov r9d, [rbp + KTRAP_FRAME_ErrorCode]
713 /* Set parameter2 to faulting address */
714 mov r10, cr2 // Param2 = faulting address
716 cmp eax, STATUS_ACCESS_VIOLATION
718 cmp eax, STATUS_GUARD_PAGE_VIOLATION
720 cmp eax, STATUS_STACK_OVERFLOW
724 /* Dispatch in-page exception */
725 mov r11d, eax // Param3 = Status
726 mov eax, STATUS_IN_PAGE_ERROR // ExceptionCode
727 mov edx, 3 // ParamCount
728 call InternalDispatchException
732 /* Use more proper status code */
733 mov eax, KI_EXCEPTION_ACCESS_VIOLATION
736 /* Setup a normal page fault exception */
737 mov edx, 2 // ParamCount
738 call InternalDispatchException
746 PUBLIC KiFloatingErrorFault
747 .PROC KiFloatingErrorFault
748 /* Push pseudo error code */
749 ENTER_TRAP_FRAME TRAPFLAG_ALL
751 UNIMPLEMENTED KiFloatingErrorFault
754 .ENDP KiFloatingErrorFault
757 PUBLIC KiAlignmentFault
758 .PROC KiAlignmentFault
759 /* We have an error code */
760 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
762 /* Enable interrupts */
766 mov ecx, EXCEPTION_ALIGNMENT_CHECK
768 call KiSystemFatalException
771 .ENDP KiAlignmentFault
776 /* Push pseudo error code */
777 ENTER_TRAP_FRAME TRAPFLAG_ALL
782 call KiSystemFatalException
788 PUBLIC KiXmmException
790 /* Push pseudo error code */
791 ENTER_TRAP_FRAME TRAPFLAG_ALL
793 /* Call the C handler */
795 call KiXmmExceptionHandler
797 /* Check for success */
801 /* Dispatch the exception */
806 call InternalDispatchException
814 PUBLIC KiApcInterrupt
816 /* We have an error code */
817 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
819 UNIMPLEMENTED KiApcInterrupt
825 PUBLIC KiRaiseAssertion
826 .PROC KiRaiseAssertion
827 /* We have an error code */
828 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
830 /* Decrement RIP to point to the INT2C instruction (2 bytes, not 1 like INT3) */
831 sub qword ptr [rbp + KTRAP_FRAME_Rip], 2
833 /* Dispatch the exception */
834 mov eax, STATUS_ASSERTION_FAILURE
839 call InternalDispatchException
843 .ENDP KiRaiseAssertion
846 PUBLIC KiDebugServiceTrap
847 .PROC KiDebugServiceTrap
848 /* Push pseudo error code */
849 ENTER_TRAP_FRAME TRAPFLAG_ALL
851 TRAPINFO KiDebugServiceTrap
853 /* Increase Rip to skip the int3 */
854 inc qword ptr [rbp + KTRAP_FRAME_Rip]
856 /* Dispatch the exception */
857 mov eax, STATUS_BREAKPOINT
859 mov r9, [rbp+KTRAP_FRAME_Rax] // Service
860 mov r10, [rbp+KTRAP_FRAME_Rcx] // Buffer
861 mov r11, [rbp+KTRAP_FRAME_Rdx] // Length
862 call InternalDispatchException
866 .ENDP KiDebugServiceTrap
869 PUBLIC KiDpcInterrupt
871 /* We have an error code */
872 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
874 UNIMPLEMENTED KiDpcInterrupt
880 PUBLIC KiIpiInterrupt
882 /* We have an error code */
883 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
885 UNIMPLEMENTED KiIpiInterrupt
891 PUBLIC KiUnexpectedInterrupt
892 .PROC KiUnexpectedInterrupt
893 /* The error code is the vector */
895 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
897 /* Set bugcheck parameters */
898 mov ecx, TRAP_CAUSE_UNKNOWN
899 mov rdx, [rbp + KTRAP_FRAME_ErrorCode] // the vector
900 mov r8, 0 // The unknown floating-point exception
901 mov r9, 0 // The enabled and asserted status bits
903 mov [rbp + KTRAP_FRAME_P5 + 8], rbp // trap frame
904 call KeBugCheckWithTf
907 .ENDP KiUnexpectedInterrupt
911 //void __lgdt(void *Source);
917 //void __sgdt(void *Destination);
923 // void __lldt(unsigned short Value)
929 //void __sldt(void *Destination);
935 //void __ltr(unsigned short Source);
941 //void __str(unsigned short *Destination);