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 *****************************************************************/
266 PUBLIC InterruptDispatchTable
267 InterruptDispatchTable:
271 jmp KiUnexpectedInterrupt
276 // rbp = TrapFrame, eax = ExceptionCode, edx = NumParams, r9,r10,r11 = params
277 .PROC InternalDispatchException
279 /* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
280 sub rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH
281 .allocstack (EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH)
284 /* Set up EXCEPTION_RECORD */
285 lea rcx, [rsp + KEXCEPTION_FRAME_LENGTH]
286 mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax
288 mov [rcx + EXCEPTION_RECORD_ExceptionFlags], eax
289 mov [rcx + EXCEPTION_RECORD_ExceptionRecord], rax
290 mov rax, [rbp + KTRAP_FRAME_Rip]
291 mov [rcx + EXCEPTION_RECORD_ExceptionAddress], rax
292 mov [rcx + EXCEPTION_RECORD_NumberParameters], edx
293 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(00)], r9
294 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(08)], r10
295 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(10)], r11
297 /* Set up KEXCEPTION_FRAME */
298 mov rax, [rbp + KTRAP_FRAME_Rbp]
299 mov [rsp + KEXCEPTION_FRAME_Rbp], rax
300 mov [rsp + KEXCEPTION_FRAME_Rbx], rbx
301 mov [rsp + KEXCEPTION_FRAME_Rdi], rdi
302 mov [rsp + KEXCEPTION_FRAME_Rsi], rsi
303 mov [rsp + KEXCEPTION_FRAME_R12], r12
304 mov [rsp + KEXCEPTION_FRAME_R13], r13
305 mov [rsp + KEXCEPTION_FRAME_R14], r14
306 mov [rsp + KEXCEPTION_FRAME_R15], r15
307 movdqa [rsp + KEXCEPTION_FRAME_Xmm6], xmm6
308 movdqa [rsp + KEXCEPTION_FRAME_Xmm7], xmm7
309 movdqa [rsp + KEXCEPTION_FRAME_Xmm8], xmm8
310 movdqa [rsp + KEXCEPTION_FRAME_Xmm9], xmm9
311 movdqa [rsp + KEXCEPTION_FRAME_Xmm10], xmm10
312 movdqa [rsp + KEXCEPTION_FRAME_Xmm11], xmm11
313 movdqa [rsp + KEXCEPTION_FRAME_Xmm12], xmm12
314 movdqa [rsp + KEXCEPTION_FRAME_Xmm13], xmm13
315 movdqa [rsp + KEXCEPTION_FRAME_Xmm14], xmm14
316 movdqa [rsp + KEXCEPTION_FRAME_Xmm15], xmm15
317 mov qword ptr [rsp + KEXCEPTION_FRAME_Return], 0
319 /* Call KiDispatchException */
320 // rcx already points to ExceptionRecord
321 mov rdx, rsp // ExceptionFrame
322 mov r8, rbp // TrapFrame
323 mov r9b, [r8 + KTRAP_FRAME_PreviousMode] // PreviousMode
324 mov byte ptr [rsp + KEXCEPTION_FRAME_P5], 1 // FirstChance
325 call KiDispatchException
327 /* Restore registers */
328 mov r12, [rsp + KEXCEPTION_FRAME_R12]
329 mov r13, [rsp + KEXCEPTION_FRAME_R13]
330 mov r14, [rsp + KEXCEPTION_FRAME_R14]
331 mov r15, [rsp + KEXCEPTION_FRAME_R15]
332 movdqa xmm6, [rsp + KEXCEPTION_FRAME_Xmm6]
333 movdqa xmm7, [rsp + KEXCEPTION_FRAME_Xmm7]
334 movdqa xmm8, [rsp + KEXCEPTION_FRAME_Xmm8]
335 movdqa xmm9, [rsp + KEXCEPTION_FRAME_Xmm9]
336 movdqa xmm10, [rsp + KEXCEPTION_FRAME_Xmm10]
337 movdqa xmm11, [rsp + KEXCEPTION_FRAME_Xmm11]
338 movdqa xmm12, [rsp + KEXCEPTION_FRAME_Xmm12]
339 movdqa xmm13, [rsp + KEXCEPTION_FRAME_Xmm13]
340 movdqa xmm14, [rsp + KEXCEPTION_FRAME_Xmm14]
341 movdqa xmm15, [rsp + KEXCEPTION_FRAME_Xmm15]
343 add rsp, EXCEPTION_RECORD_LENGTH + KEXCEPTION_FRAME_LENGTH
345 .ENDP InternalDispatchException
348 /* SOFTWARE INTERRUPT SERVICES ***********************************************/
350 PUBLIC KiDivideErrorFault
351 .PROC KiDivideErrorFault
352 /* Push pseudo error code */
353 ENTER_TRAP_FRAME TRAPFLAG_ALL
355 /* Enable interrupts */
358 /* Dispatch the exception */
359 mov eax, STATUS_INTEGER_DIVIDE_BY_ZERO
364 call InternalDispatchException
369 .ENDP KiDivideErrorFault
372 PUBLIC KiDebugTrapOrFault
373 .PROC KiDebugTrapOrFault
374 /* Push pseudo error code */
375 ENTER_TRAP_FRAME TRAPFLAG_ALL
377 TRAPINFO KiDebugTrapOrFault
379 /* Check if the frame was from kernelmode */
380 test word ptr [rbp + KTRAP_FRAME_SegCs], 3
381 jz KiDebugTrapOrFaultKMode
383 /* Enable interrupts for user-mode */
386 KiDebugTrapOrFaultKMode:
388 /* Dispatch the exception */
389 mov eax, STATUS_SINGLE_STEP
394 call InternalDispatchException
399 .ENDP KiDebugTrapOrFault
402 PUBLIC KiNmiInterrupt
404 /* Push pseudo error code */
405 ENTER_TRAP_FRAME TRAPFLAG_ALL
407 UNIMPLEMENTED KiNmiInterrupt
417 PUBLIC KiBreakpointTrap
418 .PROC KiBreakpointTrap
419 /* Push pseudo error code */
420 ENTER_TRAP_FRAME TRAPFLAG_ALL
422 TRAPINFO KiBreakpointTrap
424 // lea rcx, MsgBreakpointTrap[rip]
426 // call qword ptr FrLdrDbgPrint[rip]
428 /* Dispatch the exception */
429 mov eax, STATUS_BREAKPOINT
434 call InternalDispatchException
439 .ENDP KiBreakpointTrap
442 PUBLIC KiOverflowTrap
444 /* Push pseudo error code */
445 ENTER_TRAP_FRAME TRAPFLAG_ALL
447 /* Enable interrupts */
450 /* Dispatch the exception */
451 mov eax, STATUS_INTEGER_OVERFLOW
456 call InternalDispatchException
466 /* Push pseudo error code */
467 ENTER_TRAP_FRAME TRAPFLAG_ALL
469 /* Check if the frame was from kernelmode */
470 test word ptr [rbp + KTRAP_FRAME_SegCs], 3
471 jnz KiBoundFaltUserMode
474 mov ecx, EXCEPTION_BOUND_CHECK
476 call KiSystemFatalException
479 /* Enable interrupts for user-mode */
482 /* Dispatch the exception */
483 mov eax, STATUS_INTEGER_OVERFLOW
488 call InternalDispatchException
496 PUBLIC KiInvalidOpcodeFault
497 .PROC KiInvalidOpcodeFault
498 /* Push pseudo error code */
499 ENTER_TRAP_FRAME TRAPFLAG_ALL
501 TRAPINFO KiInvalidOpcodeFault
503 mov rdx, [rbp + KTRAP_FRAME_Rip]
504 lea rcx, MsgInvalidOpcodeFault[rip]
505 call qword ptr FrLdrDbgPrint[rip]
507 /* Enable interrupts */
510 /* Check if the frame was from kernelmode */
511 test word ptr [rbp + KTRAP_FRAME_SegCs], 3
512 jz KiInvalidOpcodeKernel
514 // FIXME: handle STATUS_INVALID_LOCK_SEQUENCE
516 KiInvalidOpcodeKernel:
517 /* Kernel mode fault */
519 /* Dispatch the exception */
520 mov eax, STATUS_ILLEGAL_INSTRUCTION
525 call InternalDispatchException
530 .ENDP KiInvalidOpcodeFault
533 PUBLIC KiNpxNotAvailableFault
534 .PROC KiNpxNotAvailableFault
535 /* Push pseudo error code */
536 ENTER_TRAP_FRAME TRAPFLAG_ALL
538 /* Call the C handler */
540 call KiNpxNotAvailableFaultHandler
542 /* Check the return status code */
544 jz KiNpxNotAvailableFaultExit
546 /* Dispatch the exception */
551 call InternalDispatchException
553 KiNpxNotAvailableFaultExit:
557 .ENDP KiNpxNotAvailableFault
560 PUBLIC KiDoubleFaultAbort
561 .PROC KiDoubleFaultAbort
562 /* Push pseudo error code */
563 ENTER_TRAP_FRAME TRAPFLAG_ALL
565 lea rcx, MsgDoubleFault[rip]
566 mov rdx, [rbp + KTRAP_FRAME_FaultAddress]
568 call qword ptr FrLdrDbgPrint[rip]
571 mov ecx, 8 // EXCEPTION_DOUBLE_FAULT
573 call KiSystemFatalException
576 .ENDP KiDoubleFaultAbort
579 PUBLIC KiNpxSegmentOverrunAbort
580 .PROC KiNpxSegmentOverrunAbort
581 /* Push pseudo error code */
582 ENTER_TRAP_FRAME TRAPFLAG_ALL
585 mov ecx, EXCEPTION_NPX_OVERRUN
587 call KiSystemFatalException
590 .ENDP KiNpxSegmentOverrunAbort
593 PUBLIC KiInvalidTssFault
594 .PROC KiInvalidTssFault
595 /* We have an error code */
596 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
599 mov ecx, EXCEPTION_INVALID_TSS
601 call KiSystemFatalException
604 .ENDP KiInvalidTssFault
607 PUBLIC KiSegmentNotPresentFault
608 .PROC KiSegmentNotPresentFault
609 /* We have an error code */
610 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
613 mov ecx, EXCEPTION_SEGMENT_NOT_PRESENT
615 call KiSystemFatalException
618 .ENDP KiSegmentNotPresentFault
623 /* We have an error code */
624 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
627 mov ecx, EXCEPTION_STACK_FAULT
629 call KiSystemFatalException
635 PUBLIC KiGeneralProtectionFault
636 .PROC KiGeneralProtectionFault
637 /* We have an error code */
638 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
640 TRAPINFO KiGeneralProtectionFault
641 mov rdx, [rbp + KTRAP_FRAME_Rip]
642 lea rcx, MsgGeneralProtFault[rip]
643 call qword ptr FrLdrDbgPrint[rip]
645 /* Call the C handler */
646 call KiGeneralProtectionFaultHandler
648 /* Check for success */
652 /* Dispatch the exception */
657 call InternalDispatchException
662 mov ecx, UNEXPECTED_KERNEL_MODE_TRAP
663 mov rdx, HEX(000D) // EXCEPTION_GP_FAULT
665 mov r9, [rbp + KTRAP_FRAME_ErrorCode] // error code
667 mov [rsp + KTRAP_FRAME_P5+8], rbp // trap frame
668 call KeBugCheckWithTf
674 .ENDP KiGeneralProtectionFault
679 /* We have an error code */
680 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
685 lea rcx, MsgPageFault[rip]
686 mov rdx, [rbp + KTRAP_FRAME_ErrorCode]
687 mov r8, [rbp + KTRAP_FRAME_Rip]
688 mov r9, [rbp + KTRAP_FRAME_FaultAddress]
689 call qword ptr FrLdrDbgPrint[rip]
692 /* Save page fault address */
694 mov [rbp + KTRAP_FRAME_FaultAddress], rdx
696 /* Call page fault handler */
697 mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // StoreInstruction
700 mov r8b, [rbp + KTRAP_FRAME_SegCs] // Mode
702 mov r9, rbp // TrapInformation
705 /* Check for success */
709 /* Set parameter 1 to error code */
710 mov r9d, [rbp + KTRAP_FRAME_ErrorCode]
712 /* Set parameter2 to faulting address */
713 mov r10, cr2 // Param2 = faulting address
715 cmp eax, STATUS_ACCESS_VIOLATION
717 cmp eax, STATUS_GUARD_PAGE_VIOLATION
719 cmp eax, STATUS_STACK_OVERFLOW
723 /* Dispatch in-page exception */
724 mov r11d, eax // Param3 = Status
725 mov eax, STATUS_IN_PAGE_ERROR // ExceptionCode
726 mov edx, 3 // ParamCount
727 call InternalDispatchException
731 /* Use more proper status code */
732 mov eax, KI_EXCEPTION_ACCESS_VIOLATION
735 /* Setup a normal page fault exception */
736 mov edx, 2 // ParamCount
737 call InternalDispatchException
745 PUBLIC KiFloatingErrorFault
746 .PROC KiFloatingErrorFault
747 /* Push pseudo error code */
748 ENTER_TRAP_FRAME TRAPFLAG_ALL
750 UNIMPLEMENTED KiFloatingErrorFault
753 .ENDP KiFloatingErrorFault
756 PUBLIC KiAlignmentFault
757 .PROC KiAlignmentFault
758 /* We have an error code */
759 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
761 /* Enable interrupts */
765 mov ecx, EXCEPTION_ALIGNMENT_CHECK
767 call KiSystemFatalException
770 .ENDP KiAlignmentFault
775 /* Push pseudo error code */
776 ENTER_TRAP_FRAME TRAPFLAG_ALL
781 call KiSystemFatalException
787 PUBLIC KiXmmException
789 /* Push pseudo error code */
790 ENTER_TRAP_FRAME TRAPFLAG_ALL
792 /* Call the C handler */
794 call KiXmmExceptionHandler
796 /* Check for success */
800 /* Dispatch the exception */
805 call InternalDispatchException
813 PUBLIC KiApcInterrupt
815 /* We have an error code */
816 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
818 UNIMPLEMENTED KiApcInterrupt
824 PUBLIC KiRaiseAssertion
825 .PROC KiRaiseAssertion
826 /* We have an error code */
827 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
829 /* Decrement RIP to point to the INT2C instruction (2 bytes, not 1 like INT3) */
830 sub qword ptr [rbp + KTRAP_FRAME_Rip], 2
832 /* Dispatch the exception */
833 mov eax, STATUS_ASSERTION_FAILURE
838 call InternalDispatchException
842 .ENDP KiRaiseAssertion
845 PUBLIC KiDebugServiceTrap
846 .PROC KiDebugServiceTrap
847 /* Push pseudo error code */
848 ENTER_TRAP_FRAME TRAPFLAG_ALL
850 TRAPINFO KiDebugServiceTrap
852 /* Increase Rip to skip the int3 */
853 inc qword ptr [rbp + KTRAP_FRAME_Rip]
855 /* Dispatch the exception */
856 mov eax, STATUS_BREAKPOINT
858 mov r9, [rbp+KTRAP_FRAME_Rax] // Service
859 mov r10, [rbp+KTRAP_FRAME_Rcx] // Buffer
860 mov r11, [rbp+KTRAP_FRAME_Rdx] // Length
861 call InternalDispatchException
865 .ENDP KiDebugServiceTrap
868 PUBLIC KiDpcInterrupt
870 /* We have an error code */
871 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
873 UNIMPLEMENTED KiDpcInterrupt
879 PUBLIC KiIpiInterrupt
881 /* We have an error code */
882 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
884 UNIMPLEMENTED KiIpiInterrupt
890 PUBLIC KiUnexpectedInterrupt
891 .PROC KiUnexpectedInterrupt
892 /* The error code is the vector */
894 ENTER_TRAP_FRAME (TRAPFLAG_HAS_ERRORCODE OR TRAPFLAG_ALL)
896 /* Set bugcheck parameters */
897 mov ecx, TRAP_CAUSE_UNKNOWN
898 mov rdx, [rbp + KTRAP_FRAME_ErrorCode] // the vector
899 mov r8, 0 // The unknown floating-point exception
900 mov r9, 0 // The enabled and asserted status bits
902 mov [rbp + KTRAP_FRAME_P5 + 8], rbp // trap frame
903 call KeBugCheckWithTf
906 .ENDP KiUnexpectedInterrupt
912 //void __lgdt(void *Source);
918 //void __sgdt(void *Destination);
924 // void __lldt(unsigned short Value)
930 //void __sldt(void *Destination);
936 //void __ltr(unsigned short Source);
942 //void __str(unsigned short *Destination);