Rev 7124 | Rev 8840 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7124 | Rev 8534 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2015. 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: 7124 $ |
8 | $Revision: 8534 $ |
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 | ; { Patch by Coldy (rev. 7125), reason: http://board.kolibrios.org/viewtopic.php?f=1&t=1712&p=75957#p75957 |
|
86 | cli |
87 | ; cli |
87 | mov eax, ecx |
88 | ; mov eax, ecx |
88 | call pid_to_slot |
89 | ; call pid_to_slot |
89 | shl eax, 5 |
90 | ; shl eax, 5 |
90 | jz .ret |
91 | ; jz .ret |
- | 92 | call get_debuggee_slot |
|
- | 93 | jc .ret |
|
- | 94 | ; } End patch |
|
91 | mov cl, [CURRENT_TASK+eax+TASKDATA.state] ; process state |
95 | mov cl, [CURRENT_TASK+eax+TASKDATA.state] ; process state |
92 | test cl, cl |
96 | test cl, cl |
93 | jz .1 |
97 | jz .1 |
94 | cmp cl, 5 |
98 | cmp cl, 5 |
95 | jnz .ret |
99 | jnz .ret |
96 | mov cl, 2 |
100 | mov cl, 2 |
97 | .2: |
101 | .2: |
98 | mov [CURRENT_TASK+eax+TASKDATA.state], cl |
102 | mov [CURRENT_TASK+eax+TASKDATA.state], cl |
99 | .ret: |
103 | .ret: |
100 | sti |
104 | sti |
101 | ret |
105 | ret |
102 | .1: |
106 | .1: |
103 | inc ecx |
107 | inc ecx |
104 | jmp .2 |
108 | jmp .2 |
105 | 109 | ||
106 | do_resume: |
110 | do_resume: |
107 | mov cl, [CURRENT_TASK+eax+TASKDATA.state] |
111 | mov cl, [CURRENT_TASK+eax+TASKDATA.state] |
108 | cmp cl, 1 |
112 | cmp cl, 1 |
109 | jz .1 |
113 | jz .1 |
110 | cmp cl, 2 |
114 | cmp cl, 2 |
111 | jnz .ret |
115 | jnz .ret |
112 | mov cl, 5 |
116 | mov cl, 5 |
113 | .2: |
117 | .2: |
114 | mov [CURRENT_TASK+eax+TASKDATA.state], cl |
118 | mov [CURRENT_TASK+eax+TASKDATA.state], cl |
115 | .ret: |
119 | .ret: |
116 | ret |
120 | ret |
117 | .1: |
121 | .1: |
118 | dec ecx |
122 | dec ecx |
119 | jmp .2 |
123 | jmp .2 |
120 | 124 | ||
121 | debug_resume: |
125 | debug_resume: |
122 | ; in: ecx=pid |
126 | ; in: ecx=pid |
123 | ; destroys eax,ebx |
127 | ; destroys eax,ebx |
124 | cli |
128 | cli |
125 | mov eax, ecx |
129 | mov eax, ecx |
126 | call pid_to_slot |
130 | call pid_to_slot |
127 | shl eax, 5 |
131 | shl eax, 5 |
128 | jz .ret |
132 | jz .ret |
129 | call do_resume |
133 | call do_resume |
130 | .ret: |
134 | .ret: |
131 | sti |
135 | sti |
132 | ret |
136 | ret |
133 | 137 | ||
134 | debug_getcontext: |
138 | debug_getcontext: |
135 | ; in: |
139 | ; in: |
136 | ; ecx=pid |
140 | ; ecx=pid |
137 | ; edx=sizeof(CONTEXT) |
141 | ; edx=sizeof(CONTEXT) |
138 | ; esi->CONTEXT |
142 | ; esi->CONTEXT |
139 | ; destroys eax,ebx,ecx,edx,esi,edi |
143 | ; destroys eax,ebx,ecx,edx,esi,edi |
140 | 144 | ||
141 | xor ebx, ebx ; 0 - get only gp regs |
145 | xor ebx, ebx ; 0 - get only gp regs |
142 | cmp edx, 40 |
146 | cmp edx, 40 |
143 | je .std_ctx |
147 | je .std_ctx |
144 | 148 | ||
145 | cmp edx, 48+288 |
149 | cmp edx, 48+288 |
146 | jne .ret |
150 | jne .ret |
147 | 151 | ||
148 | inc ebx ; 1 - get sse context |
152 | inc ebx ; 1 - get sse context |
149 | ; TODO legacy 32-bit FPU/MMX context |
153 | ; TODO legacy 32-bit FPU/MMX context |
150 | .std_ctx: |
154 | .std_ctx: |
151 | ; push ecx |
155 | ; push ecx |
152 | ; mov ecx, esi |
156 | ; mov ecx, esi |
153 | call check_region |
157 | call check_region |
154 | ; pop ecx |
158 | ; pop ecx |
155 | dec eax |
159 | dec eax |
156 | jnz .ret |
160 | jnz .ret |
157 | call get_debuggee_slot |
161 | call get_debuggee_slot |
158 | jc .ret |
162 | jc .ret |
159 | 163 | ||
160 | shr eax, 5 |
164 | shr eax, 5 |
161 | cmp eax, [fpu_owner] |
165 | cmp eax, [fpu_owner] |
162 | jne @f |
166 | jne @f |
163 | inc bh ; set swap context flag |
167 | inc bh ; set swap context flag |
164 | @@: |
168 | @@: |
165 | shl eax, 8 |
169 | shl eax, 8 |
166 | mov edi, esi |
170 | mov edi, esi |
167 | mov eax, [eax+SLOT_BASE+APPDATA.pl0_stack] |
171 | mov eax, [eax+SLOT_BASE+APPDATA.pl0_stack] |
168 | lea esi, [eax+RING0_STACK_SIZE] |
172 | lea esi, [eax+RING0_STACK_SIZE] |
169 | 173 | ||
170 | .ring0: |
174 | .ring0: |
171 | ; note that following code assumes that all interrupt/exception handlers |
175 | ; note that following code assumes that all interrupt/exception handlers |
172 | ; save ring-3 context by pushad in this order |
176 | ; save ring-3 context by pushad in this order |
173 | ; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), pushad |
177 | ; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), pushad |
174 | sub esi, 8+12+20h |
178 | sub esi, 8+12+20h |
175 | lodsd ;edi |
179 | lodsd ;edi |
176 | mov [edi+24h], eax |
180 | mov [edi+24h], eax |
177 | lodsd ;esi |
181 | lodsd ;esi |
178 | mov [edi+20h], eax |
182 | mov [edi+20h], eax |
179 | lodsd ; ebp |
183 | lodsd ; ebp |
180 | mov [edi+1Ch], eax |
184 | mov [edi+1Ch], eax |
181 | lodsd ;esp |
185 | lodsd ;esp |
182 | lodsd ;ebx |
186 | lodsd ;ebx |
183 | mov [edi+14h], eax |
187 | mov [edi+14h], eax |
184 | lodsd ;edx |
188 | lodsd ;edx |
185 | mov [edi+10h], eax |
189 | mov [edi+10h], eax |
186 | lodsd ;ecx |
190 | lodsd ;ecx |
187 | mov [edi+0Ch], eax |
191 | mov [edi+0Ch], eax |
188 | lodsd ;eax |
192 | lodsd ;eax |
189 | mov [edi+8], eax |
193 | mov [edi+8], eax |
190 | lodsd ;eip |
194 | lodsd ;eip |
191 | mov [edi], eax |
195 | mov [edi], eax |
192 | lodsd ;cs |
196 | lodsd ;cs |
193 | lodsd ;eflags |
197 | lodsd ;eflags |
194 | mov [edi+4], eax |
198 | mov [edi+4], eax |
195 | lodsd ;esp |
199 | lodsd ;esp |
196 | mov [edi+18h], eax |
200 | mov [edi+18h], eax |
197 | 201 | ||
198 | dec bl |
202 | dec bl |
199 | js .ret |
203 | js .ret |
200 | dec bl |
204 | dec bl |
201 | jns .ret |
205 | jns .ret |
202 | 206 | ||
203 | test bh, bh ; check swap flag |
207 | test bh, bh ; check swap flag |
204 | jz @F |
208 | jz @F |
205 | 209 | ||
206 | ffree st0 ; swap context |
210 | ffree st0 ; swap context |
207 | @@: |
211 | @@: |
208 | 212 | ||
209 | add esi, 4 ;top of ring0 stack |
213 | add esi, 4 ;top of ring0 stack |
210 | ;fpu/sse context saved here |
214 | ;fpu/sse context saved here |
211 | add edi, 40 |
215 | add edi, 40 |
212 | mov eax, 1 ;sse context |
216 | mov eax, 1 ;sse context |
213 | stosd |
217 | stosd |
214 | xor eax, eax ;reserved dword |
218 | xor eax, eax ;reserved dword |
215 | stosd |
219 | stosd |
216 | 220 | ||
217 | mov ecx, 288/4 |
221 | mov ecx, 288/4 |
218 | rep movsd ;copy sse context |
222 | rep movsd ;copy sse context |
219 | 223 | ||
220 | .ret: |
224 | .ret: |
221 | sti |
225 | sti |
222 | ret |
226 | ret |
223 | 227 | ||
224 | debug_setcontext: |
228 | debug_setcontext: |
225 | ; in: |
229 | ; in: |
226 | ; ecx=pid |
230 | ; ecx=pid |
227 | ; edx=sizeof(CONTEXT) |
231 | ; edx=sizeof(CONTEXT) |
228 | ; esi->CONTEXT |
232 | ; esi->CONTEXT |
229 | ; destroys eax,ecx,edx,esi,edi |
233 | ; destroys eax,ecx,edx,esi,edi |
230 | cmp edx, 28h |
234 | cmp edx, 28h |
231 | jnz .ret |
235 | jnz .ret |
232 | ; push ebx |
236 | ; push ebx |
233 | ; mov ebx, edx |
237 | ; mov ebx, edx |
234 | call check_region |
238 | call check_region |
235 | ; pop ebx |
239 | ; pop ebx |
236 | dec eax |
240 | dec eax |
237 | jnz .ret |
241 | jnz .ret |
238 | call get_debuggee_slot |
242 | call get_debuggee_slot |
239 | jc .stiret |
243 | jc .stiret |
240 | ; mov esi, edx |
244 | ; mov esi, edx |
241 | mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack] |
245 | mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack] |
242 | lea edi, [eax+RING0_STACK_SIZE] |
246 | lea edi, [eax+RING0_STACK_SIZE] |
243 | 247 | ||
244 | .ring0: |
248 | .ring0: |
245 | sub edi, 8+12+20h |
249 | sub edi, 8+12+20h |
246 | mov eax, [esi+24h] ;edi |
250 | mov eax, [esi+24h] ;edi |
247 | stosd |
251 | stosd |
248 | mov eax, [esi+20h] ;esi |
252 | mov eax, [esi+20h] ;esi |
249 | stosd |
253 | stosd |
250 | mov eax, [esi+1Ch] ;ebp |
254 | mov eax, [esi+1Ch] ;ebp |
251 | stosd |
255 | stosd |
252 | scasd |
256 | scasd |
253 | mov eax, [esi+14h] ;ebx |
257 | mov eax, [esi+14h] ;ebx |
254 | stosd |
258 | stosd |
255 | mov eax, [esi+10h] ;edx |
259 | mov eax, [esi+10h] ;edx |
256 | stosd |
260 | stosd |
257 | mov eax, [esi+0Ch] ;ecx |
261 | mov eax, [esi+0Ch] ;ecx |
258 | stosd |
262 | stosd |
259 | mov eax, [esi+8] ;eax |
263 | mov eax, [esi+8] ;eax |
260 | stosd |
264 | stosd |
261 | mov eax, [esi] ;eip |
265 | mov eax, [esi] ;eip |
262 | stosd |
266 | stosd |
263 | scasd |
267 | scasd |
264 | mov eax, [esi+4] ;eflags |
268 | mov eax, [esi+4] ;eflags |
265 | stosd |
269 | stosd |
266 | mov eax, [esi+18h] ;esp |
270 | mov eax, [esi+18h] ;esp |
267 | stosd |
271 | stosd |
268 | .stiret: |
272 | .stiret: |
269 | sti |
273 | sti |
270 | .ret: |
274 | .ret: |
271 | ret |
275 | ret |
272 | 276 | ||
273 | debug_set_drx: |
277 | debug_set_drx: |
274 | call get_debuggee_slot |
278 | call get_debuggee_slot |
275 | jc .errret |
279 | jc .errret |
276 | mov ebp, eax |
280 | mov ebp, eax |
277 | lea eax, [eax*8+SLOT_BASE+APPDATA.dbg_regs] |
281 | lea eax, [eax*8+SLOT_BASE+APPDATA.dbg_regs] |
278 | ; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3 |
282 | ; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3 |
279 | ; [eax+10]=dr7 |
283 | ; [eax+10]=dr7 |
280 | cmp esi, OS_BASE |
284 | cmp esi, OS_BASE |
281 | jae .errret |
285 | jae .errret |
282 | cmp dl, 3 |
286 | cmp dl, 3 |
283 | ja .errret |
287 | ja .errret |
284 | mov ecx, dr7 |
288 | mov ecx, dr7 |
285 | ;fix me |
289 | ;fix me |
286 | xchg ecx, edx |
290 | xchg ecx, edx |
287 | shr edx, cl |
291 | shr edx, cl |
288 | shr edx, cl |
292 | shr edx, cl |
289 | xchg ecx, edx |
293 | xchg ecx, edx |
290 | 294 | ||
291 | test ecx, 2 ; bit 1+2*index = G0..G3, global break enable |
295 | test ecx, 2 ; bit 1+2*index = G0..G3, global break enable |
292 | jnz .errret2 |
296 | jnz .errret2 |
293 | test dh, dh |
297 | test dh, dh |
294 | jns .new |
298 | jns .new |
295 | ; clear breakpoint |
299 | ; clear breakpoint |
296 | movzx edx, dl |
300 | movzx edx, dl |
297 | add edx, edx |
301 | add edx, edx |
298 | and dword [eax+edx*2], 0 ; clear DR |
302 | and dword [eax+edx*2], 0 ; clear DR |
299 | btr dword [eax+10h], edx ; clear L bit |
303 | btr dword [eax+10h], edx ; clear L bit |
300 | test byte [eax+10h], 55h |
304 | test byte [eax+10h], 55h |
301 | jnz .okret |
305 | jnz .okret |
302 | ; imul eax, ebp, tss_step/32 |
306 | ; imul eax, ebp, tss_step/32 |
303 | ; and byte [eax + tss_data + TSS._trap], not 1 |
307 | ; and byte [eax + tss_data + TSS._trap], not 1 |
304 | and [ebp*8 + SLOT_BASE+APPDATA.dbg_state], not 1 |
308 | and [ebp*8 + SLOT_BASE+APPDATA.dbg_state], not 1 |
305 | .okret: |
309 | .okret: |
306 | and dword [esp+32], 0 |
310 | and dword [esp+32], 0 |
307 | sti |
311 | sti |
308 | ret |
312 | ret |
309 | .errret: |
313 | .errret: |
310 | sti |
314 | sti |
311 | mov dword [esp+32], 1 |
315 | mov dword [esp+32], 1 |
312 | ret |
316 | ret |
313 | .errret2: |
317 | .errret2: |
314 | sti |
318 | sti |
315 | mov dword [esp+32], 2 |
319 | mov dword [esp+32], 2 |
316 | ret |
320 | ret |
317 | .new: |
321 | .new: |
318 | ; add new breakpoint |
322 | ; add new breakpoint |
319 | ; dl=index; dh=flags; esi=address |
323 | ; dl=index; dh=flags; esi=address |
320 | test dh, 0xF0 |
324 | test dh, 0xF0 |
321 | jnz .errret |
325 | jnz .errret |
322 | mov cl, dh |
326 | mov cl, dh |
323 | and cl, 3 |
327 | and cl, 3 |
324 | cmp cl, 2 |
328 | cmp cl, 2 |
325 | jz .errret |
329 | jz .errret |
326 | mov cl, dh |
330 | mov cl, dh |
327 | shr cl, 2 |
331 | shr cl, 2 |
328 | cmp cl, 2 |
332 | cmp cl, 2 |
329 | jz .errret |
333 | jz .errret |
330 | 334 | ||
331 | mov ebx, esi |
335 | mov ebx, esi |
332 | test bl, dl |
336 | test bl, dl |
333 | 337 | ||
334 | jnz .errret |
338 | jnz .errret |
335 | or byte [eax+10h+1], 3 ; set GE and LE flags |
339 | or byte [eax+10h+1], 3 ; set GE and LE flags |
336 | 340 | ||
337 | movzx edx, dh |
341 | movzx edx, dh |
338 | movzx ecx, dl |
342 | movzx ecx, dl |
339 | add ecx, ecx |
343 | add ecx, ecx |
340 | bts dword [eax+10h], ecx ; set L flag |
344 | bts dword [eax+10h], ecx ; set L flag |
341 | add ecx, ecx |
345 | add ecx, ecx |
342 | mov [eax+ecx], ebx;esi ; set DR |
346 | mov [eax+ecx], ebx;esi ; set DR |
343 | shl edx, cl |
347 | shl edx, cl |
344 | mov ebx, 0xF |
348 | mov ebx, 0xF |
345 | shl ebx, cl |
349 | shl ebx, cl |
346 | not ebx |
350 | not ebx |
347 | and [eax+10h+2], bx |
351 | and [eax+10h+2], bx |
348 | or [eax+10h+2], dx ; set R/W and LEN fields |
352 | or [eax+10h+2], dx ; set R/W and LEN fields |
349 | ; imul eax, ebp, tss_step/32 |
353 | ; imul eax, ebp, tss_step/32 |
350 | ; or byte [eax + tss_data + TSS._trap], 1 |
354 | ; or byte [eax + tss_data + TSS._trap], 1 |
351 | or [ebp*8 + SLOT_BASE+APPDATA.dbg_state], 1 |
355 | or [ebp*8 + SLOT_BASE+APPDATA.dbg_state], 1 |
352 | jmp .okret |
356 | jmp .okret |
353 | 357 | ||
354 | debug_read_process_memory: |
358 | debug_read_process_memory: |
355 | ; in: |
359 | ; in: |
356 | ; ecx=pid |
360 | ; ecx=pid |
357 | ; edx=length |
361 | ; edx=length |
358 | ; edi->buffer in debugger |
362 | ; edi->buffer in debugger |
359 | ; esi=address in debuggee |
363 | ; esi=address in debuggee |
360 | ; out: [esp+36]=sizeof(read) |
364 | ; out: [esp+36]=sizeof(read) |
361 | ; destroys all |
365 | ; destroys all |
362 | ; push ebx |
366 | ; push ebx |
363 | ; mov ebx, esi |
367 | ; mov ebx, esi |
364 | call check_region |
368 | call check_region |
365 | ; pop ebx |
369 | ; pop ebx |
366 | dec eax |
370 | dec eax |
367 | jnz .err |
371 | jnz .err |
368 | call get_debuggee_slot |
372 | call get_debuggee_slot |
369 | jc .err |
373 | jc .err |
370 | shr eax, 5 |
374 | shr eax, 5 |
371 | mov ecx, edi |
375 | mov ecx, edi |
372 | call read_process_memory |
376 | call read_process_memory |
373 | sti |
377 | sti |
374 | mov dword [esp+32], eax |
378 | mov dword [esp+32], eax |
375 | ret |
379 | ret |
376 | .err: |
380 | .err: |
377 | or dword [esp+32], -1 |
381 | or dword [esp+32], -1 |
378 | ret |
382 | ret |
379 | 383 | ||
380 | debug_write_process_memory: |
384 | debug_write_process_memory: |
381 | ; in: |
385 | ; in: |
382 | ; ecx=pid |
386 | ; ecx=pid |
383 | ; edx=length |
387 | ; edx=length |
384 | ; edi->buffer in debugger |
388 | ; edi->buffer in debugger |
385 | ; esi=address in debuggee |
389 | ; esi=address in debuggee |
386 | ; out: [esp+36]=sizeof(write) |
390 | ; out: [esp+36]=sizeof(write) |
387 | ; destroys all |
391 | ; destroys all |
388 | ; push ebx |
392 | ; push ebx |
389 | ; mov ebx, esi |
393 | ; mov ebx, esi |
390 | call check_region |
394 | call check_region |
391 | ; pop ebx |
395 | ; pop ebx |
392 | dec eax |
396 | dec eax |
393 | jnz debug_read_process_memory.err |
397 | jnz debug_read_process_memory.err |
394 | call get_debuggee_slot |
398 | call get_debuggee_slot |
395 | jc debug_read_process_memory.err |
399 | jc debug_read_process_memory.err |
396 | shr eax, 5 |
400 | shr eax, 5 |
397 | mov ecx, edi |
401 | mov ecx, edi |
398 | call write_process_memory |
402 | call write_process_memory |
399 | sti |
403 | sti |
400 | mov [esp+32], eax |
404 | mov [esp+32], eax |
401 | ret |
405 | ret |
402 | 406 | ||
403 | debugger_notify: |
407 | debugger_notify: |
404 | ; in: eax=debugger slot |
408 | ; in: eax=debugger slot |
405 | ; ecx=size of debug message |
409 | ; ecx=size of debug message |
406 | ; [esp+4]..[esp+4+ecx]=message |
410 | ; [esp+4]..[esp+4+ecx]=message |
407 | ; interrupts must be disabled! |
411 | ; interrupts must be disabled! |
408 | ; destroys all general registers |
412 | ; destroys all general registers |
409 | ; interrupts remain disabled |
413 | ; interrupts remain disabled |
410 | xchg ebp, eax |
414 | xchg ebp, eax |
411 | mov edi, [timer_ticks] |
415 | mov edi, [timer_ticks] |
412 | add edi, 500 ; 5 sec timeout |
416 | add edi, 500 ; 5 sec timeout |
413 | .1: |
417 | .1: |
414 | mov eax, ebp |
418 | mov eax, ebp |
415 | shl eax, 8 |
419 | shl eax, 8 |
416 | mov esi, [SLOT_BASE+eax+APPDATA.dbg_event_mem] |
420 | mov esi, [SLOT_BASE+eax+APPDATA.dbg_event_mem] |
417 | test esi, esi |
421 | test esi, esi |
418 | jz .ret |
422 | jz .ret |
419 | ; read buffer header |
423 | ; read buffer header |
420 | push ecx |
424 | push ecx |
421 | push eax |
425 | push eax |
422 | push eax |
426 | push eax |
423 | mov eax, ebp |
427 | mov eax, ebp |
424 | mov ecx, esp |
428 | mov ecx, esp |
425 | mov edx, 8 |
429 | mov edx, 8 |
426 | call read_process_memory |
430 | call read_process_memory |
427 | cmp eax, edx |
431 | cmp eax, edx |
428 | jz @f |
432 | jz @f |
429 | add esp, 12 |
433 | add esp, 12 |
430 | jmp .ret |
434 | jmp .ret |
431 | @@: |
435 | @@: |
432 | cmp dword [ecx], 0 |
436 | cmp dword [ecx], 0 |
433 | jg @f |
437 | jg @f |
434 | .2: |
438 | .2: |
435 | pop ecx |
439 | pop ecx |
436 | pop ecx |
440 | pop ecx |
437 | pop ecx |
441 | pop ecx |
438 | cmp dword [CURRENT_TASK], 1 |
442 | cmp dword [CURRENT_TASK], 1 |
439 | jnz .notos |
443 | jnz .notos |
440 | cmp [timer_ticks], edi |
444 | cmp [timer_ticks], edi |
441 | jae .ret |
445 | jae .ret |
442 | .notos: |
446 | .notos: |
443 | sti |
447 | sti |
444 | call change_task |
448 | call change_task |
445 | cli |
449 | cli |
446 | jmp .1 |
450 | jmp .1 |
447 | @@: |
451 | @@: |
448 | mov edx, [ecx+8] |
452 | mov edx, [ecx+8] |
449 | add edx, [ecx+4] |
453 | add edx, [ecx+4] |
450 | cmp edx, [ecx] |
454 | cmp edx, [ecx] |
451 | ja .2 |
455 | ja .2 |
452 | ; advance buffer position |
456 | ; advance buffer position |
453 | push edx |
457 | push edx |
454 | mov edx, 4 |
458 | mov edx, 4 |
455 | sub ecx, edx |
459 | sub ecx, edx |
456 | mov eax, ebp |
460 | mov eax, ebp |
457 | add esi, edx |
461 | add esi, edx |
458 | call write_process_memory |
462 | call write_process_memory |
459 | pop eax |
463 | pop eax |
460 | ; write message |
464 | ; write message |
461 | mov eax, ebp |
465 | mov eax, ebp |
462 | add esi, edx |
466 | add esi, edx |
463 | add esi, [ecx+8] |
467 | add esi, [ecx+8] |
464 | add ecx, 20 |
468 | add ecx, 20 |
465 | pop edx |
469 | pop edx |
466 | pop edx |
470 | pop edx |
467 | pop edx |
471 | pop edx |
468 | call write_process_memory |
472 | call write_process_memory |
469 | ; new debug event |
473 | ; new debug event |
470 | mov eax, ebp |
474 | mov eax, ebp |
471 | shl eax, 8 |
475 | shl eax, 8 |
472 | or byte [SLOT_BASE+eax+APPDATA.event_mask+1], 1 ; set flag 100h |
476 | or byte [SLOT_BASE+eax+APPDATA.event_mask+1], 1 ; set flag 100h |
473 | .ret: |
477 | .ret: |
474 | ret |
478 | ret |