[KE]
[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 /* FUNCTIONS *****************************************************************/
238
239 .text
240 .code64
241
242 // rbp = TrapFrame, eax = ExceptionCode, edx = NumParams, r9,r10,r11 = params
243 _InternalDispatchException:
244
245 /* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
246 sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME
247
248 /* Set up EXCEPTION_RECORD */
249 lea rcx, [rsp + SIZE_KEXCEPTION_FRAME]
250 mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax
251 xor rax, rax
252 mov [rcx + EXCEPTION_RECORD_ExceptionFlags], eax
253 mov [rcx + EXCEPTION_RECORD_ExceptionRecord], rax
254 mov rax, [rbp + KTRAP_FRAME_Rip]
255 mov [rcx + EXCEPTION_RECORD_ExceptionAddress], rax
256 mov [rcx + EXCEPTION_RECORD_NumberParameters], edx
257 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x00], r9
258 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x08], r10
259 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x10], r11
260
261 /* Set up KEXCEPTION_FRAME */
262 mov rax, [rbp + KTRAP_FRAME_Rbp]
263 mov [rsp + KEXCEPTION_FRAME_Rbp], rax
264 mov [rsp + KEXCEPTION_FRAME_Rbx], rbx
265 mov [rsp + KEXCEPTION_FRAME_Rdi], rdi
266 mov [rsp + KEXCEPTION_FRAME_Rsi], rsi
267 mov [rsp + KEXCEPTION_FRAME_R12], r12
268 mov [rsp + KEXCEPTION_FRAME_R13], r13
269 mov [rsp + KEXCEPTION_FRAME_R14], r14
270 mov [rsp + KEXCEPTION_FRAME_R15], r15
271 mov qword ptr [rsp + KEXCEPTION_FRAME_Return], 0
272
273 /* Call KiDispatchException */
274 // rcx already points to ExceptionRecord
275 mov rdx, rsp // ExceptionFrame
276 mov r8, rbp // TrapFrame
277 mov r9b, [r8 + KTRAP_FRAME_PreviousMode] // PreviousMode
278 mov byte ptr [rsp + KEXCEPTION_FRAME_P5], 1 // FirstChance
279 call _KiDispatchException
280
281 add rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME
282 ret
283
284 /* SOFTWARE INTERRUPT SERVICES ***********************************************/
285
286 .proc KiDivideErrorFault
287 .pushframe 0
288 /* Push pseudo error code */
289 push 0
290 .allocstack 0x8
291
292 UNIMPLEMENTED KiDivideErrorFault
293
294 jmp $
295 .endproc
296
297 .proc KiDebugTrapOrFault
298 .pushframe 0
299 /* Push pseudo error code */
300 push 0
301 .allocstack 0x8
302
303 ENTER_TRAP_FRAME TRAPFLAG_ALL
304
305 TRAPINFO KiDebugTrapOrFault
306
307 /* Check if the frame was from kernelmode */
308 test word ptr [rbp + KTRAP_FRAME_SegCs], 3
309 jz KiDebugTrapOrFaultKMode
310
311 /* Enable interrupts for user-mode */
312 sti
313
314 KiDebugTrapOrFaultKMode:
315
316 /* Dispatch the exception */
317 mov eax, STATUS_SINGLE_STEP
318 mov edx, 0
319 mov r9, 0
320 mov r10, 0
321 mov r11, 0
322 call _InternalDispatchException
323
324 /* Return */
325 LEAVE_TRAP_FRAME
326 iretq
327 .endproc
328
329 .proc KiNmiInterrupt
330 .pushframe 0
331 /* Push pseudo error code */
332 push 0
333 .allocstack 0x8
334
335 UNIMPLEMENTED KiNmiInterrupt
336
337 jmp $
338 .endproc
339
340 .proc KiBreakpointTrap
341 .pushframe 0
342 /* Push pseudo error code */
343 push 0
344 .allocstack 0x8
345
346 ENTER_TRAP_FRAME TRAPFLAG_ALL
347
348 TRAPINFO KiBreakpointTrap
349
350 // lea rcx, _MsgBreakpointTrap[rip]
351 // mov rdx, rsp
352 // call _FrLdrDbgPrint[rip]
353
354 /* Dispatch the exception */
355 mov eax, STATUS_BREAKPOINT
356 mov edx, 3
357 mov r9, 0
358 mov r10, 0
359 mov r11, 0
360 call _InternalDispatchException
361
362 /* Return */
363 LEAVE_TRAP_FRAME
364 iretq
365 .endproc
366
367 .proc KiOverflowTrap
368 .pushframe 0
369 /* Push pseudo error code */
370 push 0
371 .allocstack 0x8
372
373 UNIMPLEMENTED KiOverflowTrap
374 jmp $
375 .endproc
376
377 .proc KiBoundFault
378 .pushframe 0
379 /* Push pseudo error code */
380 push 0
381 .allocstack 8
382
383 sub rsp, 0x20
384 .allocstack 0x20
385
386 mov [rsp + 8], rbx
387 .savereg rbx, 8
388
389 UNIMPLEMENTED KiBoundFault
390
391 jmp $
392 .endproc
393
394 .proc KiInvalidOpcodeFault
395 .pushframe 0
396 /* Push pseudo error code */
397 push 0
398 .allocstack 0x8
399
400 ENTER_TRAP_FRAME TRAPFLAG_ALL
401
402 TRAPINFO KiInvalidOpcodeFault
403
404 // DISPATCH_EXCEPTION STATUS_BREAKPOINT, 3, 0, 0, 0
405
406 mov rdx, [rbp + KTRAP_FRAME_Rip]
407 lea rcx, _MsgInvalidOpcodeFault[rip]
408 call _FrLdrDbgPrint[rip]
409 jmp $
410
411 /* Return */
412 LEAVE_TRAP_FRAME
413 iretq
414 .endproc
415
416 .proc KiNpxNotAvailableFault
417 .pushframe 0
418 /* Push pseudo error code */
419 push 0
420 .allocstack 0x8
421
422 UNIMPLEMENTED KiNpxNotAvailableFault
423
424 jmp $
425 .endproc
426
427 .proc KiDoubleFaultAbort
428 .pushframe 0
429 /* Push pseudo error code */
430 push 0
431 .allocstack 0x8
432
433 /* Reserve stack space for parameters */
434 sub rsp, 0x28
435 .allocstack 0x28
436
437 /* Bugcheck code UNEXPECTED_KERNEL_MODE_TRAP */
438 mov rcx, 0x0000007F
439
440 /* Set double fault parameters */
441 mov rdx, 0x00000008
442 mov r8, 0
443 mov r9, 0
444 mov qword ptr [rsp + 0x20], 0
445
446 call _KeBugCheckEx
447
448 jmp $
449 .endproc
450
451 .proc KiNpxSegmentOverrunAbort
452 .pushframe 0
453 /* Push pseudo error code */
454 push 0
455 .allocstack 0x8
456
457 UNIMPLEMENTED KiNpxSegmentOverrunAbort
458
459 jmp $
460 .endproc
461
462 .proc KiInvalidTssFault
463 .pushframe 1
464 /* We have an error code */
465
466 UNIMPLEMENTED KiInvalidTssFault
467
468 jmp $
469 .endproc
470
471
472 .proc KiSegmentNotPresentFault
473 .pushframe 1
474 /* We have an error code */
475
476 UNIMPLEMENTED KiSegmentNotPresentFault
477
478 jmp $
479 .endproc
480
481 .proc KiStackFault
482 .pushframe 1
483 /* We have an error code */
484
485 UNIMPLEMENTED KiStackFault
486
487 jmp $
488 .endproc
489
490
491 .proc KiGeneralProtectionFault
492 .pushframe 1
493 /* We have an error code */
494
495 cli
496 ENTER_TRAP_FRAME TRAPFLAG_ALL
497
498 TRAPINFO KiGeneralProtectionFault
499
500 mov rdx, [rbp + KTRAP_FRAME_Rip]
501 lea rcx, _MsgGeneralProtFault[rip]
502 call _FrLdrDbgPrint[rip]
503
504 /* Check if this was from user-mode */
505 cmp byte ptr [rbp + KTRAP_FRAME_PreviousMode], KernelMode
506 jnz KiGpfUserMode
507
508 /* Get instruction */
509 mov rax, [rbp + KTRAP_FRAME_Rip]
510 mov rax, [rax]
511
512 /* Check for MSR failure */
513 cmp al, 0xF
514 jz KiGpfMsr
515
516 /* Check for IRET */
517 cmp ax, 0xCF48
518 je KiGpfIret
519
520 /* Check for pop ds/es/fs/gs */
521 xor edx, edx
522 cmp al, 0x1F
523 jz KiGpfPopSegDs
524 cmp al, 0x07
525 jz KiGpfPopSegEs
526 cmp ax, 0xA10F
527 jz KiGpfPopSegFs
528 cmp ax, 0xA90F
529 jz KiGpfPopSegGs
530
531
532 mov dx, 0x002B // KGDT64_R3_DATA | RPL_MASK
533 cmp [rbp + KTRAP_FRAME_SegDs], dx
534 jne KiGpfPopSegDs
535 cmp [rbp + KTRAP_FRAME_SegEs], dx
536 jne KiGpfPopSegEs
537 cmp [rbp + KTRAP_FRAME_SegFs], dx
538 jne KiGpfPopSegFs
539 cmp [rbp + KTRAP_FRAME_SegGs], dx
540 jne KiGpfPopSegGs
541
542 KiGpfFatal:
543
544 /* Bugcheck */
545 mov ecx, UNEXPECTED_KERNEL_MODE_TRAP
546 mov rdx, 0x0000D // EXCEPTION_GP_FAULT
547 xor rdx, rdx
548 xor r8, r8
549 xor r9, r9 // Reserved
550 mov [rbp + KTRAP_FRAME_P5], rbp // trap frame
551 call _KeBugCheckWithTf
552
553
554
555 KiGpfPopSegDs:
556 mov [rbp + KTRAP_FRAME_SegDs], dx
557 jmp KiGpfPopSeg
558
559 KiGpfPopSegEs:
560 mov [rbp + KTRAP_FRAME_SegEs], dx
561 jmp KiGpfPopSeg
562
563 KiGpfPopSegFs:
564 mov [rbp + KTRAP_FRAME_SegFs], dx
565 jmp KiGpfPopSeg
566
567 KiGpfPopSegGs:
568 mov [rbp + KTRAP_FRAME_SegGs], dx
569 jmp KiGpfPopSeg
570
571 KiGpfPopSeg:
572 jmp KiGpfExit
573
574 KiGpfIret:
575 /* Get error code */
576 mov ax, [rbp + KTRAP_FRAME_ErrorCode]
577 // and ax, ~RPL_MASK
578
579 KiGpfMsr:
580
581 jmp KiGpfFatal
582
583
584 KiGpfUserMode:
585
586 /* Dispatch the exception */
587 mov eax, STATUS_ACCESS_VIOLATION
588 mov edx, 2
589 mov r9, [rbp + KTRAP_FRAME_ErrorCode]
590 mov r10, 0
591 mov r11, 0
592 call _InternalDispatchException
593
594 KiGpfExit:
595
596 /* Return */
597 LEAVE_TRAP_FRAME
598 iretq
599
600 .endproc
601
602
603 .proc KiPageFault
604 .pushframe 1
605 /* We have an error code */
606
607 ENTER_TRAP_FRAME TRAPFLAG_ALL
608
609 TRAPINFO KiPageFault
610
611 #if 0
612 lea rcx, _MsgPageFault[rip]
613 mov rdx, [rbp + KTRAP_FRAME_ErrorCode]
614 mov r8, [rbp + KTRAP_FRAME_Rip]
615 mov r9, [rbp + KTRAP_FRAME_FaultAddress]
616 call _FrLdrDbgPrint[rip]
617 #endif
618
619 /* Save page fault address */
620 mov rdx, cr2
621 mov [rbp + KTRAP_FRAME_FaultAddress], rdx
622
623 /* Call page fault handler */
624 mov ecx, [rbp + KTRAP_FRAME_ErrorCode] // StoreInstruction
625 and ecx, 1
626 // rdx == Address
627 mov r8b, [rbp + KTRAP_FRAME_SegCs] // Mode
628 and r8b, 1
629 mov r9, rbp // TrapInformation
630 call _MmAccessFault
631
632 /* Check for success */
633 test eax, eax
634 jge PageFaultReturn
635
636 /* Set parameter 1 to error code */
637 mov r9d, [rbp + KTRAP_FRAME_ErrorCode]
638
639 /* Set parameter2 to faulting address */
640 mov r10, cr2 // Param2 = faulting address
641
642 cmp eax, STATUS_ACCESS_VIOLATION
643 je AccessViolation
644 cmp eax, STATUS_GUARD_PAGE_VIOLATION
645 je SpecialCode
646 cmp eax, STATUS_STACK_OVERFLOW
647 je SpecialCode
648
649 InPageException:
650 /* Dispatch in-page exception */
651 mov r11d, eax // Param3 = Status
652 mov eax, STATUS_IN_PAGE_ERROR // ExceptionCode
653 mov edx, 3 // ParamCount
654 call _InternalDispatchException
655 jmp PageFaultReturn
656
657 AccessViolation:
658 /* Use more proper status code */
659 mov eax, KI_EXCEPTION_ACCESS_VIOLATION
660
661 SpecialCode:
662 /* Setup a normal page fault exception */
663 mov edx, 2 // ParamCount
664 call _InternalDispatchException
665
666 PageFaultReturn:
667 LEAVE_TRAP_FRAME;
668 iretq
669 .endproc
670
671
672 .proc KiFloatingErrorFault
673 .pushframe 0
674 /* Push pseudo error code */
675 push 0
676 .allocstack 0x8
677
678 UNIMPLEMENTED KiFloatingErrorFault
679
680 jmp $
681 .endproc
682
683 .proc KiAlignmentFault
684 .pushframe 1
685 /* We have an error code */
686
687 UNIMPLEMENTED KiAlignmentFault
688
689 jmp $
690 .endproc
691
692 .proc KiMcheckAbort
693 .pushframe 0
694 /* Push pseudo error code */
695 push 0
696 .allocstack 0x08
697
698 UNIMPLEMENTED KiMcheckAbort
699
700 jmp $
701 .endproc
702
703 .proc KiXmmException
704 .pushframe 0
705 /* Push pseudo error code */
706 push 0
707 .allocstack 0x08
708
709 UNIMPLEMENTED KiXmmException
710
711 jmp $
712 .endproc
713
714 .proc KiApcInterrupt
715 .pushframe 1
716
717 UNIMPLEMENTED KiApcInterrupt
718
719 jmp $
720 .endproc
721
722 .proc KiRaiseAssertion
723 .pushframe 1
724
725 UNIMPLEMENTED KiRaiseAssertion
726
727 jmp $
728 .endproc
729
730 .proc KiDebugServiceTrap
731 .pushframe 0
732 /* Push pseudo error code */
733 push 0
734 .allocstack 0x08
735
736 ENTER_TRAP_FRAME TRAPFLAG_ALL
737
738 TRAPINFO KiDebugServiceTrap
739
740 /* Increase Rip to skip the int3 */
741 inc qword ptr [rbp + KTRAP_FRAME_Rip]
742
743 /* Dispatch the exception */
744 mov eax, STATUS_BREAKPOINT
745 mov edx, 3
746 mov r9, [rbp+KTRAP_FRAME_Rax] // Service
747 mov r10, [rbp+KTRAP_FRAME_Rcx] // Buffer
748 mov r11, [rbp+KTRAP_FRAME_Rdx] // Length
749 call _InternalDispatchException
750
751 LEAVE_TRAP_FRAME;
752 iretq
753 .endproc
754
755
756 .proc KiDpcInterrupt
757 .pushframe 1
758
759 UNIMPLEMENTED KiDpcInterrupt
760
761 jmp $
762 .endproc
763
764
765 .proc KiIpiInterrupt
766 .pushframe 1
767
768 UNIMPLEMENTED KiIpiInterrupt
769
770 jmp $
771 .endproc
772
773
774 .proc KiUnexpectedInterrupt
775 .pushframe 0
776 push 0
777 .allocstack 0x8
778
779 lea rcx, _MsgUnexpectedInterrupt[rip]
780 call _FrLdrDbgPrint[rip]
781
782 mov ecx, TRAP_CAUSE_UNKNOWN
783 // mov rdx, // The unexpected interrupt
784 // mov rdx, // The unknown floating-point exception
785 // mov r8, // The enabled and asserted status bits
786 xor r9, r9 // Reserved
787 mov [rbp + KTRAP_FRAME_P5], rbp // trap frame
788 call _KeBugCheckWithTf
789
790 .endproc
791
792
793 .proc KiSystemFatalException
794
795 .endproc
796