1 #include <reactos/asm.h>
2 #include <ndk/amd64/asm.h>
11 /* Make room for a KTRAP_FRAME */
12 sub rsp, SIZE_KTRAP_FRAME
13 // .allocstack SIZE_KTRAP_FRAME
16 mov [rsp + KTRAP_FRAME_Rbp], rbp
18 /* Save non-volatile registers */
19 mov [rsp + KTRAP_FRAME_Rbx], rbx
20 mov [rsp + KTRAP_FRAME_Rdi], rdi
21 mov [rsp + KTRAP_FRAME_Rsi], rsi
23 /* Save volatile registers */
24 mov [rsp + KTRAP_FRAME_Rax], rax
25 mov [rsp + KTRAP_FRAME_Rcx], rcx
26 mov [rsp + KTRAP_FRAME_Rdx], rdx
27 mov [rsp + KTRAP_FRAME_R8], r8
28 mov [rsp + KTRAP_FRAME_R9], r9
29 mov [rsp + KTRAP_FRAME_R10], r10
30 mov [rsp + KTRAP_FRAME_R11], r11
32 /* Save xmm registers */
33 movdqa [rsp + KTRAP_FRAME_Xmm0], xmm0
34 movdqa [rsp + KTRAP_FRAME_Xmm1], xmm1
35 movdqa [rsp + KTRAP_FRAME_Xmm2], xmm2
36 movdqa [rsp + KTRAP_FRAME_Xmm3], xmm3
37 movdqa [rsp + KTRAP_FRAME_Xmm4], xmm4
38 movdqa [rsp + KTRAP_FRAME_Xmm5], xmm5
40 /* Save cs and previous mode */
42 mov [rsp + KTRAP_FRAME_SegCs], ax
44 mov [rsp + KTRAP_FRAME_PreviousMode], al
46 /* Save segment selectors */
48 mov [rsp + KTRAP_FRAME_SegDs], ax
50 mov [rsp + KTRAP_FRAME_SegEs], ax
52 mov [rsp + KTRAP_FRAME_SegFs], ax
54 mov [rsp + KTRAP_FRAME_SegGs], ax
56 /* Save previous irql */
58 mov [rsp + KTRAP_FRAME_PreviousIrql], al
60 /* Save debug registers */
62 mov [rsp + KTRAP_FRAME_Dr0], rax
64 mov [rsp + KTRAP_FRAME_Dr1], rax
66 mov [rsp + KTRAP_FRAME_Dr2], rax
68 mov [rsp + KTRAP_FRAME_Dr3], rax
70 mov [rsp + KTRAP_FRAME_Dr6], rax
72 mov [rsp + KTRAP_FRAME_Dr7], rax
74 /* Point rbp, where rsp was before */
75 lea rbp, [rsp + SIZE_KTRAP_FRAME]
76 mov [rsp + KTRAP_FRAME_Rsp], rbp
78 /* Store the EFLAGS we previously pushed on the stack */
80 mov [rsp + KTRAP_FRAME_EFlags], rax
82 /* Get RIP from the stack */
84 mov [rsp + KTRAP_FRAME_Rip], rax
86 /* Make sure the direction flag is cleared */
89 /* Clear all breakpoint enables in dr7. */
95 mov byte ptr [rsp + KTRAP_FRAME_P5], 1 /* FirstChance */
96 mov r9, rsp /* Pointer to the trap frame */
97 mov r8, 0 /* Context */
98 mov dl, 0 /* PreviousMode (KernelMode) */
99 mov rcx, 0 /* ExceptionRecord */
100 call KdbEnterDebuggerException
102 /* Restore segment selectors */
103 mov ax, [rsp + KTRAP_FRAME_SegDs]
105 mov ax, [rsp + KTRAP_FRAME_SegEs]
107 mov ax, [rsp + KTRAP_FRAME_SegFs]
110 /* Restore non-volatile registers */
111 mov rbx, [rsp + KTRAP_FRAME_Rbx]
112 mov rdi, [rsp + KTRAP_FRAME_Rdi]
113 mov rsi, [rsp + KTRAP_FRAME_Rsi]
115 /* Restore volatile registers */
116 mov rax, [rsp + KTRAP_FRAME_Rax]
117 mov rcx, [rsp + KTRAP_FRAME_Rcx]
118 mov rdx, [rsp + KTRAP_FRAME_Rdx]
119 mov r8, [rsp + KTRAP_FRAME_R8]
120 mov r9, [rsp + KTRAP_FRAME_R9]
121 mov r10, [rsp + KTRAP_FRAME_R10]
122 mov r11, [rsp + KTRAP_FRAME_R11]
125 mov rsp, [rsp + KTRAP_FRAME_Rsp]
132 .globl KdbpStackSwitchAndCall
133 KdbpStackSwitchAndCall:
141 /* Save old stack on new stack */
147 /* Restire old stack */