0b5a110d16573e6bde6bc948cc89da4f53f238b3
[reactos.git] / reactos / ntoskrnl / ke / amd64 / trap.S
1 /*
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)
6 */
7
8 /* INCLUDES ******************************************************************/
9
10 #include <ndk/amd64/asm.h>
11 #include <ndk/amd64/asmmacro.S>
12
13 /* GLOBALS *******************************************************************/
14
15 .data
16
17 .global _MsgUnimplemented
18 _MsgUnimplemented:
19 .asciz "WARNING: %s at %s:%d is UNIMPLEMENTED!\n"
20
21 _MsgPageFault:
22 .ascii "Page fault! Code = 0x%x, RIP = %p, FaultingAddress = %p\n\0"
23
24 _MsgGeneralProtFault:
25 .ascii "General protection fault at %p!\n\0"
26
27 _MsgBreakpointTrap:
28 .ascii "BreakpointTrap at %p\n\0"
29
30 _MsgUnexpectedInterrupt:
31 .ascii "UnexpectedInterrupt\n\0"
32
33 _MsgInvalidOpcodeFault:
34 .ascii "General protection fault at %p!\n\0"
35
36 _MsgTrapInfo:
37 .ascii "Trap: %s at %p\n\0"
38
39 .macro TRAPINFO func
40 #if 0
41 jmp 2f
42 .equ expr, 12
43 1: .asciz "\func"
44 2:
45 sub rsp, 0x20
46 lea rcx, _MsgTrapInfo[rip]
47 lea rdx, 1b[rip]
48 mov r8, [rbp + KTRAP_FRAME_Rip]
49 call _FrLdrDbgPrint[rip]
50 add rsp, 0x20
51 #endif
52 .endm
53
54 /* Helper Macros *************************************************************/
55
56 #define TRAPFLAG_VOLATILES 0x01
57 #define TRAPFLAG_NONVOLATILES 0x02
58 #define TRAPFLAG_XMM 0x04
59 #define TRAPFLAG_SEGMENTS 0x08
60 #define TRAPFLAG_DEBUG 0x10
61
62 #define TRAPFLAG_SYSTEMSERVICE (TRAPFLAG_VOLATILES|TRAPFLAG_DEBUG)
63 #define TRAPFLAG_ALL 0xff
64
65 /*
66 * Stack Layout:
67 * |-------------------|
68 * | KTRAP_FRAME |
69 * |-------------------| <- rbp
70 * | EXCEPTION_RECORD |
71 * |-------------------|
72 * | KEXCEPTION_FRAME |
73 * |-------------------| <- rsp
74 *
75 */
76
77 /*
78 * ENTER_TRAP_FRAME - Allocate SIZE_KTRAP_FRAME and save registers to it
79 */
80 .macro ENTER_TRAP_FRAME Flags
81 .set SIZE_INITIAL_FRAME, 7 * 8
82 //.set SIZE_LOCAL_DATA, SIZE_EXCEPTION_RECORD + 0x28
83 .set SIZE_TRAP_FRAME_ALLOC, SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME
84 .set TRAPFLAGS, \Flags
85
86 /* Save rbp */
87 push rbp
88 .pushreg rbp
89
90 /* Make room for a KTRAP_FRAME and function parameters */
91 sub rsp, SIZE_TRAP_FRAME_ALLOC
92 .allocstack SIZE_TRAP_FRAME_ALLOC
93
94 /* Point rbp to the KTRAP_FRAME */
95 lea rbp, [rsp]
96
97 .if (TRAPFLAGS & TRAPFLAG_NONVOLATILES)
98 /* Save non-volatile registers */
99 mov [rbp + KTRAP_FRAME_Rbx], rbx
100 mov [rbp + KTRAP_FRAME_Rdi], rdi
101 mov [rbp + KTRAP_FRAME_Rsi], rsi
102 .endif
103
104 .if (TRAPFLAGS & TRAPFLAG_VOLATILES)
105 /* Save volatile registers */
106 mov [rbp + KTRAP_FRAME_Rax], rax
107 mov [rbp + KTRAP_FRAME_Rcx], rcx
108 mov [rbp + KTRAP_FRAME_Rdx], rdx
109 mov [rbp + KTRAP_FRAME_R8], r8
110 mov [rbp + KTRAP_FRAME_R9], r9
111 mov [rbp + KTRAP_FRAME_R10], r10
112 mov [rbp + KTRAP_FRAME_R11], r11
113 .endif
114
115 .if (TRAPFLAGS & TRAPFLAG_XMM)
116 /* Save xmm registers */
117 // movdqa [rbp + KTRAP_FRAME_Xmm0], xmm0
118 // movdqa [rbp + KTRAP_FRAME_Xmm1], xmm1
119 // movdqa [rbp + KTRAP_FRAME_Xmm2], xmm2
120 // movdqa [rbp + KTRAP_FRAME_Xmm3], xmm3
121 // movdqa [rbp + KTRAP_FRAME_Xmm4], xmm4
122 // movdqa [rbp + KTRAP_FRAME_Xmm5], xmm5
123 .endif
124
125 .if (TRAPFLAGS & TRAPFLAG_SEGMENTS)
126 /* Save segment selectors */
127 mov ax, ds
128 mov [rbp + KTRAP_FRAME_SegDs], ax
129 mov ax, es
130 mov [rbp + KTRAP_FRAME_SegEs], ax
131 mov ax, fs
132 mov [rbp + KTRAP_FRAME_SegFs], ax
133 mov ax, gs
134 mov [rbp + KTRAP_FRAME_SegGs], ax
135 .endif
136
137 /* Save previous mode and swap gs when it was UserMode */
138 mov ax, [rbp + KTRAP_FRAME_SegCs]
139 and ax, 1
140 mov [rbp + KTRAP_FRAME_PreviousMode], al
141 jz 1f
142 swapgs
143 1:
144
145 /* Save previous irql */
146 mov rax, cr8
147 mov [rbp + KTRAP_FRAME_PreviousIrql], al
148
149 // KTRAP_FRAME_FaultIndicator
150 // KTRAP_FRAME_ExceptionActive
151 // KTRAP_FRAME_MxCsr
152
153 .if (TRAPFLAGS & TRAPFLAG_DEBUG)
154 /* Save debug registers */
155 mov rax, dr0
156 mov [rbp + KTRAP_FRAME_Dr0], rax
157 mov rax, dr1
158 mov [rbp + KTRAP_FRAME_Dr1], rax
159 mov rax, dr2
160 mov [rbp + KTRAP_FRAME_Dr2], rax
161 mov rax, dr3
162 mov [rbp + KTRAP_FRAME_Dr3], rax
163 mov rax, dr6
164 mov [rbp + KTRAP_FRAME_Dr6], rax
165 mov rax, dr7
166 mov [rbp + KTRAP_FRAME_Dr7], rax
167 .endif
168
169 // KTRAP_FRAME_DebugControl
170 // KTRAP_FRAME_LastBranchToRip
171 // KTRAP_FRAME_LastBranchFromRip
172 // KTRAP_FRAME_LastExceptionToRip
173 // KTRAP_FRAME_LastExceptionFromRip
174 // KTRAP_FRAME_TrapFrame
175
176 /* Make sure the direction flag is cleared */
177 cld
178 .endm
179
180
181 /*
182 * LEAVE_TRAP_FRAME - Restore registers and free stack space
183 */
184 .macro LEAVE_TRAP_FRAME
185
186 .if (TRAPFLAGS & TRAPFLAG_SEGMENTS)
187 /* Restore segment selectors */
188 mov ax, [rbp + KTRAP_FRAME_SegDs]
189 mov ds, ax
190 mov ax, [rbp + KTRAP_FRAME_SegEs]
191 mov es, ax
192 mov ax, [rbp + KTRAP_FRAME_SegFs]
193 mov fs, ax
194 .endif
195
196 test byte ptr [rbp + KTRAP_FRAME_PreviousMode], 1
197 jz 1f
198 swapgs
199 1:
200
201 .if (TRAPFLAGS & TRAPFLAG_NONVOLATILES)
202 /* Restore non-volatile registers */
203 mov rbx, [rbp + KTRAP_FRAME_Rbx]
204 mov rdi, [rbp + KTRAP_FRAME_Rdi]
205 mov rsi, [rbp + KTRAP_FRAME_Rsi]
206 .endif
207
208 .if (TRAPFLAGS & TRAPFLAG_VOLATILES)
209 /* Restore volatile registers */
210 mov rax, [rbp + KTRAP_FRAME_Rax]
211 mov rcx, [rbp + KTRAP_FRAME_Rcx]
212 mov rdx, [rbp + KTRAP_FRAME_Rdx]
213 mov r8, [rbp + KTRAP_FRAME_R8]
214 mov r9, [rbp + KTRAP_FRAME_R9]
215 mov r10, [rbp + KTRAP_FRAME_R10]
216 mov r11, [rbp + KTRAP_FRAME_R11]
217 .endif
218
219 .if (TRAPFLAGS & TRAPFLAG_XMM)
220 /* Restore xmm registers */
221 // movdqa xmm0, [rbp + KTRAP_FRAME_Xmm0]
222 // movdqa xmm1, [rbp + KTRAP_FRAME_Xmm1]
223 // movdqa xmm2, [rbp + KTRAP_FRAME_Xmm2]
224 // movdqa xmm3, [rbp + KTRAP_FRAME_Xmm3]
225 // movdqa xmm4, [rbp + KTRAP_FRAME_Xmm4]
226 // movdqa xmm5, [rbp + KTRAP_FRAME_Xmm5]
227 .endif
228
229 /* Restore rbp */
230 mov rbp, [rbp + KTRAP_FRAME_Rbp]
231
232 /* Adjust stack pointer (plus one qword for rbp, one for error code) */
233 add rsp, SIZE_TRAP_FRAME_ALLOC + 0x10
234 .endm
235
236
237
238 // rbp = TrapFrame, eax = ExceptionCode, edx = NumParams, r9,r10,r11 = params
239 _InternalDispatchException:
240
241 /* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
242 sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME
243
244 /* Set up EXCEPTION_RECORD */
245 lea rcx, [rsp + SIZE_KEXCEPTION_FRAME]
246 mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax
247 xor rax, rax
248 mov [rcx + EXCEPTION_RECORD_ExceptionFlags], eax
249 mov [rcx + EXCEPTION_RECORD_ExceptionRecord], rax
250 mov rax, [rbp + KTRAP_FRAME_Rip]
251 mov [rcx + EXCEPTION_RECORD_ExceptionAddress], rax
252 mov [rcx + EXCEPTION_RECORD_NumberParameters], edx
253 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x00], r9
254 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x08], r10
255 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x10], r11
256
257 /* Set up KEXCEPTION_FRAME */
258 mov rax, [rbp + KTRAP_FRAME_Rbp]
259 mov [rsp + KEXCEPTION_FRAME_Rbp], rax
260 mov [rsp + KEXCEPTION_FRAME_Rbx], rbx
261 mov [rsp + KEXCEPTION_FRAME_Rdi], rdi
262 mov [rsp + KEXCEPTION_FRAME_Rsi], rsi
263 mov [rsp + KEXCEPTION_FRAME_R12], r12
264 mov [rsp + KEXCEPTION_FRAME_R13], r13
265 mov [rsp + KEXCEPTION_FRAME_R14], r14
266 mov [rsp + KEXCEPTION_FRAME_R15], r15
267 mov qword ptr [rsp + KEXCEPTION_FRAME_Return], 0
268
269 /* Call KiDispatchException */
270 // rcx already points to ExceptionRecord
271 mov rdx, rsp // ExceptionFrame
272 mov r8, rbp // TrapFrame
273 mov r9b, [r8 + KTRAP_FRAME_PreviousMode] // PreviousMode
274 mov byte ptr [rsp + KEXCEPTION_FRAME_P5], 1 // FirstChance
275 call _KiDispatchException
276
277 add rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME
278 ret
279
280 /* SOFTWARE INTERRUPT SERVICES ***********************************************/
281 .text
282 .code64
283
284 .proc KiDivideErrorFault
285 .pushframe 0
286 /* Push pseudo error code */
287 push 0
288 .allocstack 0x8
289
290 UNIMPLEMENTED KiDivideErrorFault
291
292 jmp $
293 .endproc
294
295 .proc KiDebugTrapOrFault
296 .pushframe 0
297 /* Push pseudo error code */
298 push 0
299 .allocstack 0x8
300
301 ENTER_TRAP_FRAME TRAPFLAG_ALL
302
303 TRAPINFO KiDebugTrapOrFault
304
305 /* Check if the frame was from kernelmode */
306 test word ptr [rbp + KTRAP_FRAME_SegCs], 3
307 jz KiDebugTrapOrFaultKMode
308
309 /* Enable interrupts for user-mode */
310 sti
311
312 KiDebugTrapOrFaultKMode:
313
314 /* Dispatch the exception */
315 mov eax, STATUS_SINGLE_STEP
316 mov edx, 0
317 mov r9, 0
318 mov r10, 0
319 mov r11, 0
320 call _InternalDispatchException
321
322 /* Return */
323 LEAVE_TRAP_FRAME
324 iretq
325 .endproc
326
327 .proc KiNmiInterrupt
328 .pushframe 0
329 /* Push pseudo error code */
330 push 0
331 .allocstack 0x8
332
333 UNIMPLEMENTED KiNmiInterrupt
334
335 jmp $
336 .endproc
337
338 .proc KiBreakpointTrap
339 .pushframe 0
340 /* Push pseudo error code */
341 push 0
342 .allocstack 0x8
343
344 ENTER_TRAP_FRAME TRAPFLAG_ALL
345
346 TRAPINFO KiBreakpointTrap
347
348 // lea rcx, _MsgBreakpointTrap[rip]
349 // mov rdx, rsp
350 // call _FrLdrDbgPrint[rip]
351
352 /* Dispatch the exception */
353 mov eax, STATUS_BREAKPOINT
354 mov edx, 3
355 mov r9, 0
356 mov r10, 0
357 mov r11, 0
358 call _InternalDispatchException
359
360 /* Return */
361 LEAVE_TRAP_FRAME
362 iretq
363 .endproc
364
365 .proc KiOverflowTrap
366 .pushframe 0
367 /* Push pseudo error code */
368 push 0
369 .allocstack 0x8
370
371 UNIMPLEMENTED KiOverflowTrap
372 jmp $
373 .endproc
374
375 .proc KiBoundFault
376 .pushframe 0
377 /* Push pseudo error code */
378 push 0
379 .allocstack 8
380
381 sub rsp, 0x20
382 .allocstack 0x20
383
384 mov [rsp + 8], rbx
385 .savereg rbx, 8
386
387 UNIMPLEMENTED KiBoundFault
388
389 jmp $
390 .endproc
391
392 .proc KiInvalidOpcodeFault
393 .pushframe 0
394 /* Push pseudo error code */
395 push 0
396 .allocstack 0x8
397
398 ENTER_TRAP_FRAME TRAPFLAG_ALL
399
400 TRAPINFO KiInvalidOpcodeFault
401
402 // DISPATCH_EXCEPTION STATUS_BREAKPOINT, 3, 0, 0, 0
403
404 mov rdx, [rbp + KTRAP_FRAME_Rip]
405 lea rcx, _MsgInvalidOpcodeFault[rip]
406 call _FrLdrDbgPrint[rip]
407 jmp $
408
409 /* Return */
410 LEAVE_TRAP_FRAME
411 iretq
412 .endproc
413
414 .proc KiNpxNotAvailableFault
415 .pushframe 0
416 /* Push pseudo error code */
417 push 0
418 .allocstack 0x8
419
420 UNIMPLEMENTED KiNpxNotAvailableFault
421
422 jmp $
423 .endproc
424
425 .proc KiDoubleFaultAbort
426 .pushframe 0
427 /* Push pseudo error code */
428 push 0
429 .allocstack 0x8
430
431 /* Reserve stack space for parameters */
432 sub rsp, 0x28
433 .allocstack 0x28
434
435 /* Bugcheck code UNEXPECTED_KERNEL_MODE_TRAP */
436 mov rcx, 0x0000007F
437
438 /* Set double fault parameters */
439 mov rdx, 0x00000008
440 mov r8, 0
441 mov r9, 0
442 mov qword ptr [rsp + 0x20], 0
443
444 call _KeBugCheckEx
445
446 jmp $
447 .endproc
448
449 .proc KiNpxSegmentOverrunAbort
450 .pushframe 0
451 /* Push pseudo error code */
452 push 0
453 .allocstack 0x8
454
455 UNIMPLEMENTED KiNpxSegmentOverrunAbort
456
457 jmp $
458 .endproc
459
460 .proc KiInvalidTssFault
461 .pushframe 1
462 /* We have an error code */
463
464 UNIMPLEMENTED KiInvalidTssFault
465
466 jmp $
467 .endproc
468
469
470 .proc KiSegmentNotPresentFault
471 .pushframe 1
472 /* We have an error code */
473
474 UNIMPLEMENTED KiSegmentNotPresentFault
475
476 jmp $
477 .endproc
478
479 .proc KiStackFault
480 .pushframe 1
481 /* We have an error code */
482
483 UNIMPLEMENTED KiStackFault
484
485 jmp $
486 .endproc
487
488
489 .proc KiGeneralProtectionFault
490 .pushframe 1
491 /* We have an error code */
492
493 cli
494 ENTER_TRAP_FRAME TRAPFLAG_ALL
495
496 TRAPINFO KiGeneralProtectionFault
497
498 mov rdx, [rbp + KTRAP_FRAME_Rip]
499 lea rcx, _MsgGeneralProtFault[rip]
500 call _FrLdrDbgPrint[rip]
501
502 /* Check if this was from user-mode */
503 cmp byte ptr [rbp + KTRAP_FRAME_PreviousMode], KernelMode
504 jnz KiGpfUserMode
505
506 /* Get instruction */
507 mov rax, [rbp + KTRAP_FRAME_Rip]
508 mov rax, [rax]
509
510 /* Check for MSR failure */
511 cmp al, 0xF
512 jz KiGpfMsr
513
514 /* Check for IRET */
515 cmp ax, 0xCF48
516 je KiGpfIret
517
518 /* Check for pop ds/es/fs/gs */
519 xor edx, edx
520 cmp al, 0x1F
521 jz KiGpfPopSegDs
522 cmp al, 0x07
523 jz KiGpfPopSegEs
524 cmp ax, 0xA10F
525 jz KiGpfPopSegFs
526 cmp ax, 0xA90F
527 jz KiGpfPopSegGs
528
529
530 mov dx, 0x002B // KGDT64_R3_DATA | RPL_MASK
531 cmp [rbp + KTRAP_FRAME_SegDs], dx
532 jne KiGpfPopSegDs
533 cmp [rbp + KTRAP_FRAME_SegEs], dx
534 jne KiGpfPopSegEs
535 cmp [rbp + KTRAP_FRAME_SegFs], dx
536 jne KiGpfPopSegFs
537 cmp [rbp + KTRAP_FRAME_SegGs], dx
538 jne KiGpfPopSegGs
539
540 KiGpfFatal:
541
542 /* Bugcheck */
543 mov ecx, UNEXPECTED_KERNEL_MODE_TRAP
544 mov rdx, 0x0000D // EXCEPTION_GP_FAULT
545 xor rdx, rdx
546 xor r8, r8
547 xor r9, r9 // Reserved
548 mov [rbp + KTRAP_FRAME_P5], rbp // trap frame
549 call _KeBugCheckWithTf
550
551
552
553 KiGpfPopSegDs:
554 mov [rbp + KTRAP_FRAME_SegDs], dx
555 jmp KiGpfPopSeg
556
557 KiGpfPopSegEs:
558 mov [rbp + KTRAP_FRAME_SegEs], dx
559 jmp KiGpfPopSeg
560
561 KiGpfPopSegFs:
562 mov [rbp + KTRAP_FRAME_SegFs], dx
563 jmp KiGpfPopSeg
564
565 KiGpfPopSegGs:
566 mov [rbp + KTRAP_FRAME_SegGs], dx
567 jmp KiGpfPopSeg
568
569 KiGpfPopSeg:
570 jmp KiGpfExit
571
572 KiGpfIret:
573 /* Get error code */
574 mov ax, [rbp + KTRAP_FRAME_ErrorCode]
575 // and ax, ~RPL_MASK
576
577 KiGpfMsr:
578
579 jmp KiGpfFatal
580
581
582 KiGpfUserMode:
583
584 /* Dispatch the exception */
585 mov eax, STATUS_ACCESS_VIOLATION
586 mov edx, 2
587 mov r9, [rbp + KTRAP_FRAME_ErrorCode]
588 mov r10, 0
589 mov r11, 0
590 call _InternalDispatchException
591
592 KiGpfExit:
593
594 /* Return */
595 LEAVE_TRAP_FRAME
596 iretq
597
598 .endproc
599
600
601 .proc KiPageFault
602 .pushframe 1
603 /* We have an error code */
604
605 ENTER_TRAP_FRAME TRAPFLAG_ALL
606
607 TRAPINFO KiPageFault
608
609 #if 0
610 lea rcx, _MsgPageFault[rip]
611 mov rdx, [rbp + KTRAP_FRAME_ErrorCode]
612 mov r8, [rbp + KTRAP_FRAME_Rip]
613 mov r9, [rbp + KTRAP_FRAME_FaultAddress]
614 call _FrLdrDbgPrint[rip]
615 #endif
616
617 /* Save page fault address */
618 mov rdx, cr2
619 mov [rbp + KTRAP_FRAME_FaultAddress], rdx
620
621 /* Call page fault handler */
622 mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // StoreInstruction
623 and ecx, 1
624 // rdx == Address
625 mov r8b, [rbp + KTRAP_FRAME_SegCs] // Mode
626 and r8b, 1
627 mov r9, rbp // TrapInformation
628 call _MmAccessFault
629
630 /* Check for success */
631 test eax, eax
632 jge PageFaultReturn
633
634 /* Set parameter 1 to error code */
635 mov r9d, [rbp + KTRAP_FRAME_ErrorCode]
636
637 /* Set parameter2 to faulting address */
638 mov r10, cr2 // Param2 = faulting address
639
640 cmp eax, STATUS_ACCESS_VIOLATION
641 je AccessViolation
642 cmp eax, STATUS_GUARD_PAGE_VIOLATION
643 je SpecialCode
644 cmp eax, STATUS_STACK_OVERFLOW
645 je SpecialCode
646
647 InPageException:
648 /* Dispatch in-page exception */
649 mov r11d, eax // Param3 = Status
650 mov eax, STATUS_IN_PAGE_ERROR // ExceptionCode
651 mov edx, 3 // ParamCount
652 call _InternalDispatchException
653 jmp PageFaultReturn
654
655 AccessViolation:
656 /* Use more proper status code */
657 mov eax, KI_EXCEPTION_ACCESS_VIOLATION
658
659 SpecialCode:
660 /* Setup a normal page fault exception */
661 mov edx, 2 // ParamCount
662 call _InternalDispatchException
663
664 PageFaultReturn:
665 LEAVE_TRAP_FRAME;
666 iretq
667 .endproc
668
669
670 .proc KiFloatingErrorFault
671 .pushframe 0
672 /* Push pseudo error code */
673 push 0
674 .allocstack 0x8
675
676 UNIMPLEMENTED KiFloatingErrorFault
677
678 jmp $
679 .endproc
680
681 .proc KiAlignmentFault
682 .pushframe 1
683 /* We have an error code */
684
685 UNIMPLEMENTED KiAlignmentFault
686
687 jmp $
688 .endproc
689
690 .proc KiMcheckAbort
691 .pushframe 0
692 /* Push pseudo error code */
693 push 0
694 .allocstack 0x08
695
696 UNIMPLEMENTED KiMcheckAbort
697
698 jmp $
699 .endproc
700
701 .proc KiXmmException
702 .pushframe 0
703 /* Push pseudo error code */
704 push 0
705 .allocstack 0x08
706
707 UNIMPLEMENTED KiXmmException
708
709 jmp $
710 .endproc
711
712 .proc KiApcInterrupt
713 .pushframe 1
714
715 UNIMPLEMENTED KiApcInterrupt
716
717 jmp $
718 .endproc
719
720 .proc KiRaiseAssertion
721 .pushframe 1
722
723 UNIMPLEMENTED KiRaiseAssertion
724
725 jmp $
726 .endproc
727
728 .proc KiDebugServiceTrap
729 .pushframe 0
730 /* Push pseudo error code */
731 push 0
732 .allocstack 0x08
733
734 ENTER_TRAP_FRAME TRAPFLAG_ALL
735
736 TRAPINFO KiDebugServiceTrap
737
738 /* Increase Rip to skip the int3 */
739 inc qword ptr [rbp + KTRAP_FRAME_Rip]
740
741 /* Dispatch the exception */
742 mov eax, STATUS_BREAKPOINT
743 mov edx, 3
744 mov r9, [rbp+KTRAP_FRAME_Rax] // Service
745 mov r10, [rbp+KTRAP_FRAME_Rcx] // Buffer
746 mov r11, [rbp+KTRAP_FRAME_Rdx] // Length
747 call _InternalDispatchException
748
749 LEAVE_TRAP_FRAME;
750 iretq
751 .endproc
752
753
754 .proc KiDpcInterrupt
755 .pushframe 1
756
757 UNIMPLEMENTED KiDpcInterrupt
758
759 jmp $
760 .endproc
761
762
763 .proc KiIpiInterrupt
764 .pushframe 1
765
766 UNIMPLEMENTED KiIpiInterrupt
767
768 jmp $
769 .endproc
770
771
772 .proc KiUnexpectedInterrupt
773 .pushframe 0
774 push 0
775 .allocstack 0x8
776
777 lea rcx, _MsgUnexpectedInterrupt[rip]
778 call _FrLdrDbgPrint[rip]
779
780 mov ecx, TRAP_CAUSE_UNKNOWN
781 // mov rdx, // The unexpected interrupt
782 // mov rdx, // The unknown floating-point exception
783 // mov r8, // The enabled and asserted status bits
784 xor r9, r9 // Reserved
785 mov [rbp + KTRAP_FRAME_P5], rbp // trap frame
786 call _KeBugCheckWithTf
787
788 .endproc
789
790
791 .proc KiSystemFatalException
792
793 .endproc
794