Subversion Repositories Kolibri OS

Rev

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

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