Subversion Repositories Kolibri OS

Rev

Rev 1076 | Rev 1394 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1076 Rev 1329
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2007. 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 1076 $
8
$Revision: 1329 $
9
 
9
 
10
 
10
 
11
; diamond, 2006
11
; diamond, 2006
12
sys_debug_services:
12
sys_debug_services:
13
        cmp     eax, 9
13
        cmp     ebx, 9
-
 
14
        ja      @f
-
 
15
        jmp     dword [sys_debug_services_table+ebx*4]
14
        ja      @f
16
@@:     ret
15
        jmp     dword [sys_debug_services_table+eax*4]
17
iglobal
16
@@:     ret
18
align 4
17
sys_debug_services_table:
19
sys_debug_services_table:
18
        dd      debug_set_event_data
20
        dd      debug_set_event_data
Line 23... Line 25...
23
        dd      debug_resume
25
        dd      debug_resume
24
        dd      debug_read_process_memory
26
        dd      debug_read_process_memory
25
        dd      debug_write_process_memory
27
        dd      debug_write_process_memory
26
        dd      debug_terminate
28
        dd      debug_terminate
27
        dd      debug_set_drx
29
        dd      debug_set_drx
28
 
30
endg
29
debug_set_event_data:
31
debug_set_event_data:
30
; in: ebx = pointer
32
; in: ecx = pointer
31
; destroys eax
33
; destroys eax
32
        mov     eax, [current_slot]
34
        mov     eax, [current_slot]
33
        mov     [eax+APPDATA.dbg_event_mem], ebx
35
        mov     [eax+APPDATA.dbg_event_mem], ecx
34
        ret
36
        ret
Line 35... Line 37...
35
 
37
 
36
get_debuggee_slot:
38
get_debuggee_slot:
37
; in: ebx=PID
39
; in: ecx=PID
38
; out: CF=1 if error
40
; out: CF=1 if error
39
;      CF=0 and eax=slot*0x20 if ok
41
;      CF=0 and eax=slot*0x20 if ok
40
; out: interrupts disabled
42
; out: interrupts disabled
41
        cli
43
        cli
42
        mov     eax, ebx
44
        mov     eax, ecx
43
        call    pid_to_slot
45
        call    pid_to_slot
44
        test    eax, eax
46
        test    eax, eax
45
        jz      .ret_bad
47
        jz      .ret_bad
46
        shl     eax, 5
48
        shl     eax, 5
Line 54... Line 56...
54
.ret_bad:
56
.ret_bad:
55
        stc
57
        stc
56
        ret
58
        ret
Line 57... Line 59...
57
 
59
 
58
debug_detach:
60
debug_detach:
59
; in: ebx=pid
61
; in: ecx=pid
60
; destroys eax,ebx
62
; destroys eax,ebx
61
        call    get_debuggee_slot
63
        call    get_debuggee_slot
62
        jc      .ret
64
        jc      .ret
63
        and     dword [eax*8+SLOT_BASE+APPDATA.debugger_slot], 0
65
        and     dword [eax*8+SLOT_BASE+APPDATA.debugger_slot], 0
64
        call    do_resume
66
        call    do_resume
65
.ret:
67
.ret:
66
        sti
68
        sti
Line 67... Line 69...
67
        ret
69
        ret
68
 
70
 
69
debug_terminate:
71
debug_terminate:
70
; in: ebx=pid
72
; in: ecx=pid
71
        call    get_debuggee_slot
73
        call    get_debuggee_slot
72
        jc      debug_detach.ret
74
        jc      debug_detach.ret
73
        mov     ecx, eax
75
        mov     ecx, eax
74
        shr     ecx, 5
76
        shr     ecx, 5
-
 
77
;        push    2
75
        push    2
78
;        pop     ebx
Line 76... Line 79...
76
        pop     ebx
79
        mov	edx,esi
77
        jmp     sys_system
80
        jmp     sysfn_terminate
78
 
81
 
79
debug_suspend:
82
debug_suspend:
80
; in: ebx=pid
83
; in: ecx=pid
81
; destroys eax,ebx
84
; destroys eax,ecx
82
        cli
85
        cli
83
        mov     eax, ebx
86
        mov     eax, ecx
84
        call    pid_to_slot
87
        call    pid_to_slot
85
        shl     eax, 5
88
        shl     eax, 5
86
        jz      .ret
89
        jz      .ret
87
        mov     bl, [CURRENT_TASK+eax+TASKDATA.state] ; process state
90
        mov     cl, [CURRENT_TASK+eax+TASKDATA.state] ; process state
88
        test    bl, bl
91
        test    cl, cl
89
        jz      .1
92
        jz      .1
90
        cmp     bl, 5
93
        cmp     cl, 5
91
        jnz     .ret
94
        jnz     .ret
92
        mov     bl, 2
95
        mov     cl, 2
93
.2:     mov     [CURRENT_TASK+eax+TASKDATA.state], bl
96
.2:     mov     [CURRENT_TASK+eax+TASKDATA.state], cl
94
.ret:
97
.ret:
95
        sti
98
        sti
96
        ret
99
        ret
Line 97... Line 100...
97
.1:
100
.1:
98
        inc     ebx
101
        inc     ecx
99
        jmp     .2
102
        jmp     .2
100
 
103
 
101
do_resume:
104
do_resume:
102
        mov     bl, [CURRENT_TASK+eax+TASKDATA.state]
105
        mov     cl, [CURRENT_TASK+eax+TASKDATA.state]
103
        cmp     bl, 1
106
        cmp     cl, 1
104
        jz      .1
107
        jz      .1
105
        cmp     bl, 2
108
        cmp     cl, 2
106
        jnz     .ret
109
        jnz     .ret
107
        mov     bl, 5
110
        mov     cl, 5
Line 108... Line 111...
108
.2:     mov     [CURRENT_TASK+eax+TASKDATA.state], bl
111
.2:     mov     [CURRENT_TASK+eax+TASKDATA.state], cl
109
.ret:   ret
112
.ret:   ret
110
.1:     dec     ebx
113
.1:     dec     ecx
111
        jmp     .2
114
        jmp     .2
112
 
115
 
113
debug_resume:
116
debug_resume:
114
; in: ebx=pid
117
; in: ecx=pid
115
; destroys eax,ebx
118
; destroys eax,ebx
116
        cli
119
        cli
117
        mov     eax, ebx
120
        mov     eax, ecx
118
        call    pid_to_slot
121
        call    pid_to_slot
Line 119... Line 122...
119
        shl     eax, 5
122
        shl     eax, 5
120
        jz      .ret
123
        jz      .ret
121
        call    do_resume
124
        call    do_resume
122
.ret:   sti
125
.ret:   sti
123
        ret
126
        ret
124
 
127
 
125
debug_getcontext:
128
debug_getcontext:
126
; in:
129
; in:
127
; ebx=pid
130
; ecx=pid
128
; ecx=sizeof(CONTEXT)
131
; edx=sizeof(CONTEXT)
129
; edx->CONTEXT
132
; esi->CONTEXT
130
; destroys eax,ecx,edx,esi,edi
133
; destroys eax,ecx,edx,esi,edi
131
        cmp     ecx, 28h
134
        cmp     edx, 28h
132
        jnz     .ret
135
        jnz     .ret
133
        push    ebx
136
;        push    ecx
134
        mov     ebx, edx
137
;        mov     ecx, esi
-
 
138
        call    check_region
135
        call    check_region
139
;        pop     ecx
136
        pop     ebx
140
        dec     eax
137
        dec     eax
-
 
-
 
141
        jnz     .ret
138
        jnz     .ret
142
        call    get_debuggee_slot
139
        call    get_debuggee_slot
143
        jc      .ret
140
        jc      .ret
144
        mov     edi, esi
141
        mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack]
145
        mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack]
142
        lea esi, [eax+RING0_STACK_SIZE]
146
        lea esi, [eax+RING0_STACK_SIZE]
Line 172... Line 176...
172
        sti
176
        sti
173
        ret
177
        ret
Line 174... Line 178...
174
 
178
 
175
debug_setcontext:
179
debug_setcontext:
176
; in:
180
; in:
177
; ebx=pid
181
; ecx=pid
178
; ecx=sizeof(CONTEXT)
182
; edx=sizeof(CONTEXT)
179
; edx->CONTEXT
183
; esi->CONTEXT
180
; destroys eax,ecx,edx,esi,edi
184
; destroys eax,ecx,edx,esi,edi
181
        cmp     ecx, 28h
185
        cmp     edx, 28h
182
        jnz     .ret
186
        jnz     .ret
183
        push    ebx
187
;        push    ebx
184
        mov     ebx, edx
188
;        mov     ebx, edx
185
        call    check_region
189
        call    check_region
186
        pop     ebx
190
;        pop     ebx
187
        dec     eax
191
        dec     eax
188
        jnz     .ret
192
        jnz     .ret
189
        call    get_debuggee_slot
193
        call    get_debuggee_slot
-
 
194
        jc      .stiret
190
        jc      .stiret
195
;        mov     esi, edx
191
        mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack]
196
        mov eax, [eax*8+SLOT_BASE+APPDATA.pl0_stack]
192
        lea edi, [eax+RING0_STACK_SIZE]
-
 
-
 
197
        lea edi, [eax+RING0_STACK_SIZE]
193
        mov     esi, edx
198
 
194
.ring0:
199
.ring0:
195
        sub     edi, 8+12+20h
200
        sub     edi, 8+12+20h
196
        mov     eax, [esi+24h]    ;edi
201
        mov     eax, [esi+24h]    ;edi
197
        stosd
202
        stosd
Line 225... Line 230...
225
        jc      .errret
230
        jc      .errret
226
        mov     ebp, eax
231
        mov     ebp, eax
227
        lea     eax, [eax*8+SLOT_BASE+APPDATA.dbg_regs]
232
        lea     eax, [eax*8+SLOT_BASE+APPDATA.dbg_regs]
228
; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3
233
; [eax]=dr0, [eax+4]=dr1, [eax+8]=dr2, [eax+C]=dr3
229
; [eax+10]=dr7
234
; [eax+10]=dr7
230
        cmp     edx, OS_BASE
235
        cmp     esi, OS_BASE
231
        jae      .errret
236
        jae      .errret
232
        cmp     cl, 3
237
        cmp     dl, 3
233
        ja      .errret
238
        ja      .errret
234
        mov     ebx, dr7
239
        mov     ecx, dr7
-
 
240
;fix me
-
 
241
	xchg	ecx,edx
235
        shr     ebx, cl
242
        shr     edx, cl
236
        shr     ebx, cl
243
        shr     edx, cl
-
 
244
	xchg	ecx,edx
-
 
245
 
237
        test    ebx, 2          ; bit 1+2*index = G0..G3, global break enable
246
        test    ecx, 2          ; bit 1+2*index = G0..G3, global break enable
238
        jnz     .errret2
247
        jnz     .errret2
239
        test    ch, ch
248
        test    dh, dh
240
        jns     .new
249
        jns     .new
241
; clear breakpoint
250
; clear breakpoint
242
        movzx   ecx, cl
251
        movzx   edx, dl
243
        add     ecx, ecx
252
        add     edx, edx
244
        and     dword [eax+ecx*2], 0    ; clear DR
253
        and     dword [eax+edx*2], 0    ; clear DR
245
        btr     dword [eax+10h], ecx    ; clear L bit
254
        btr     dword [eax+10h], edx    ; clear L bit
246
        test    byte [eax+10h], 55h
255
        test    byte [eax+10h], 55h
247
        jnz     .okret
256
        jnz     .okret
248
;        imul    eax, ebp, tss_step/32
257
;        imul    eax, ebp, tss_step/32
249
;        and     byte [eax + tss_data + TSS._trap], not 1
258
;        and     byte [eax + tss_data + TSS._trap], not 1
250
        and [ebp*8 + SLOT_BASE+APPDATA.dbg_state], not 1
259
        and [ebp*8 + SLOT_BASE+APPDATA.dbg_state], not 1
251
.okret:
260
.okret:
252
        and     dword [esp+36], 0
261
        and     dword [esp+32], 0
253
        sti
262
        sti
254
        ret
263
        ret
255
.errret:
264
.errret:
256
        sti
265
        sti
257
        mov     dword [esp+36], 1
266
        mov     dword [esp+32], 1
258
        ret
267
        ret
259
.errret2:
268
.errret2:
260
        sti
269
        sti
261
        mov     dword [esp+36], 2
270
        mov     dword [esp+32], 2
262
        ret
271
        ret
263
.new:
272
.new:
264
; add new breakpoint
273
; add new breakpoint
265
; cl=index; ch=flags; edx=address
274
; dl=index; dh=flags; esi=address
266
        test    ch, 0xF0
275
        test    dh, 0xF0
267
        jnz     .errret
276
        jnz     .errret
268
        mov     bl, ch
277
        mov     cl, dh
269
        and     bl, 3
278
        and     cl, 3
270
        cmp     bl, 2
279
        cmp     cl, 2
271
        jz      .errret
280
        jz      .errret
272
        mov     bl, ch
281
        mov     cl, dh
273
        shr     bl, 2
282
        shr     cl, 2
274
        cmp     bl, 2
283
        cmp     cl, 2
275
        jz      .errret
284
        jz      .errret
-
 
285
 
-
 
286
        mov	ebx,esi
276
        test    dl, bl
287
        test    bl, dl
-
 
288
 
277
        jnz     .errret
289
        jnz     .errret
278
        or      byte [eax+10h+1], 3     ; set GE and LE flags
290
        or      byte [eax+10h+1], 3     ; set GE and LE flags
-
 
291
 
279
        movzx   ebx, ch
292
        movzx   edx, dh
280
        movzx   ecx, cl
293
        movzx   ecx, dl
281
        add     ecx, ecx
294
        add     ecx, ecx
282
        bts     dword [eax+10h], ecx    ; set L flag
295
        bts     dword [eax+10h], ecx    ; set L flag
283
        add     ecx, ecx
296
        add     ecx, ecx
284
        mov     [eax+ecx], edx          ; set DR
297
        mov     [eax+ecx], ebx;esi      ; set DR
285
        shl     ebx, cl
-
 
286
        mov     edx, 0xF
-
 
287
        shl     edx, cl
298
        shl     edx, cl
-
 
299
        mov     ebx, 0xF
-
 
300
        shl     ebx, cl
288
        not     edx
301
        not     ebx
289
        and     [eax+10h+2], dx
302
        and     [eax+10h+2], bx
290
        or      [eax+10h+2], bx         ; set R/W and LEN fields
303
        or      [eax+10h+2], dx         ; set R/W and LEN fields
291
;        imul    eax, ebp, tss_step/32
304
;        imul    eax, ebp, tss_step/32
292
;        or      byte [eax + tss_data + TSS._trap], 1
305
;        or      byte [eax + tss_data + TSS._trap], 1
293
        or [ebp*8 + SLOT_BASE+APPDATA.dbg_state], 1
306
        or [ebp*8 + SLOT_BASE+APPDATA.dbg_state], 1
294
        jmp     .okret
307
        jmp     .okret
Line 295... Line 308...
295
 
308
 
296
debug_read_process_memory:
309
debug_read_process_memory:
297
; in:
310
; in:
298
; ebx=pid
311
; ecx=pid
299
; ecx=length
312
; edx=length
300
; esi->buffer in debugger
313
; edi->buffer in debugger
301
; edx=address in debuggee
314
; esi=address in debuggee
302
; out: [esp+36]=sizeof(read)
315
; out: [esp+36]=sizeof(read)
303
; destroys all
316
; destroys all
304
        push    ebx
317
;        push    ebx
305
        mov     ebx, esi
318
;        mov     ebx, esi
306
        call    check_region
319
        call    check_region
307
        pop     ebx
320
;        pop     ebx
308
        dec     eax
321
        dec     eax
309
        jnz     .err
322
        jnz     .err
310
        call    get_debuggee_slot
323
        call    get_debuggee_slot
311
        jc      .err
324
        jc      .err
312
        shr     eax, 5
325
        shr     eax, 5
313
        mov     ebx, esi
326
;        mov     ebx, esi
314
        call    read_process_memory
327
        call    read_process_memory
315
        sti
328
        sti
316
        mov     dword [esp+36], eax
329
        mov     dword [esp+32], eax
317
        ret
330
        ret
318
.err:
331
.err:
319
        or      dword [esp+36], -1
332
        or      dword [esp+32], -1
Line 320... Line 333...
320
        ret
333
        ret
321
 
334
 
322
debug_write_process_memory:
335
debug_write_process_memory:
323
; in:
336
; in:
324
; ebx=pid
337
; ecx=pid
325
; ecx=length
338
; edx=length
326
; esi->buffer in debugger
339
; edi->buffer in debugger
327
; edx=address in debuggee
340
; esi=address in debuggee
328
; out: [esp+36]=sizeof(write)
341
; out: [esp+36]=sizeof(write)
329
; destroys all
342
; destroys all
330
        push    ebx
343
;        push    ebx
331
        mov     ebx, esi
344
;        mov     ebx, esi
332
        call    check_region
345
        call    check_region
333
        pop     ebx
346
;        pop     ebx
334
        dec     eax
347
        dec     eax
335
        jnz     debug_read_process_memory.err
348
        jnz     debug_read_process_memory.err
336
        call    get_debuggee_slot
349
        call    get_debuggee_slot
337
        jc      debug_read_process_memory.err
350
        jc      debug_read_process_memory.err
338
        shr     eax, 5
351
        shr     eax, 5
339
        mov     ebx, esi
352
;        mov     ebx, esi
340
        call    write_process_memory
353
        call    write_process_memory
341
        sti
354
        sti
Line 342... Line 355...
342
        mov     [esp+36], eax
355
        mov     [esp+32], eax
343
        ret
356
        ret
344
 
357