Subversion Repositories Kolibri OS

Rev

Rev 237 | Rev 329 | 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. end if
  547.  
  548.  
  549. ;uglobal
  550. ;  new_process_place  dd  0x0
  551. ;  app_start    dd  0x0
  552. ;  app_i_end    dd  0x0
  553. ;  app_mem      dd  0x0
  554. ;  app_esp      dd  0x0
  555. ;  app_i_param  dd  0x0
  556. ;  app_i_icon   dd  0x0
  557. ;  app_mem_pos  dd  0x0
  558. ;endg
  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. endg
  574.  
  575.  
  576. terminate: ; terminate application
  577.     push   esi
  578.     mov    esi,process_terminating
  579.     call   sys_msg_board_str
  580.     pop    esi
  581.  
  582. @@:
  583.     cli
  584.     cmp   [application_table_status],0
  585.     je    term9
  586.     sti
  587.     call  change_task
  588.     jmp   @b
  589.   term9:
  590.  
  591.     call  set_application_table_status
  592.  
  593.     mov    eax,esi
  594.  
  595.     pushad
  596.     shl   eax,8
  597.     mov   eax,[PROC_BASE+eax+0xB8]
  598.     stdcall destroy_app_space, eax
  599.     popad
  600.  
  601.     cmp   [fpu_owner],esi   ; if user fpu last -> fpu user = 1
  602.     jne   fpu_ok_1
  603.  
  604.     mov [fpu_owner],1
  605.     mov eax, [256+PROC_BASE+0x10]
  606.     bt [cpu_caps], CAPS_SSE
  607.     jnc .no_SSE
  608.     fxrstor [eax]
  609.     jmp fpu_ok_1
  610. .no_SSE:
  611.     fnclex
  612.     frstor [eax]
  613. fpu_ok_1:
  614.  
  615.     mov   [0xf400],byte 0           ; empty keyboard buffer
  616.     mov   [0xf500],byte 0           ; empty button buffer
  617.  
  618.  
  619. ; remove defined hotkeys
  620.         mov     eax, hotkey_list
  621. .loop:
  622.         cmp     [eax+8], esi
  623.         jnz     .cont
  624.         mov     ecx, [eax]
  625.         jecxz   @f
  626.         push    dword [eax+12]
  627.         pop     dword [ecx+12]
  628. @@:
  629.         mov     ecx, [eax+12]
  630.         push    dword [eax]
  631.         pop     dword [ecx]
  632.         xor     ecx, ecx
  633.         mov     [eax], ecx
  634.         mov     [eax+4], ecx
  635.         mov     [eax+8], ecx
  636.         mov     [eax+12], ecx
  637. .cont:
  638.         add     eax, 16
  639.         cmp     eax, hotkey_list+256*16
  640.         jb      .loop
  641. ; remove hotkeys in buffer
  642.         mov     eax, hotkey_buffer
  643. .loop2:
  644.         cmp     [eax], esi
  645.         jnz     .cont2
  646.         and     dword [eax+4], 0
  647.         and     dword [eax], 0
  648. .cont2:
  649.         add     eax, 8
  650.         cmp     eax, hotkey_buffer+120*8
  651.         jb      .loop2
  652.  
  653.     mov   ecx,esi                 ; remove buttons
  654.   bnewba2:
  655.     mov   edi,[0xfe88]
  656.     mov   eax,edi
  657.     cld
  658.     movzx ebx,word [edi]
  659.     inc   bx
  660.   bnewba:
  661.     dec   bx
  662.     jz    bnmba
  663.     add   eax,0x10
  664.     cmp   cx,[eax]
  665.     jnz   bnewba
  666.     pusha
  667.     mov   ecx,ebx
  668.     inc   ecx
  669.     shl   ecx,4
  670.     mov   ebx,eax
  671.     add   eax,0x10
  672.     call  memmove
  673.     dec   dword [edi]
  674.     popa
  675.     jmp   bnewba2
  676.   bnmba:
  677.  
  678.     pusha     ; save window coordinates for window restoring
  679.     cld
  680.     shl   esi,5
  681.     add   esi,window_data
  682.     mov   eax,[esi+WDATA.box.left]
  683.     mov   [dlx],eax
  684.     add   eax,[esi+WDATA.box.width]
  685.     mov   [dlxe],eax
  686.     mov   eax,[esi+WDATA.box.top]
  687.     mov   [dly],eax
  688.     add   eax,[esi+WDATA.box.height]
  689.     mov   [dlye],eax
  690.  
  691.     xor   eax, eax
  692.     mov   [esi+WDATA.box.left],eax
  693.     mov   [esi+WDATA.box.width],eax
  694.     mov   [esi+WDATA.box.top],eax
  695.     mov   [esi+WDATA.box.height],eax
  696.     mov   [esi+WDATA.cl_workarea],eax
  697.     mov   [esi+WDATA.cl_titlebar],eax
  698.     mov   [esi+WDATA.cl_frames],eax
  699.     mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
  700.     lea   edi, [esi-window_data+draw_data]
  701.     mov   ecx,32/4
  702.     rep   stosd
  703.     popa
  704.  
  705. ; debuggee test
  706.     pushad
  707.     mov  edi, esi
  708.     shl  edi, 5
  709.     mov  eax, [0x80000+edi*8+APPDATA.debugger_slot]
  710.     test eax, eax
  711.     jz   .nodebug
  712.     push 8
  713.     pop  ecx
  714.     push dword [0x3000+edi+TASKDATA.pid]   ; PID
  715.     push 2
  716.     call debugger_notify
  717.     pop  ecx
  718.     pop  ecx
  719. .nodebug:
  720.     popad
  721.  
  722.     pusha         ; at 0x80000+
  723.     mov   edi,esi
  724.     shl   edi,8
  725.     add   edi,0x80000
  726.     mov   ecx,256/4
  727.     xor   eax, eax
  728.     rep   stosd
  729.     popa
  730.  
  731.     pusha          ; name to spaces
  732.     mov   edi,esi
  733.     shl   edi,8
  734.     add   edi,0x80000+APPDATA.app_name
  735.     mov   ecx,11
  736.     mov   eax,' '
  737.     rep   stosb
  738.     popa
  739.  
  740.  
  741.   ; activate window
  742.         movzx  eax, word [0xC000 + esi*2]
  743.         cmp    eax, [0x3004]
  744.         jne    .dont_activate
  745.         pushad
  746.  .check_next_window:
  747.         dec    eax
  748.         cmp    eax, 1
  749.         jbe    .nothing_to_activate
  750.         lea    esi, [0xc400+eax*2]
  751.         movzx  edi, word [esi]               ; edi = process
  752.         shl    edi, 5
  753.         cmp    [0x3000 + edi + TASKDATA.state], byte 9  ; skip dead slots
  754.         je     .check_next_window
  755.         add    edi, window_data
  756. ; \begin{diamond}[19.09.2006]
  757. ; skip minimized windows
  758.         test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
  759.         jnz    .check_next_window
  760. ; \end{diamond}
  761.         call   waredraw
  762.  .nothing_to_activate:
  763.         popad
  764.  .dont_activate:
  765.  
  766.         push    esi     ; remove hd1 & cd & flp reservation
  767.         shl     esi, 5
  768.         mov     esi, [esi+0x3000+TASKDATA.pid]
  769.         cmp     [hd1_status], esi
  770.         jnz     @f
  771.         call    free_hd_channel
  772.         mov     [hd1_status], 0
  773. @@:
  774.         cmp     [cd_status], esi
  775.         jnz     @f
  776.         call    free_cd_channel
  777.         mov     [cd_status], 0
  778. @@:
  779.         cmp     [flp_status], esi
  780.         jnz     @f
  781.         mov     [flp_status], 0
  782. @@:
  783.         pop     esi
  784.  
  785.     pusha ; remove all irq reservations
  786.     mov   eax,esi
  787.     shl   eax, 5
  788.     mov   eax,[eax+0x3000+TASKDATA.pid]
  789.     mov   edi,irq_owner
  790.     mov   ecx,16
  791.   newirqfree:
  792.     scasd
  793.     jne   nofreeirq
  794.     mov   [edi-4],dword 0
  795.   nofreeirq:
  796.     loop   newirqfree
  797.     popa
  798.  
  799.  
  800.     pusha                     ; remove all port reservations
  801.     mov   edx,esi
  802.     shl   edx, 5
  803.     add   edx,0x3000
  804.     mov   edx,[edx+TASKDATA.pid]
  805.  
  806.   rmpr0:
  807.  
  808.     mov   esi,[0x2d0000]
  809.  
  810.     cmp   esi,0
  811.     je    rmpr9
  812.  
  813.   rmpr3:
  814.  
  815.     mov   edi,esi
  816.     shl   edi,4
  817.     add   edi,0x2d0000
  818.  
  819.     cmp   edx,[edi]
  820.     je    rmpr4
  821.  
  822.     dec   esi
  823.     jnz   rmpr3
  824.  
  825.     jmp   rmpr9
  826.  
  827.   rmpr4:
  828.  
  829.     mov   ecx,256
  830.     sub   ecx,esi
  831.     shl   ecx,4
  832.  
  833.     mov   esi,edi
  834.     add   esi,16
  835.     cld
  836.     rep   movsb
  837.  
  838.     dec   dword [0x2d0000]
  839.  
  840.     jmp   rmpr0
  841.  
  842.   rmpr9:
  843.  
  844.     popa
  845.     mov  edi,esi         ; do not run this process slot
  846.     shl  edi, 5
  847.     mov  [edi+0x3000 + TASKDATA.state],byte 9
  848. ; debugger test - terminate all debuggees
  849.     mov  eax, 2
  850.     mov  ecx, 0x80000+2*0x100+APPDATA.debugger_slot
  851. .xd0:
  852.     cmp  eax, [0x3004]
  853.     ja   .xd1
  854.     cmp  dword [ecx], esi
  855.     jnz  @f
  856.     and  dword [ecx], 0
  857.     pushad
  858.     xchg eax, ebx
  859.     mov  eax, 2
  860.     call sys_system
  861.     popad
  862. @@:
  863.     inc  eax
  864.     add  ecx, 0x100
  865.     jmp  .xd0
  866. .xd1:
  867. ;    call  systest
  868.     sti  ; .. and life goes on
  869.  
  870.     mov   eax, [dlx]
  871.     mov   ebx, [dly]
  872.     mov   ecx, [dlxe]
  873.     mov   edx, [dlye]
  874.     call  calculatescreen
  875.     xor   eax, eax
  876.     xor   esi, esi
  877.     call  redrawscreen
  878.  
  879.     mov   [0xfff4],byte 0  ; no mouse background
  880.     mov   [0xfff5],byte 0  ; draw mouse
  881.  
  882.     mov   [application_table_status],0
  883.     mov   esi,process_terminated
  884.     call  sys_msg_board_str
  885.  
  886.     ret
  887.  
  888. iglobal
  889.   boot_sched_1    db   'Building gdt tss pointer',0
  890.   boot_sched_2    db   'Building IDT table',0
  891. endg
  892.  
  893.  
  894. build_scheduler:
  895.  
  896.         mov    esi,boot_sched_1
  897.         call   boot_log
  898.         call   build_process_gdt_tss_pointer
  899.  
  900.         mov    esi,boot_sched_2
  901.         call   boot_log
  902.         call   build_interrupt_table
  903.  
  904.         ret
  905.  
  906.