Subversion Repositories Kolibri OS

Rev

Rev 4893 | Rev 7124 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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