Rev 2382 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2382 | Rev 2540 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | 7 | ||
8 | $Revision: 2382 $ |
8 | $Revision $ |
9 | 9 | ||
10 | 10 | ||
11 | ; diamond, 2006 |
11 | ; diamond, 2006 |
12 | sys_debug_services: |
12 | sys_debug_services: |
13 | cmp ebx, 9 |
13 | cmp ebx, 9 |
14 | ja @f |
14 | ja @f |
15 | jmp dword [sys_debug_services_table+ebx*4] |
15 | jmp dword [sys_debug_services_table+ebx*4] |
16 | @@: |
16 | @@: |
17 | ret |
17 | ret |
18 | iglobal |
18 | iglobal |
19 | align 4 |
19 | align 4 |
20 | sys_debug_services_table: |
20 | sys_debug_services_table: |
21 | dd debug_set_event_data |
21 | dd debug_set_event_data |
22 | dd debug_getcontext |
22 | dd debug_getcontext |
23 | dd debug_setcontext |
23 | dd debug_setcontext |
24 | dd debug_detach |
24 | dd debug_detach |
25 | dd debug_suspend |
25 | dd debug_suspend |
26 | dd debug_resume |
26 | dd debug_resume |
27 | dd debug_read_process_memory |
27 | dd debug_read_process_memory |
28 | dd debug_write_process_memory |
28 | dd debug_write_process_memory |
29 | dd debug_terminate |
29 | dd debug_terminate |
30 | dd debug_set_drx |
30 | dd debug_set_drx |
31 | endg |
31 | endg |
32 | debug_set_event_data: |
32 | debug_set_event_data: |
33 | ; in: ecx = pointer |
33 | ; in: ecx = pointer |
34 | ; destroys eax |
34 | ; destroys eax |
35 | mov eax, [current_slot] |
35 | mov eax, [current_slot] |
36 | mov [eax+APPDATA.dbg_event_mem], ecx |
36 | mov [eax+APPDATA.dbg_event_mem], ecx |
37 | ret |
37 | ret |
38 | 38 | ||
39 | get_debuggee_slot: |
39 | get_debuggee_slot: |
40 | ; in: ecx=PID |
40 | ; in: ecx=PID |
41 | ; out: CF=1 if error |
41 | ; out: CF=1 if error |
42 | ; CF=0 and eax=slot*0x20 if ok |
42 | ; CF=0 and eax=slot*0x20 if ok |
43 | ; out: interrupts disabled |
43 | ; out: interrupts disabled |
44 | cli |
44 | cli |
45 | mov eax, ecx |
45 | mov eax, ecx |
46 | call pid_to_slot |
46 | call pid_to_slot |
47 | test eax, eax |
47 | test eax, eax |
48 | jz .ret_bad |
48 | jz .ret_bad |
49 | shl eax, 5 |
49 | shl eax, 5 |
50 | push ebx |
50 | push ebx |
51 | mov ebx, [CURRENT_TASK] |
51 | mov ebx, [CURRENT_TASK] |
52 | cmp [SLOT_BASE+eax*8+APPDATA.debugger_slot], ebx |
52 | cmp [SLOT_BASE+eax*8+APPDATA.debugger_slot], ebx |
53 | pop ebx |
53 | pop ebx |
54 | jnz .ret_bad |
54 | jnz .ret_bad |
55 | ; clc ; automatically |
55 | ; clc ; automatically |
56 | ret |
56 | ret |
57 | .ret_bad: |
57 | .ret_bad: |
58 | stc |
58 | stc |
59 | ret |
59 | ret |
60 | 60 | ||
61 | debug_detach: |
61 | debug_detach: |
62 | ; in: ecx=pid |
62 | ; in: ecx=pid |
63 | ; destroys eax,ebx |
63 | ; destroys eax,ebx |
64 | call get_debuggee_slot |
64 | call get_debuggee_slot |
65 | jc .ret |
65 | jc .ret |
66 | and dword [eax*8+SLOT_BASE+APPDATA.debugger_slot], 0 |
66 | and dword [eax*8+SLOT_BASE+APPDATA.debugger_slot], 0 |
67 | call do_resume |
67 | call do_resume |
68 | .ret: |
68 | .ret: |
69 | sti |
69 | sti |
70 | ret |
70 | ret |
71 | 71 | ||
72 | debug_terminate: |
72 | debug_terminate: |
73 | ; in: ecx=pid |
73 | ; in: ecx=pid |
74 | call get_debuggee_slot |
74 | call get_debuggee_slot |
75 | jc debug_detach.ret |
75 | jc debug_detach.ret |
76 | mov ecx, eax |
76 | mov ecx, eax |
77 | shr ecx, 5 |
77 | shr ecx, 5 |
78 | ; push 2 |
78 | ; push 2 |
79 | ; pop ebx |
79 | ; pop ebx |
80 | mov edx, esi |
80 | mov edx, esi |
81 | jmp sysfn_terminate |
81 | jmp sysfn_terminate |
82 | 82 | ||
83 | debug_suspend: |
83 | debug_suspend: |
84 | ; in: ecx=pid |
84 | ; in: ecx=pid |
85 | ; destroys eax,ecx |
85 | ; destroys eax,ecx |
86 | cli |
86 | cli |
87 | mov eax, ecx |
87 | mov eax, ecx |
88 | call pid_to_slot |
88 | call pid_to_slot |
89 | shl eax, 5 |
89 | shl eax, 5 |
90 | jz .ret |
90 | jz .ret |
91 | mov cl, [CURRENT_TASK+eax+TASKDATA.state] ; process state |
91 | mov cl, [CURRENT_TASK+eax+TASKDATA.state] ; process state |
92 | test cl, cl |
92 | test cl, cl |
93 | jz .1 |
93 | jz .1 |
94 | cmp cl, 5 |
94 | cmp cl, 5 |
95 | jnz .ret |
95 | jnz .ret |
96 | mov cl, 2 |
96 | mov cl, 2 |
97 | .2: |
97 | .2: |
98 | mov [CURRENT_TASK+eax+TASKDATA.state], cl |
98 | mov [CURRENT_TASK+eax+TASKDATA.state], cl |
99 | .ret: |
99 | .ret: |
100 | sti |
100 | sti |
101 | ret |
101 | ret |
102 | .1: |
102 | .1: |
103 | inc ecx |
103 | inc ecx |
104 | jmp .2 |
104 | jmp .2 |
105 | 105 | ||
106 | do_resume: |
106 | do_resume: |
107 | mov cl, [CURRENT_TASK+eax+TASKDATA.state] |
107 | mov cl, [CURRENT_TASK+eax+TASKDATA.state] |
108 | cmp cl, 1 |
108 | cmp cl, 1 |
109 | jz .1 |
109 | jz .1 |
110 | cmp cl, 2 |
110 | cmp cl, 2 |
111 | jnz .ret |
111 | jnz .ret |
112 | mov cl, 5 |
112 | mov cl, 5 |
113 | .2: |
113 | .2: |
114 | mov [CURRENT_TASK+eax+TASKDATA.state], cl |
114 | mov [CURRENT_TASK+eax+TASKDATA.state], cl |
115 | .ret: |
115 | .ret: |
116 | ret |
116 | ret |
117 | .1: |
117 | .1: |
118 | dec ecx |
118 | dec ecx |
119 | jmp .2 |
119 | jmp .2 |
120 | 120 | ||
121 | debug_resume: |
121 | debug_resume: |
122 | ; in: ecx=pid |
122 | ; in: ecx=pid |
123 | ; destroys eax,ebx |
123 | ; destroys eax,ebx |
124 | cli |
124 | cli |
125 | mov eax, ecx |
125 | mov eax, ecx |
126 | call pid_to_slot |
126 | call pid_to_slot |
127 | shl eax, 5 |
127 | shl eax, 5 |
128 | jz .ret |
128 | jz .ret |
129 | call do_resume |
129 | call do_resume |
130 | .ret: |
130 | .ret: |
131 | sti |
131 | sti |
132 | ret |
132 | ret |
133 | 133 | ||
134 | debug_getcontext: |
134 | debug_getcontext: |
135 | ; in: |
135 | ; in: |
136 | ; ecx=pid |
136 | ; ecx=pid |
137 | ; edx=sizeof(CONTEXT) |
137 | ; edx=sizeof(CONTEXT) |
138 | ; esi->CONTEXT |
138 | ; esi->CONTEXT |
139 | ; destroys eax,ecx,edx,esi,edi |
139 | ; destroys eax,ecx,edx,esi,edi |
140 | cmp edx, 28h |
140 | cmp edx, 28h |
141 | jnz .ret |
141 | jnz .ret |
142 | ; push ecx |
142 | ; push ecx |
143 | ; mov ecx, esi |
143 | ; mov ecx, esi |
144 | call check_region |
144 | call check_region |
145 | ; pop ecx |
145 | ; pop ecx |
146 | dec eax |
146 | dec eax |
147 | jnz .ret |
147 | jnz .ret |
148 | call get_debuggee_slot |
148 | call get_debuggee_slot |
149 | jc .ret |
149 | jc .ret |
150 | mov edi, esi |
150 | mov edi, esi |
151 | mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack] |
151 | mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack] |
152 | lea esi, [eax+RING0_STACK_SIZE] |
152 | lea esi, [eax+RING0_STACK_SIZE] |
153 | 153 | ||
154 | .ring0: |
154 | .ring0: |
155 | ; note that following code assumes that all interrupt/exception handlers |
155 | ; note that following code assumes that all interrupt/exception handlers |
156 | ; saves ring-3 context by pushad in this order |
156 | ; saves ring-3 context by pushad in this order |
157 | ; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), pushad |
157 | ; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), pushad |
158 | sub esi, 8+12+20h |
158 | sub esi, 8+12+20h |
159 | lodsd ;edi |
159 | lodsd ;edi |
160 | mov [edi+24h], eax |
160 | mov [edi+24h], eax |
161 | lodsd ;esi |
161 | lodsd ;esi |
162 | mov [edi+20h], eax |
162 | mov [edi+20h], eax |
163 | lodsd ; ebp |
163 | lodsd ; ebp |
164 | mov [edi+1Ch], eax |
164 | mov [edi+1Ch], eax |
165 | lodsd ;esp |
165 | lodsd ;esp |
166 | lodsd ;ebx |
166 | lodsd ;ebx |
167 | mov [edi+14h], eax |
167 | mov [edi+14h], eax |
168 | lodsd ;edx |
168 | lodsd ;edx |
169 | mov [edi+10h], eax |
169 | mov [edi+10h], eax |
170 | lodsd ;ecx |
170 | lodsd ;ecx |
171 | mov [edi+0Ch], eax |
171 | mov [edi+0Ch], eax |
172 | lodsd ;eax |
172 | lodsd ;eax |
173 | mov [edi+8], eax |
173 | mov [edi+8], eax |
174 | lodsd ;eip |
174 | lodsd ;eip |
175 | mov [edi], eax |
175 | mov [edi], eax |
176 | lodsd ;cs |
176 | lodsd ;cs |
177 | lodsd ;eflags |
177 | lodsd ;eflags |
178 | mov [edi+4], eax |
178 | mov [edi+4], eax |
179 | lodsd ;esp |
179 | lodsd ;esp |
180 | mov [edi+18h], eax |
180 | mov [edi+18h], eax |
181 | .ret: |
181 | .ret: |
182 | sti |
182 | sti |
183 | ret |
183 | ret |
184 | 184 | ||
185 | debug_setcontext: |
185 | debug_setcontext: |
186 | ; in: |
186 | ; in: |
187 | ; ecx=pid |
187 | ; ecx=pid |
188 | ; edx=sizeof(CONTEXT) |
188 | ; edx=sizeof(CONTEXT) |
189 | ; esi->CONTEXT |
189 | ; esi->CONTEXT |
190 | ; destroys eax,ecx,edx,esi,edi |
190 | ; destroys eax,ecx,edx,esi,edi |
191 | cmp edx, 28h |
191 | cmp edx, 28h |
192 | jnz .ret |
192 | jnz .ret |
193 | ; push ebx |
193 | ; push ebx |
194 | ; mov ebx, edx |
194 | ; mov ebx, edx |
195 | call check_region |
195 | call check_region |
196 | ; pop ebx |
196 | ; pop ebx |
197 | dec eax |
197 | dec eax |
198 | jnz .ret |
198 | jnz .ret |
199 | call get_debuggee_slot |
199 | call get_debuggee_slot |
200 | jc .stiret |
200 | jc .stiret |
201 | ; mov esi, edx |
201 | ; mov esi, edx |
202 | mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack] |
202 | mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack] |
203 | lea edi, [eax+RING0_STACK_SIZE] |
203 | lea edi, [eax+RING0_STACK_SIZE] |
204 | 204 | ||
205 | .ring0: |
205 | .ring0: |
206 | sub edi, 8+12+20h |
206 | sub edi, 8+12+20h |
207 | mov eax, [esi+24h] ;edi |
207 | mov eax, [esi+24h] ;edi |
208 | stosd |
208 | stosd |
209 | mov eax, [esi+20h] ;esi |
209 | mov eax, [esi+20h] ;esi |
210 | stosd |
210 | stosd |
211 | mov eax, [esi+1Ch] ;ebp |
211 | mov eax, [esi+1Ch] ;ebp |
212 | stosd |
212 | stosd |
213 | scasd |
213 | scasd |
214 | mov eax, [esi+14h] ;ebx |
214 | mov eax, [esi+14h] ;ebx |
215 | stosd |
215 | stosd |
216 | mov eax, [esi+10h] ;edx |
216 | mov eax, [esi+10h] ;edx |
217 | stosd |
217 | stosd |
218 | mov eax, [esi+0Ch] ;ecx |
218 | mov eax, [esi+0Ch] ;ecx |
219 | stosd |
219 | stosd |
220 | mov eax, [esi+8] ;eax |
220 | mov eax, [esi+8] ;eax |
221 | stosd |
221 | stosd |
222 | mov eax, [esi] ;eip |
222 | mov eax, [esi] ;eip |
223 | stosd |
223 | stosd |
224 | scasd |
224 | scasd |
225 | mov eax, [esi+4] ;eflags |
225 | mov eax, [esi+4] ;eflags |
226 | stosd |
226 | stosd |
227 | mov eax, [esi+18h] ;esp |
227 | mov eax, [esi+18h] ;esp |
228 | stosd |
228 | stosd |
229 | .stiret: |
229 | .stiret: |
230 | sti |
230 | sti |
231 | .ret: |
231 | .ret: |
232 | ret |
232 | ret |
233 | 233 | ||
234 | debug_set_drx: |
234 | debug_set_drx: |
235 | call get_debuggee_slot |
235 | call get_debuggee_slot |
236 | jc .errret |
236 | jc .errret |
237 | mov ebp, eax |
237 | mov ebp, eax |
238 | lea eax, [eax*8+SLOT_BASE+APPDATA.dbg_regs] |
238 | lea eax, [eax*8+SLOT_BASE+APPDATA.dbg_regs] |
239 | ; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3 |
239 | ; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3 |
240 | ; [eax+10]=dr7 |
240 | ; [eax+10]=dr7 |
241 | cmp esi, OS_BASE |
241 | cmp esi, OS_BASE |
242 | jae .errret |
242 | jae .errret |
243 | cmp dl, 3 |
243 | cmp dl, 3 |
244 | ja .errret |
244 | ja .errret |
245 | mov ecx, dr7 |
245 | mov ecx, dr7 |
246 | ;fix me |
246 | ;fix me |
247 | xchg ecx, edx |
247 | xchg ecx, edx |
248 | shr edx, cl |
248 | shr edx, cl |
249 | shr edx, cl |
249 | shr edx, cl |
250 | xchg ecx, edx |
250 | xchg ecx, edx |
251 | 251 | ||
252 | test ecx, 2 ; bit 1+2*index = G0..G3, global break enable |
252 | test ecx, 2 ; bit 1+2*index = G0..G3, global break enable |
253 | jnz .errret2 |
253 | jnz .errret2 |
254 | test dh, dh |
254 | test dh, dh |
255 | jns .new |
255 | jns .new |
256 | ; clear breakpoint |
256 | ; clear breakpoint |
257 | movzx edx, dl |
257 | movzx edx, dl |
258 | add edx, edx |
258 | add edx, edx |
259 | and dword [eax+edx*2], 0 ; clear DR |
259 | and dword [eax+edx*2], 0 ; clear DR |
260 | btr dword [eax+10h], edx ; clear L bit |
260 | btr dword [eax+10h], edx ; clear L bit |
261 | test byte [eax+10h], 55h |
261 | test byte [eax+10h], 55h |
262 | jnz .okret |
262 | jnz .okret |
263 | ; imul eax, ebp, tss_step/32 |
263 | ; imul eax, ebp, tss_step/32 |
264 | ; and byte [eax + tss_data + TSS._trap], not 1 |
264 | ; and byte [eax + tss_data + TSS._trap], not 1 |
265 | and [ebp*8 + SLOT_BASE+APPDATA.dbg_state], not 1 |
265 | and [ebp*8 + SLOT_BASE+APPDATA.dbg_state], not 1 |
266 | .okret: |
266 | .okret: |
267 | and dword [esp+32], 0 |
267 | and dword [esp+32], 0 |
268 | sti |
268 | sti |
269 | ret |
269 | ret |
270 | .errret: |
270 | .errret: |
271 | sti |
271 | sti |
272 | mov dword [esp+32], 1 |
272 | mov dword [esp+32], 1 |
273 | ret |
273 | ret |
274 | .errret2: |
274 | .errret2: |
275 | sti |
275 | sti |
276 | mov dword [esp+32], 2 |
276 | mov dword [esp+32], 2 |
277 | ret |
277 | ret |
278 | .new: |
278 | .new: |
279 | ; add new breakpoint |
279 | ; add new breakpoint |
280 | ; dl=index; dh=flags; esi=address |
280 | ; dl=index; dh=flags; esi=address |
281 | test dh, 0xF0 |
281 | test dh, 0xF0 |
282 | jnz .errret |
282 | jnz .errret |
283 | mov cl, dh |
283 | mov cl, dh |
284 | and cl, 3 |
284 | and cl, 3 |
285 | cmp cl, 2 |
285 | cmp cl, 2 |
286 | jz .errret |
286 | jz .errret |
287 | mov cl, dh |
287 | mov cl, dh |
288 | shr cl, 2 |
288 | shr cl, 2 |
289 | cmp cl, 2 |
289 | cmp cl, 2 |
290 | jz .errret |
290 | jz .errret |
291 | 291 | ||
292 | mov ebx, esi |
292 | mov ebx, esi |
293 | test bl, dl |
293 | test bl, dl |
294 | 294 | ||
295 | jnz .errret |
295 | jnz .errret |
296 | or byte [eax+10h+1], 3 ; set GE and LE flags |
296 | or byte [eax+10h+1], 3 ; set GE and LE flags |
297 | 297 | ||
298 | movzx edx, dh |
298 | movzx edx, dh |
299 | movzx ecx, dl |
299 | movzx ecx, dl |
300 | add ecx, ecx |
300 | add ecx, ecx |
301 | bts dword [eax+10h], ecx ; set L flag |
301 | bts dword [eax+10h], ecx ; set L flag |
302 | add ecx, ecx |
302 | add ecx, ecx |
303 | mov [eax+ecx], ebx;esi ; set DR |
303 | mov [eax+ecx], ebx;esi ; set DR |
304 | shl edx, cl |
304 | shl edx, cl |
305 | mov ebx, 0xF |
305 | mov ebx, 0xF |
306 | shl ebx, cl |
306 | shl ebx, cl |
307 | not ebx |
307 | not ebx |
308 | and [eax+10h+2], bx |
308 | and [eax+10h+2], bx |
309 | or [eax+10h+2], dx ; set R/W and LEN fields |
309 | or [eax+10h+2], dx ; set R/W and LEN fields |
310 | ; imul eax, ebp, tss_step/32 |
310 | ; imul eax, ebp, tss_step/32 |
311 | ; or byte [eax + tss_data + TSS._trap], 1 |
311 | ; or byte [eax + tss_data + TSS._trap], 1 |
312 | or [ebp*8 + SLOT_BASE+APPDATA.dbg_state], 1 |
312 | or [ebp*8 + SLOT_BASE+APPDATA.dbg_state], 1 |
313 | jmp .okret |
313 | jmp .okret |
314 | 314 | ||
315 | debug_read_process_memory: |
315 | debug_read_process_memory: |
316 | ; in: |
316 | ; in: |
317 | ; ecx=pid |
317 | ; ecx=pid |
318 | ; edx=length |
318 | ; edx=length |
319 | ; edi->buffer in debugger |
319 | ; edi->buffer in debugger |
320 | ; esi=address in debuggee |
320 | ; esi=address in debuggee |
321 | ; out: [esp+36]=sizeof(read) |
321 | ; out: [esp+36]=sizeof(read) |
322 | ; destroys all |
322 | ; destroys all |
323 | ; push ebx |
323 | ; push ebx |
324 | ; mov ebx, esi |
324 | ; mov ebx, esi |
325 | call check_region |
325 | call check_region |
326 | ; pop ebx |
326 | ; pop ebx |
327 | dec eax |
327 | dec eax |
328 | jnz .err |
328 | jnz .err |
329 | call get_debuggee_slot |
329 | call get_debuggee_slot |
330 | jc .err |
330 | jc .err |
331 | shr eax, 5 |
331 | shr eax, 5 |
332 | mov ecx, edi |
332 | mov ecx, edi |
333 | call read_process_memory |
333 | call read_process_memory |
334 | sti |
334 | sti |
335 | mov dword [esp+32], eax |
335 | mov dword [esp+32], eax |
336 | ret |
336 | ret |
337 | .err: |
337 | .err: |
338 | or dword [esp+32], -1 |
338 | or dword [esp+32], -1 |
339 | ret |
339 | ret |
340 | 340 | ||
341 | debug_write_process_memory: |
341 | debug_write_process_memory: |
342 | ; in: |
342 | ; in: |
343 | ; ecx=pid |
343 | ; ecx=pid |
344 | ; edx=length |
344 | ; edx=length |
345 | ; edi->buffer in debugger |
345 | ; edi->buffer in debugger |
346 | ; esi=address in debuggee |
346 | ; esi=address in debuggee |
347 | ; out: [esp+36]=sizeof(write) |
347 | ; out: [esp+36]=sizeof(write) |
348 | ; destroys all |
348 | ; destroys all |
349 | ; push ebx |
349 | ; push ebx |
350 | ; mov ebx, esi |
350 | ; mov ebx, esi |
351 | call check_region |
351 | call check_region |
352 | ; pop ebx |
352 | ; pop ebx |
353 | dec eax |
353 | dec eax |
354 | jnz debug_read_process_memory.err |
354 | jnz debug_read_process_memory.err |
355 | call get_debuggee_slot |
355 | call get_debuggee_slot |
356 | jc debug_read_process_memory.err |
356 | jc debug_read_process_memory.err |
357 | shr eax, 5 |
357 | shr eax, 5 |
358 | mov ecx, edi |
358 | mov ecx, edi |
359 | call write_process_memory |
359 | call write_process_memory |
360 | sti |
360 | sti |
361 | mov [esp+32], eax |
361 | mov [esp+32], eax |
362 | ret |
362 | ret |
363 | 363 | ||
364 | debugger_notify: |
364 | debugger_notify: |
365 | ; in: eax=debugger slot |
365 | ; in: eax=debugger slot |
366 | ; ecx=size of debug message |
366 | ; ecx=size of debug message |
367 | ; [esp+4]..[esp+4+ecx]=message |
367 | ; [esp+4]..[esp+4+ecx]=message |
368 | ; interrupts must be disabled! |
368 | ; interrupts must be disabled! |
369 | ; destroys all general registers |
369 | ; destroys all general registers |
370 | ; interrupts remain disabled |
370 | ; interrupts remain disabled |
371 | xchg ebp, eax |
371 | xchg ebp, eax |
372 | mov edi, [timer_ticks] |
372 | mov edi, [timer_ticks] |
373 | add edi, 500 ; 5 sec timeout |
373 | add edi, 500 ; 5 sec timeout |
374 | .1: |
374 | .1: |
375 | mov eax, ebp |
375 | mov eax, ebp |
376 | shl eax, 8 |
376 | shl eax, 8 |
377 | mov esi, [SLOT_BASE+eax+APPDATA.dbg_event_mem] |
377 | mov esi, [SLOT_BASE+eax+APPDATA.dbg_event_mem] |
378 | test esi, esi |
378 | test esi, esi |
379 | jz .ret |
379 | jz .ret |
380 | ; read buffer header |
380 | ; read buffer header |
381 | push ecx |
381 | push ecx |
382 | push eax |
382 | push eax |
383 | push eax |
383 | push eax |
384 | mov eax, ebp |
384 | mov eax, ebp |
385 | mov ecx, esp |
385 | mov ecx, esp |
386 | mov edx, 8 |
386 | mov edx, 8 |
387 | call read_process_memory |
387 | call read_process_memory |
388 | cmp eax, edx |
388 | cmp eax, edx |
389 | jz @f |
389 | jz @f |
390 | add esp, 12 |
390 | add esp, 12 |
391 | jmp .ret |
391 | jmp .ret |
392 | @@: |
392 | @@: |
393 | cmp dword [ecx], 0 |
393 | cmp dword [ecx], 0 |
394 | jg @f |
394 | jg @f |
395 | .2: |
395 | .2: |
396 | pop ecx |
396 | pop ecx |
397 | pop ecx |
397 | pop ecx |
398 | pop ecx |
398 | pop ecx |
399 | cmp dword [CURRENT_TASK], 1 |
399 | cmp dword [CURRENT_TASK], 1 |
400 | jnz .notos |
400 | jnz .notos |
401 | cmp [timer_ticks], edi |
401 | cmp [timer_ticks], edi |
402 | jae .ret |
402 | jae .ret |
403 | .notos: |
403 | .notos: |
404 | sti |
404 | sti |
405 | call change_task |
405 | call change_task |
406 | cli |
406 | cli |
407 | jmp .1 |
407 | jmp .1 |
408 | @@: |
408 | @@: |
409 | mov edx, [ecx+8] |
409 | mov edx, [ecx+8] |
410 | add edx, [ecx+4] |
410 | add edx, [ecx+4] |
411 | cmp edx, [ecx] |
411 | cmp edx, [ecx] |
412 | ja .2 |
412 | ja .2 |
413 | ; advance buffer position |
413 | ; advance buffer position |
414 | push edx |
414 | push edx |
415 | mov edx, 4 |
415 | mov edx, 4 |
416 | sub ecx, edx |
416 | sub ecx, edx |
417 | mov eax, ebp |
417 | mov eax, ebp |
418 | add esi, edx |
418 | add esi, edx |
419 | call write_process_memory |
419 | call write_process_memory |
420 | pop eax |
420 | pop eax |
421 | ; write message |
421 | ; write message |
422 | mov eax, ebp |
422 | mov eax, ebp |
423 | add esi, edx |
423 | add esi, edx |
424 | add esi, [ecx+8] |
424 | add esi, [ecx+8] |
425 | add ecx, 20 |
425 | add ecx, 20 |
426 | pop edx |
426 | pop edx |
427 | pop edx |
427 | pop edx |
428 | pop edx |
428 | pop edx |
429 | call write_process_memory |
429 | call write_process_memory |
430 | ; new debug event |
430 | ; new debug event |
431 | mov eax, ebp |
431 | mov eax, ebp |
432 | shl eax, 8 |
432 | shl eax, 8 |
433 | or byte [SLOT_BASE+eax+APPDATA.event_mask+1], 1 ; set flag 100h |
433 | or byte [SLOT_BASE+eax+APPDATA.event_mask+1], 1 ; set flag 100h |
434 | .ret: |
434 | .ret: |
435 | ret |
435 | ret |