Subversion Repositories Kolibri OS

Rev

Rev 2434 | Rev 5201 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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