Subversion Repositories Kolibri OS

Rev

Rev 5201 | Details | Compare with Previous | Last modification | View Log | RSS feed

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