Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 479 $
431 serge 2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;                                                              ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
7
;;                                                              ;;
8
;;  MenuetOS process management, protected ring3                ;;
9
;;                                                              ;;
10
;;  Distributed under GPL. See file COPYING for details.        ;;
11
;;  Copyright 2003 Ville Turjanmaa                              ;;
12
;;                                                              ;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ha 14
 
389 serge 15
align 4
1 ha 16
idtreg:
17
     dw   8*0x41-1
18
     dd   idts+8
19
 
20
build_interrupt_table:
21
 
6 poddubny 22
        mov    edi, idts+8
23
        mov    esi, sys_int
8 poddubny 24
        mov    ecx, 0x40
6 poddubny 25
     @@:
434 diamond 26
        lodsd
465 serge 27
        mov    [edi],   ax           ; lower part of offset
28
        mov    [edi+2], word os_code ; segment selector
434 diamond 29
        mov     ax, word 10001110b shl 8        ; type: interrupt gate
30
        mov     [edi+4], eax
465 serge 31
        add    edi, 8
434 diamond 32
        loop    @b
164 serge 33
 
8 poddubny 34
        ;mov    edi,8*0x40+idts+8
434 diamond 35
        mov     dword [edi], (i40 and 0xFFFF) or (os_code shl 16)
36
        mov     dword [edi+4], (11101111b shl 8) or (i40 and 0xFFFF0000)
37
                                                ; type: trap gate
1 ha 38
        ret
39
 
40
iglobal
41
  sys_int:
164 serge 42
    dd e0,debug_exc,e2,e3
43
    dd e4,e5,e6,e7
44
    dd e8,e9,e10,e11
45
    dd e12,e13,page_fault_handler,e15
46
 
168 serge 47
    dd except_16, e17,e18, except_19
48
    times 12 dd unknown_interrupt
1 ha 49
 
221 serge 50
    dd   irq0  , irq_serv.irq_1, p_irq2 , p_irq3     ;irq_serv.irq_3
473 diamond 51
    dd   p_irq4 ,irq_serv.irq_5,p_irq6,irq_serv.irq_7
164 serge 52
    dd   irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
479 kastigar 53
    dd   irq_serv.irq_11,irq_serv.irq_12,irqD ,p_irq14,p_irq15
1 ha 54
 
55
    times 16 dd unknown_interrupt
56
 
57
    dd   i40
58
endg
59
 
40 halyavin 60
macro save_ring3_context
61
{
58 mario79 62
    pushad
40 halyavin 63
}
64
macro restore_ring3_context
65
{
58 mario79 66
    popad
40 halyavin 67
}
68
 
8 poddubny 69
; simply return control to interrupted process
70
unknown_interrupt:
71
     iret
1 ha 72
 
22 poddubny 73
macro exc_wo_code [num]
8 poddubny 74
{
75
  forward
76
  e#num :
40 halyavin 77
      save_ring3_context
20 mario79 78
      mov bl, num
79
      jmp exc_c
8 poddubny 80
}
1 ha 81
 
22 poddubny 82
macro exc_w_code [num]
83
{
84
  forward
85
  e#num :
86
      add esp, 4
40 halyavin 87
      save_ring3_context
22 poddubny 88
      mov bl, num
89
      jmp exc_c
90
}
91
 
168 serge 92
exc_wo_code 0, 1, 2, 3, 4, 5, 6, 9, 15, 18
22 poddubny 93
exc_w_code 8, 10, 11, 12, 13, 14, 17
94
 
8 poddubny 95
exc_c:
465 serge 96
        mov   ax, app_data  ;исключение
97
        mov   ds, ax        ;загрузим правильные значени
98
        mov   es, ax        ;в регистры
1 ha 99
 
40 halyavin 100
; test if debugging
101
        cli
465 serge 102
        mov   eax, [current_slot]
103
        mov   eax, [eax+APPDATA.debugger_slot]
40 halyavin 104
        test  eax, eax
105
        jnz   .debug
106
        sti
107
; not debuggee => say error and terminate
465 serge 108
        add   esp, 0x20  ;28h
164 serge 109
        movzx eax, bl
8 poddubny 110
        mov   [error_interrupt], eax
1 ha 111
        call  show_error_parameters
164 serge 112
 
379 serge 113
        mov   edx, [TASK_BASE]
115 poddubny 114
        mov   [edx + TASKDATA.state], byte 4
164 serge 115
 
1 ha 116
        jmp   change_task
117
 
40 halyavin 118
.debug:
119
; we are debugged process, notify debugger and suspend ourself
120
; eax=debugger PID
113 diamond 121
        cld
40 halyavin 122
        movzx ecx, bl
123
        push  ecx
379 serge 124
        mov   ecx, [TASK_BASE]
115 poddubny 125
        push  dword [ecx+TASKDATA.pid]    ; PID of current process
40 halyavin 126
        push  12
127
        pop   ecx
58 mario79 128
        push  1        ; 1=exception
40 halyavin 129
        call  debugger_notify
130
        pop   ecx
131
        pop   ecx
132
        pop   ecx
379 serge 133
        mov   edx, [TASK_BASE]
115 poddubny 134
        mov   byte [edx+TASKDATA.state], 1        ; suspended
40 halyavin 135
        call  change_task
136
        restore_ring3_context
137
        iretd
1 ha 138
 
139
writehex:
140
      pusha
164 serge 141
 
8 poddubny 142
      mov  edi, [write_error_to]
143
      mov  esi, 8
144
    @@:
145
      mov  ecx, eax
146
      and  ecx, 0xf
1 ha 147
 
8 poddubny 148
      mov  cl,[ecx+hexletters]
1 ha 149
      mov  [edi],cl
8 poddubny 150
      dec  edi
1 ha 151
 
8 poddubny 152
      shr  eax,4
1 ha 153
      dec  esi
8 poddubny 154
      jnz  @b
1 ha 155
 
156
      popa
157
      ret
158
 
159
iglobal
160
  hexletters  db '0123456789ABCDEF'
161
 
162
  error_interrupt         dd  -1
163
 
164
  process_error  db 'K : Process - forced terminate INT: 00000000',13,10,0
165
  process_pid    db 'K : Process - forced terminate PID: 00000000',13,10,0
166
  process_eip    db 'K : Process - forced terminate EIP: 00000000',13,10,0
167
  system_error   db 'K : Kernel error',13,10,0
168
endg
169
 
170
uglobal
171
  write_error_to  dd  0x0
172
endg
173
 
174
show_error_parameters:
164 serge 175
 
1 ha 176
        mov    [write_error_to],process_pid+43
379 serge 177
        mov    eax,[CURRENT_TASK]
1 ha 178
        shl    eax, 5
379 serge 179
        mov    eax,[CURRENT_TASK+TASKDATA.pid+eax]
1 ha 180
        call   writehex
164 serge 181
 
1 ha 182
        mov    [write_error_to],process_error+43
183
        mov    eax,[error_interrupt]
184
        call   writehex
16 poddubny 185
 
186
        cmp    dword [esp+4+4], os_code ; CS
187
        jnz    @f
10 poddubny 188
        mov    esi,system_error
189
        call   sys_msg_board_str
190
      @@:
16 poddubny 191
        mov    eax, [esp+4] ; EIP
10 poddubny 192
 
1 ha 193
        mov    [write_error_to],process_eip+43
194
        call   writehex
195
 
196
        mov    esi,process_error
197
        call   sys_msg_board_str
198
 
199
        mov    esi,process_pid
200
        call   sys_msg_board_str
201
 
202
        mov    esi,process_eip
203
        call   sys_msg_board_str
204
 
205
        ret
206
 
207
 
208
 
6 poddubny 209
; irq1  ->  hid/keyboard.inc
1 ha 210
 
211
 
10 poddubny 212
macro irqh [num]
8 poddubny 213
{
214
  forward
215
  p_irq#num :
40 halyavin 216
     save_ring3_context
8 poddubny 217
     mov   edi, num
218
     jmp   irq_c
219
}
1 ha 220
 
160 diamond 221
irqh 2,5,7,8,9,10,11
1 ha 222
 
465 serge 223
irq_c:
224
     mov   ax, app_data  ;os_data
8 poddubny 225
     mov   ds, ax
226
     mov   es, ax
1 ha 227
     call  irqhandler
40 halyavin 228
     restore_ring3_context
8 poddubny 229
     iret
11 poddubny 230
 
231
p_irq6:
40 halyavin 232
     save_ring3_context
465 serge 233
     mov   ax, app_data  ;os_data
11 poddubny 234
     mov   ds, ax
235
     mov   es, ax
236
     call  fdc_irq
33 mario79 237
     call  ready_for_next_irq
40 halyavin 238
     restore_ring3_context
33 mario79 239
     iret
15 poddubny 240
 
33 mario79 241
p_irq3:
40 halyavin 242
     save_ring3_context
465 serge 243
     mov   ax, app_data  ;os_data
33 mario79 244
     mov   ds, ax
245
     mov   es, ax
58 mario79 246
     cmp   [com2_mouse_detected],0
247
     je    old_irq3_handler
473 diamond 248
     mov   esi, com2_mouse
249
     mov   dx, 2F8h     ;[COMPortBaseAddr]
250
     call  check_mouse_data_com
58 mario79 251
     jmp   p_irq3_1
252
 old_irq3_handler:
253
     mov   edi,3
254
     call  irqhandler
164 serge 255
  p_irq3_1:
40 halyavin 256
     restore_ring3_context
33 mario79 257
     iret
15 poddubny 258
 
33 mario79 259
p_irq4:
40 halyavin 260
     save_ring3_context
465 serge 261
     mov   ax, app_data  ;os_data
33 mario79 262
     mov   ds, ax
263
     mov   es, ax
58 mario79 264
     cmp   [com1_mouse_detected],0
265
     je    old_irq4_handler
473 diamond 266
     mov   esi, com1_mouse
267
     mov   dx, 3F8h     ;[COMPortBaseAddr]
268
     call  check_mouse_data_com
58 mario79 269
     jmp   p_irq4_1
270
 old_irq4_handler:
271
     mov   edi,4
272
     call  irqhandler
164 serge 273
  p_irq4_1:
40 halyavin 274
     restore_ring3_context
11 poddubny 275
     iret
276
 
160 diamond 277
p_irq14:
278
        save_ring3_context
465 serge 279
        mov     ax, app_data  ;os_data
160 diamond 280
        mov     ds, ax
281
        mov     es, ax
282
        call    [irq14_func]
283
        call    ready_for_next_irq_1
284
        restore_ring3_context
285
        iret
286
p_irq15:
287
        save_ring3_context
465 serge 288
        mov     ax, app_data  ;os_data
160 diamond 289
        mov     ds, ax
290
        mov     es, ax
291
        call    [irq15_func]
292
        call    ready_for_next_irq_1
293
        restore_ring3_context
294
        iret
295
 
33 mario79 296
ready_for_next_irq:
297
     mov    [check_idle_semaphore],5
298
     mov   al, 0x20
299
     out   0x20, al
300
     ret
301
 
302
ready_for_next_irq_1:
303
     mov    [check_idle_semaphore],5
304
     mov   al, 0x20
305
     out    0xa0,al
306
     out   0x20, al
307
     ret
308
 
6 poddubny 309
irqD:
40 halyavin 310
     save_ring3_context
465 serge 311
     mov   ax, app_data  ;os_data
8 poddubny 312
     mov   ds, ax
313
     mov   es, ax
164 serge 314
 
6 poddubny 315
     mov   dx,0xf0
316
     mov   al,0
317
     out   dx,al
1 ha 318
 
6 poddubny 319
     mov   dx,0xa0
320
     mov   al,0x20
321
     out   dx,al
322
     mov   dx,0x20
40 halyavin 323
     out   dx,al
324
 
325
     restore_ring3_context
164 serge 326
 
8 poddubny 327
     iret
1 ha 328
 
329
 
330
irqhandler:
331
 
332
     push   edi
333
 
334
     mov    esi,edi          ; 1
335
     shl    esi,6            ; 1
336
     add    esi,irq00read    ; 1
337
     shl    edi,12           ; 1
381 serge 338
     add    edi,IRQ_SAVE
75 diamond 339
     mov    ecx,16
1 ha 340
 
341
     mov    [check_idle_semaphore],5
342
 
343
   irqnewread:
75 diamond 344
     dec    ecx
345
     js     irqover
1 ha 346
 
347
     mov    dx,[esi]         ; 2+
348
 
349
     cmp    dx,0             ; 1
350
     jz     irqover
351
     cmp    [esi+3],byte 1   ; 2     ; byte read
352
     jne    noirqbyte        ; 4-11
353
 
354
     in     al,dx
355
 
356
     mov    edx,[edi]
357
     cmp    edx,4000
358
     je     irqfull
359
     mov    ebx,edi
360
     add    ebx,0x10
361
     add    ebx,edx
362
     mov    [ebx],al
363
     inc    edx
364
     mov    [edi],edx
365
 
366
     add    esi,4
367
     jmp    irqnewread
368
 
369
   noirqbyte:
370
 
371
 
372
     cmp    [esi+3],byte 2     ; word read
373
     jne    noirqword
374
 
375
     in     ax,dx
376
 
377
     mov    edx,[edi]
378
     cmp    edx,4000
379
     je     irqfull
380
     mov    ebx,edi
381
     add    ebx,0x10
382
     add    ebx,edx
383
     mov    [ebx],ax
384
     add    edx,2
385
     mov    [edi],edx
386
     add    esi,4
387
     jmp    irqnewread
388
 
389
   noirqword:
390
   irqfull:
391
   irqover:
392
 
393
     mov    al,0x20            ; ready for next irq
394
     out    0x20,al
395
 
396
     pop    ebx
397
     cmp    ebx,7
398
     jbe    noa0
399
     out    0xa0,al
400
   noa0:
401
 
402
     ret
403
 
404
 
405
 
406
set_application_table_status:
407
        push eax
408
 
379 serge 409
        mov  eax,[CURRENT_TASK]
1 ha 410
        shl  eax, 5
379 serge 411
        add  eax,CURRENT_TASK+TASKDATA.pid
1 ha 412
        mov  eax,[eax]
413
 
414
        mov  [application_table_status],eax
415
 
416
        pop  eax
417
 
418
        ret
419
 
420
 
421
clear_application_table_status:
422
        push eax
423
 
379 serge 424
        mov  eax,[CURRENT_TASK]
1 ha 425
        shl  eax, 5
379 serge 426
        add  eax,CURRENT_TASK+TASKDATA.pid
1 ha 427
        mov  eax,[eax]
428
 
429
        cmp  eax,[application_table_status]
430
        jne  apptsl1
431
        mov  [application_table_status],0
432
      apptsl1:
433
 
434
        pop  eax
435
 
436
        ret
437
 
438
sys_resize_app_memory:
439
        ; eax = 1 - resize
440
        ;     ebx = new amount of memory
441
 
442
        cmp    eax,1
4 poddubny 443
        jne    .no_application_mem_resize
1 ha 444
 
164 serge 445
        stdcall new_mem_resize, ebx
446
        mov [esp+36], eax
447
        ret
1 ha 448
 
164 serge 449
.no_application_mem_resize:
1 ha 450
        ret
451
 
452
sys_threads:
453
 
454
; eax=1 create thread
455
;
456
;   ebx=thread start
457
;   ecx=thread stack value
458
;
459
; on return : eax = pid
460
jmp new_sys_threads
461
 
462
iglobal
463
  process_terminating   db 'K : Process - terminating',13,10,0
464
  process_terminated    db 'K : Process - done',13,10,0
329 serge 465
  msg_obj_destroy       db 'K : destroy app object',13,10,0
1 ha 466
endg
467
 
329 serge 468
; param
469
;  esi= slot
1 ha 470
 
471
terminate: ; terminate application
472
 
329 serge 473
           .slot equ esp   ;locals
474
 
475
           push   esi      ;save .slot
334 serge 476
 
477
           shl esi, 8
380 serge 478
           cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
334 serge 479
           jne @F
480
           add esp, 4
481
           ret
482
@@:
329 serge 483
           mov    esi,process_terminating
484
           call   sys_msg_board_str
40 halyavin 485
@@:
329 serge 486
           cli
487
           cmp   [application_table_status],0
488
           je    term9
489
           sti
490
           call  change_task
491
           jmp   @b
492
term9:
493
           call  set_application_table_status
1 ha 494
 
329 serge 495
           mov esi, [.slot]
496
           shl esi,8
380 serge 497
           add esi, SLOT_BASE+APP_OBJ_OFFSET
329 serge 498
@@:
499
           mov eax, [esi+APPOBJ.fd]
334 serge 500
           test eax, eax
501
           jz @F
502
 
329 serge 503
           cmp eax, esi
504
           je @F
164 serge 505
 
329 serge 506
           push esi
507
           call [eax+APPOBJ.destroy]
508
           mov  esi, msg_obj_destroy
509
           call sys_msg_board_str
510
           pop esi
511
           jmp @B
512
@@:
513
           mov eax, [.slot]
514
           shl eax, 8
380 serge 515
           mov eax,[SLOT_BASE+eax+APPDATA.dir_table]
329 serge 516
           stdcall destroy_app_space, eax
1 ha 517
 
357 serge 518
           mov esi, [.slot]
329 serge 519
           cmp [fpu_owner],esi   ; if user fpu last -> fpu user = 1
357 serge 520
           jne @F
164 serge 521
 
329 serge 522
           mov [fpu_owner],1
380 serge 523
           mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
379 serge 524
           clts
329 serge 525
           bt [cpu_caps], CAPS_SSE
526
           jnc .no_SSE
527
           fxrstor [eax]
357 serge 528
           jmp @F
203 serge 529
.no_SSE:
329 serge 530
           fnclex
531
           frstor [eax]
357 serge 532
@@:
203 serge 533
 
381 serge 534
    mov   [KEY_COUNT],byte 0           ; empty keyboard buffer
535
    mov   [BTN_COUNT],byte 0           ; empty button buffer
1 ha 536
 
537
 
92 diamond 538
; remove defined hotkeys
539
        mov     eax, hotkey_list
540
.loop:
541
        cmp     [eax+8], esi
542
        jnz     .cont
543
        mov     ecx, [eax]
544
        jecxz   @f
545
        push    dword [eax+12]
546
        pop     dword [ecx+12]
547
@@:
548
        mov     ecx, [eax+12]
549
        push    dword [eax]
550
        pop     dword [ecx]
551
        xor     ecx, ecx
552
        mov     [eax], ecx
553
        mov     [eax+4], ecx
554
        mov     [eax+8], ecx
555
        mov     [eax+12], ecx
556
.cont:
557
        add     eax, 16
558
        cmp     eax, hotkey_list+256*16
559
        jb      .loop
560
; remove hotkeys in buffer
561
        mov     eax, hotkey_buffer
562
.loop2:
563
        cmp     [eax], esi
564
        jnz     .cont2
565
        and     dword [eax+4], 0
566
        and     dword [eax], 0
567
.cont2:
568
        add     eax, 8
569
        cmp     eax, hotkey_buffer+120*8
570
        jb      .loop2
571
 
1 ha 572
    mov   ecx,esi                 ; remove buttons
573
  bnewba2:
381 serge 574
    mov   edi,[BTN_ADDR]
1 ha 575
    mov   eax,edi
576
    cld
577
    movzx ebx,word [edi]
578
    inc   bx
579
  bnewba:
580
    dec   bx
581
    jz    bnmba
582
    add   eax,0x10
583
    cmp   cx,[eax]
584
    jnz   bnewba
585
    pusha
586
    mov   ecx,ebx
587
    inc   ecx
588
    shl   ecx,4
589
    mov   ebx,eax
590
    add   eax,0x10
591
    call  memmove
592
    dec   dword [edi]
593
    popa
594
    jmp   bnewba2
595
  bnmba:
596
 
597
    pusha     ; save window coordinates for window restoring
598
    cld
599
    shl   esi,5
600
    add   esi,window_data
114 mikedld 601
    mov   eax,[esi+WDATA.box.left]
102 poddubny 602
    mov   [dlx],eax
114 mikedld 603
    add   eax,[esi+WDATA.box.width]
102 poddubny 604
    mov   [dlxe],eax
114 mikedld 605
    mov   eax,[esi+WDATA.box.top]
102 poddubny 606
    mov   [dly],eax
114 mikedld 607
    add   eax,[esi+WDATA.box.height]
102 poddubny 608
    mov   [dlye],eax
1 ha 609
 
142 diamond 610
    xor   eax, eax
611
    mov   [esi+WDATA.box.left],eax
612
    mov   [esi+WDATA.box.width],eax
114 mikedld 613
    mov   [esi+WDATA.box.top],eax
142 diamond 614
    mov   [esi+WDATA.box.height],eax
115 poddubny 615
    mov   [esi+WDATA.cl_workarea],eax
616
    mov   [esi+WDATA.cl_titlebar],eax
617
    mov   [esi+WDATA.cl_frames],eax
618
    mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
102 poddubny 619
    lea   edi, [esi-window_data+draw_data]
1 ha 620
    mov   ecx,32/4
621
    rep   stosd
622
    popa
623
 
40 halyavin 624
; debuggee test
625
    pushad
626
    mov  edi, esi
627
    shl  edi, 5
380 serge 628
    mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
40 halyavin 629
    test eax, eax
630
    jz   .nodebug
631
    push 8
632
    pop  ecx
379 serge 633
    push dword [CURRENT_TASK+edi+TASKDATA.pid]   ; PID
40 halyavin 634
    push 2
635
    call debugger_notify
636
    pop  ecx
637
    pop  ecx
638
.nodebug:
639
    popad
640
 
357 serge 641
           mov ebx, [.slot]
642
           shl ebx, 8
380 serge 643
           mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
1 ha 644
 
357 serge 645
           stdcall kernel_free, ebx
1 ha 646
 
357 serge 647
           mov edi, [.slot]
648
           shl edi,8
380 serge 649
           add edi,SLOT_BASE
465 serge 650
 
651
           mov eax, [edi+APPDATA.io_map]
652
           cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
653
           je @F
654
           call free_page
655
@@:
656
           mov eax, [edi+APPDATA.io_map+4]
657
           cmp eax, (tss._io_map_1-OS_BASE+PG_MAP)
658
           je @F
659
           call free_page
660
@@:
357 serge 661
           mov eax, 0x20202020
662
           stosd
663
           stosd
664
           stosd
665
           mov ecx,244/4
666
           xor eax, eax
667
           rep stosd
1 ha 668
 
102 poddubny 669
  ; activate window
380 serge 670
        movzx  eax, word [WIN_STACK + esi*2]
379 serge 671
        cmp    eax, [TASK_COUNT]
102 poddubny 672
        jne    .dont_activate
673
        pushad
674
 .check_next_window:
675
        dec    eax
676
        cmp    eax, 1
677
        jbe    .nothing_to_activate
380 serge 678
        lea    esi, [WIN_POS+eax*2]
102 poddubny 679
        movzx  edi, word [esi]               ; edi = process
680
        shl    edi, 5
379 serge 681
        cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
102 poddubny 682
        je     .check_next_window
683
        add    edi, window_data
154 diamond 684
; \begin{diamond}[19.09.2006]
685
; skip minimized windows
164 serge 686
        test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
687
        jnz    .check_next_window
154 diamond 688
; \end{diamond}
102 poddubny 689
        call   waredraw
690
 .nothing_to_activate:
691
        popad
692
 .dont_activate:
693
 
92 diamond 694
        push    esi     ; remove hd1 & cd & flp reservation
695
        shl     esi, 5
379 serge 696
        mov     esi, [esi+CURRENT_TASK+TASKDATA.pid]
92 diamond 697
        cmp     [hd1_status], esi
698
        jnz     @f
321 diamond 699
        call    free_hd_channel
92 diamond 700
        mov     [hd1_status], 0
701
@@:
702
        cmp     [cd_status], esi
703
        jnz     @f
321 diamond 704
        call    free_cd_channel
92 diamond 705
        mov     [cd_status], 0
706
@@:
707
        cmp     [flp_status], esi
708
        jnz     @f
709
        mov     [flp_status], 0
710
@@:
711
        pop     esi
1 ha 712
 
713
    pusha ; remove all irq reservations
92 diamond 714
    mov   eax,esi
115 poddubny 715
    shl   eax, 5
379 serge 716
    mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
1 ha 717
    mov   edi,irq_owner
718
    mov   ecx,16
719
  newirqfree:
92 diamond 720
    scasd
1 ha 721
    jne   nofreeirq
92 diamond 722
    mov   [edi-4],dword 0
1 ha 723
  nofreeirq:
724
    loop   newirqfree
725
    popa
726
 
727
    pusha                     ; remove all port reservations
728
    mov   edx,esi
115 poddubny 729
    shl   edx, 5
379 serge 730
    add   edx,CURRENT_TASK
115 poddubny 731
    mov   edx,[edx+TASKDATA.pid]
1 ha 732
 
733
  rmpr0:
734
 
381 serge 735
    mov   esi,[RESERVED_PORTS]
1 ha 736
 
737
    cmp   esi,0
738
    je    rmpr9
739
 
740
  rmpr3:
741
 
742
    mov   edi,esi
743
    shl   edi,4
381 serge 744
    add   edi,RESERVED_PORTS
1 ha 745
 
746
    cmp   edx,[edi]
747
    je    rmpr4
748
 
749
    dec   esi
750
    jnz   rmpr3
751
 
752
    jmp   rmpr9
753
 
754
  rmpr4:
755
 
756
    mov   ecx,256
757
    sub   ecx,esi
758
    shl   ecx,4
759
 
760
    mov   esi,edi
761
    add   esi,16
762
    cld
763
    rep   movsb
764
 
381 serge 765
    dec   dword [RESERVED_PORTS]
1 ha 766
 
767
    jmp   rmpr0
768
 
769
  rmpr9:
770
 
771
    popa
772
    mov  edi,esi         ; do not run this process slot
6 poddubny 773
    shl  edi, 5
379 serge 774
    mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
40 halyavin 775
; debugger test - terminate all debuggees
776
    mov  eax, 2
380 serge 777
    mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
40 halyavin 778
.xd0:
379 serge 779
    cmp  eax, [TASK_COUNT]
40 halyavin 780
    ja   .xd1
781
    cmp  dword [ecx], esi
782
    jnz  @f
783
    and  dword [ecx], 0
784
    pushad
785
    xchg eax, ebx
786
    mov  eax, 2
787
    call sys_system
788
    popad
789
@@:
790
    inc  eax
791
    add  ecx, 0x100
792
    jmp  .xd0
793
.xd1:
1 ha 794
;    call  systest
795
    sti  ; .. and life goes on
796
 
112 poddubny 797
    mov   eax, [dlx]
798
    mov   ebx, [dly]
799
    mov   ecx, [dlxe]
800
    mov   edx, [dlye]
1 ha 801
    call  calculatescreen
802
    xor   eax, eax
803
    xor   esi, esi
804
    call  redrawscreen
805
 
381 serge 806
    mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
807
    mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
1 ha 808
 
809
    mov   [application_table_status],0
810
    mov   esi,process_terminated
811
    call  sys_msg_board_str
357 serge 812
    add esp, 4
1 ha 813
    ret
345 serge 814
restore .slot
1 ha 815
 
816
iglobal
817
  boot_sched_1    db   'Building gdt tss pointer',0
8 poddubny 818
  boot_sched_2    db   'Building IDT table',0
1 ha 819
endg
820
 
821
 
822
build_scheduler:
823
 
465 serge 824
        mov    esi,boot_sched_1
825
        call   boot_log
826
  ;      call   build_process_gdt_tss_pointer
1 ha 827
 
465 serge 828
  ;      mov    esi,boot_sched_2
829
  ;      call   boot_log
1 ha 830
 
831
        ret
832