Subversion Repositories Kolibri OS

Rev

Rev 321 | Rev 334 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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