[CRT] Massively improve performance of rand_s
[reactos.git] / ntoskrnl / kdbg / amd64 / kdb_help.S
1
2 #include <asm.inc>
3
4 #include <ksamd64.inc>
5
6 PUBLIC KdbEnter
7 KdbEnter:
8
9 /* save flags */
10 pushfq
11 // .pushreg ?
12
13 /* Make room for a KTRAP_FRAME */
14 sub rsp, SIZE_KTRAP_FRAME
15 // .allocstack SIZE_KTRAP_FRAME
16
17 /* Save rbp */
18 mov [rsp + KTRAP_FRAME_Rbp], rbp
19
20 /* Save non-volatile registers */
21 mov [rsp + KTRAP_FRAME_Rbx], rbx
22 mov [rsp + KTRAP_FRAME_Rdi], rdi
23 mov [rsp + KTRAP_FRAME_Rsi], rsi
24
25 /* Save volatile registers */
26 mov [rsp + KTRAP_FRAME_Rax], rax
27 mov [rsp + KTRAP_FRAME_Rcx], rcx
28 mov [rsp + KTRAP_FRAME_Rdx], rdx
29 mov [rsp + KTRAP_FRAME_R8], r8
30 mov [rsp + KTRAP_FRAME_R9], r9
31 mov [rsp + KTRAP_FRAME_R10], r10
32 mov [rsp + KTRAP_FRAME_R11], r11
33
34 /* Save xmm registers */
35 movdqa [rsp + KTRAP_FRAME_Xmm0], xmm0
36 movdqa [rsp + KTRAP_FRAME_Xmm1], xmm1
37 movdqa [rsp + KTRAP_FRAME_Xmm2], xmm2
38 movdqa [rsp + KTRAP_FRAME_Xmm3], xmm3
39 movdqa [rsp + KTRAP_FRAME_Xmm4], xmm4
40 movdqa [rsp + KTRAP_FRAME_Xmm5], xmm5
41
42 /* Save cs and previous mode */
43 mov ax, cs
44 mov [rsp + KTRAP_FRAME_SegCs], ax
45 and ax, 1
46 mov [rsp + KTRAP_FRAME_PreviousMode], al
47
48 /* Save segment selectors */
49 mov ax, ds
50 mov [rsp + KTRAP_FRAME_SegDs], ax
51 mov ax, es
52 mov [rsp + KTRAP_FRAME_SegEs], ax
53 mov ax, fs
54 mov [rsp + KTRAP_FRAME_SegFs], ax
55 mov ax, gs
56 mov [rsp + KTRAP_FRAME_SegGs], ax
57
58 /* Save previous irql */
59 mov rax, cr8
60 mov [rsp + KTRAP_FRAME_PreviousIrql], al
61
62 /* Save debug registers */
63 mov rax, dr0
64 mov [rsp + KTRAP_FRAME_Dr0], rax
65 mov rax, dr1
66 mov [rsp + KTRAP_FRAME_Dr1], rax
67 mov rax, dr2
68 mov [rsp + KTRAP_FRAME_Dr2], rax
69 mov rax, dr3
70 mov [rsp + KTRAP_FRAME_Dr3], rax
71 mov rax, dr6
72 mov [rsp + KTRAP_FRAME_Dr6], rax
73 mov rax, dr7
74 mov [rsp + KTRAP_FRAME_Dr7], rax
75
76 /* Point rbp, where rsp was before */
77 lea rbp, [rsp + SIZE_KTRAP_FRAME]
78 mov [rsp + KTRAP_FRAME_Rsp], rbp
79
80 /* Store the EFLAGS we previously pushed on the stack */
81 mov rax, [rbp + 8]
82 mov [rsp + KTRAP_FRAME_EFlags], rax
83
84 /* Get RIP from the stack */
85 mov rax, [rbp + 16]
86 mov [rsp + KTRAP_FRAME_Rip], rax
87
88 /* Make sure the direction flag is cleared */
89 cld
90
91 /* Clear all breakpoint enables in dr7. */
92 mov rax, dr7
93 and rax, 0xFFFF0000
94 mov dr7, rax
95
96 /* Call KDB */
97 mov byte ptr [rsp + KTRAP_FRAME_P5], 1 /* FirstChance */
98 mov r9, rsp /* Pointer to the trap frame */
99 mov r8, 0 /* Context */
100 mov dl, 0 /* PreviousMode (KernelMode) */
101 mov rcx, 0 /* ExceptionRecord */
102 call KdbEnterDebuggerException
103
104 /* Restore segment selectors */
105 mov ax, [rsp + KTRAP_FRAME_SegDs]
106 mov ds, ax
107 mov ax, [rsp + KTRAP_FRAME_SegEs]
108 mov es, ax
109 mov ax, [rsp + KTRAP_FRAME_SegFs]
110 mov fs, ax
111
112 /* Restore non-volatile registers */
113 mov rbx, [rsp + KTRAP_FRAME_Rbx]
114 mov rdi, [rsp + KTRAP_FRAME_Rdi]
115 mov rsi, [rsp + KTRAP_FRAME_Rsi]
116
117 /* Restore volatile registers */
118 mov rax, [rsp + KTRAP_FRAME_Rax]
119 mov rcx, [rsp + KTRAP_FRAME_Rcx]
120 mov rdx, [rsp + KTRAP_FRAME_Rdx]
121 mov r8, [rsp + KTRAP_FRAME_R8]
122 mov r9, [rsp + KTRAP_FRAME_R9]
123 mov r10, [rsp + KTRAP_FRAME_R10]
124 mov r11, [rsp + KTRAP_FRAME_R11]
125
126 /* Restore RSP */
127 mov rsp, [rsp + KTRAP_FRAME_Rsp]
128
129 /* Restore EFLAGS */
130 popfq
131
132 ret
133
134 .globl KdbpStackSwitchAndCall
135 KdbpStackSwitchAndCall:
136
137 /* Save old stack */
138 mov rax, rsp
139
140 /* Set new stack */
141 mov rsp, rcx
142
143 /* Save old stack on new stack */
144 push rax
145
146 /* Call function */
147 call rdx
148
149 /* Restire old stack */
150 pop rax
151 mov rsp, rax
152
153 /* Return */
154 ret
155
156 END