Subversion Repositories Kolibri OS

Rev

Rev 769 | Rev 787 | 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: 774 $
  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, p_irq2
  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.     DEBUGF  1, "K : Exception : %x Error : xxxxxxxx\n", [error_interrupt]
  164.     DEBUGF  1, "K : EAX : %x EBX : %x ECX : %x\n", [esp + 0x20], [esp - 12 + 0x20], [esp - 4 + 0x20]
  165.     DEBUGF  1, "K : EDX : %x ESI : %x EDI : %x\n", [esp - 8 + 0x20], [esp - 24 + 0x20], [esp - 28 + 0x20]
  166.     DEBUGF  1, "K : EBP : %x EIP : %x ", [esp - 20 + 0x20], [esp + 4 + 0x20]
  167.  
  168.     mov eax, [esp + 8 + 0x20]
  169.     mov edi, msg_sel_app
  170.     mov ebx, [esp + 16 + 0x20]
  171.     cmp eax, app_code
  172.     je  @f
  173.     mov edi, msg_sel_ker
  174.     mov ebx, [esp - 16 + 0x20]
  175. @@:
  176.     DEBUGF  1, "ESP : %x\nK : Flags : %x CS : %x (%s)\n", ebx, [esp + 12 + 0x20], eax, edi
  177.     ret
  178. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  179.  
  180.  
  181. ; irq1  ->  hid/keyboard.inc
  182. macro irqh [num]
  183. {
  184.   forward
  185.   p_irq#num :
  186.      mov   edi, num
  187.      jmp   irqhandler
  188. }
  189.  
  190. irqh 2,3,4,5,7,8,9,10,11
  191.  
  192.  
  193. p_irq6:
  194.      save_ring3_context
  195.      mov   ax, app_data  ;os_data
  196.      mov   ds, ax
  197.      mov   es, ax
  198.      call  fdc_irq
  199.      call  ready_for_next_irq
  200.      restore_ring3_context
  201.      iret
  202.  
  203.  
  204. p_irq14:
  205.         save_ring3_context
  206.         mov     ax, app_data  ;os_data
  207.         mov     ds, ax
  208.         mov     es, ax
  209.         mov     byte [BOOT_VAR + 0x48E], 0xFF
  210.         call    [irq14_func]
  211.         call    ready_for_next_irq_1
  212.         restore_ring3_context
  213.         iret
  214. p_irq15:
  215.         save_ring3_context
  216.         mov     ax, app_data  ;os_data
  217.         mov     ds, ax
  218.         mov     es, ax
  219.         mov     byte [BOOT_VAR + 0x48E], 0xFF
  220.         call    [irq15_func]
  221.         call    ready_for_next_irq_1
  222.         restore_ring3_context
  223.         iret
  224.  
  225. ready_for_next_irq:
  226.      mov    [check_idle_semaphore],5
  227.      mov   al, 0x20
  228.      out   0x20, al
  229.      ret
  230.  
  231. ready_for_next_irq_1:
  232.      mov    [check_idle_semaphore],5
  233.      mov   al, 0x20
  234.      out    0xa0,al
  235.      out   0x20, al
  236.      ret
  237.  
  238. irqD:
  239.      save_ring3_context
  240.      mov   ax, app_data  ;os_data
  241.      mov   ds, ax
  242.      mov   es, ax
  243.  
  244.      mov   dx,0xf0
  245.      mov   al,0
  246.      out   dx,al
  247.  
  248.      mov   dx,0xa0
  249.      mov   al,0x20
  250.      out   dx,al
  251.      mov   dx,0x20
  252.      out   dx,al
  253.  
  254.      restore_ring3_context
  255.  
  256.      iret
  257.  
  258.  
  259. irqhandler:
  260.         cmp     [v86_irqhooks+edi*8], 0
  261.         jnz     v86_irq2
  262.  
  263.  
  264.      mov    esi,edi          ; 1
  265.      shl    esi,6            ; 1
  266.      add    esi,irq00read    ; 1
  267.      shl    edi,12           ; 1
  268.      add    edi,IRQ_SAVE
  269.      mov    ecx,16
  270.  
  271.    irqnewread:
  272.      dec    ecx
  273.      js     irqover
  274.  
  275.      movzx  edx, word [esi]        ; 2+
  276.  
  277.      test   edx, edx               ; 1
  278.      jz     irqover
  279.  
  280.  
  281.      mov    ebx, [edi]             ; address of begin of buffer in edi      ; + 0x0 dword - data size
  282.      mov    eax, 4000                                                       ; + 0x4 dword - data begin offset
  283.      cmp    ebx, eax
  284.      je     irqfull
  285.      add    ebx, [edi + 0x4]       ; add data size to data begin offset
  286.      cmp    ebx, eax               ; if end of buffer, begin cycle again
  287.      jb     @f
  288.  
  289.      xor    ebx, ebx
  290.  
  291.   @@:
  292.      add    ebx, edi
  293.      movzx  eax, byte[esi + 3]     ; get type of data being received 1 - byte, 2 - word
  294.      dec    eax
  295.      jz     irqbyte
  296.      dec    eax
  297.      jnz    noirqword
  298.  
  299.      in     ax,dx
  300.      cmp    ebx, 3999              ; check for address odd in the end of buffer
  301.      jne    .odd
  302.      mov    [ebx + 0x10], ax
  303.      jmp    .add_size
  304.   .odd:
  305.      mov    [ebx + 0x10], al       ; I could make mistake here :)
  306.      mov    [edi + 0x10], ah
  307.   .add_size:
  308.      add    dword [edi], 2
  309.      jmp    nextport
  310.  
  311.  
  312.   irqbyte:
  313.      in     al,dx
  314.      mov    [ebx + 0x10],al
  315.      inc    dword [edi]
  316.   nextport:
  317.      add    esi,4
  318.      jmp    irqnewread
  319.  
  320.  
  321.    noirqword:
  322.    irqfull:
  323.    irqover:
  324.  
  325.      ret
  326.  
  327.  
  328.  
  329. set_application_table_status:
  330.         push eax
  331.  
  332.         mov  eax,[CURRENT_TASK]
  333.         shl  eax, 5
  334.         add  eax,CURRENT_TASK+TASKDATA.pid
  335.         mov  eax,[eax]
  336.  
  337.         mov  [application_table_status],eax
  338.  
  339.         pop  eax
  340.  
  341.         ret
  342.  
  343.  
  344. clear_application_table_status:
  345.         push eax
  346.  
  347.         mov  eax,[CURRENT_TASK]
  348.         shl  eax, 5
  349.         add  eax,CURRENT_TASK+TASKDATA.pid
  350.         mov  eax,[eax]
  351.  
  352.         cmp  eax,[application_table_status]
  353.         jne  apptsl1
  354.         mov  [application_table_status],0
  355.       apptsl1:
  356.  
  357.         pop  eax
  358.  
  359.         ret
  360.  
  361. sys_resize_app_memory:
  362.         ; eax = 1 - resize
  363.         ;     ebx = new amount of memory
  364.  
  365.         cmp    eax,1
  366.         jne    .no_application_mem_resize
  367.  
  368.         stdcall new_mem_resize, ebx
  369.         mov [esp+36], eax
  370.         ret
  371.  
  372. .no_application_mem_resize:
  373.         ret
  374.  
  375. sys_threads:
  376.  
  377. ; eax=1 create thread
  378. ;
  379. ;   ebx=thread start
  380. ;   ecx=thread stack value
  381. ;
  382. ; on return : eax = pid
  383. jmp new_sys_threads
  384.  
  385. iglobal
  386.   process_terminating   db 'K : Process - terminating',13,10,0
  387.   process_terminated    db 'K : Process - done',13,10,0
  388.   msg_obj_destroy       db 'K : destroy app object',13,10,0
  389. endg
  390.  
  391. ; param
  392. ;  esi= slot
  393.  
  394. terminate: ; terminate application
  395.  
  396.            .slot equ esp   ;locals
  397.  
  398.            push   esi      ;save .slot
  399.  
  400.            shl esi, 8
  401.            cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
  402.            jne @F
  403.            pop    esi
  404.            shl    esi, 5
  405.            mov    [CURRENT_TASK+esi+TASKDATA.state], 9
  406.            ret
  407. @@:
  408.            ;mov    esi,process_terminating
  409.            ;call   sys_msg_board_str
  410.            DEBUGF 1,"%s",process_terminating
  411. @@:
  412.            cli
  413.            cmp   [application_table_status],0
  414.            je    term9
  415.            sti
  416.            call  change_task
  417.            jmp   @b
  418. term9:
  419.            call  set_application_table_status
  420.  
  421. ; if the process is in V86 mode...
  422.         mov     eax, [.slot]
  423.         shl     eax, 8
  424.         mov     esi, [eax+SLOT_BASE+APPDATA.pl0_stack]
  425.         add     esi, RING0_STACK_SIZE
  426.         cmp     [eax+SLOT_BASE+APPDATA.saved_esp0], esi
  427.         jz      .nov86
  428. ; ...it has page directory for V86 mode
  429.         mov     esi, [eax+SLOT_BASE+APPDATA.saved_esp0]
  430.         mov     ecx, [esi+4]
  431.         mov     [eax+SLOT_BASE+APPDATA.dir_table], ecx
  432. ; ...and I/O permission map for V86 mode
  433.         mov     ecx, [esi+12]
  434.         mov     [eax+SLOT_BASE+APPDATA.io_map], ecx
  435.         mov     ecx, [esi+8]
  436.         mov     [eax+SLOT_BASE+APPDATA.io_map+4], ecx
  437. .nov86:
  438.  
  439.            mov esi, [.slot]
  440.            shl esi,8
  441.            add esi, SLOT_BASE+APP_OBJ_OFFSET
  442. @@:
  443.            mov eax, [esi+APPOBJ.fd]
  444.            test eax, eax
  445.            jz @F
  446.  
  447.            cmp eax, esi
  448.            je @F
  449.  
  450.            push esi
  451.            call [eax+APPOBJ.destroy]
  452.            DEBUGF 1,"%s",msg_obj_destroy
  453.            pop esi
  454.            jmp @B
  455. @@:
  456.            mov eax, [.slot]
  457.            shl eax, 8
  458.            mov eax,[SLOT_BASE+eax+APPDATA.dir_table]
  459.            stdcall destroy_app_space, eax
  460.  
  461.            mov esi, [.slot]
  462.            cmp [fpu_owner],esi   ; if user fpu last -> fpu user = 1
  463.            jne @F
  464.  
  465.            mov [fpu_owner],1
  466.            mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
  467.            clts
  468.            bt [cpu_caps], CAPS_SSE
  469.            jnc .no_SSE
  470.            fxrstor [eax]
  471.            jmp @F
  472. .no_SSE:
  473.            fnclex
  474.            frstor [eax]
  475. @@:
  476.  
  477.     mov   [KEY_COUNT],byte 0           ; empty keyboard buffer
  478.     mov   [BTN_COUNT],byte 0           ; empty button buffer
  479.  
  480.  
  481. ; remove defined hotkeys
  482.         mov     eax, hotkey_list
  483. .loop:
  484.         cmp     [eax+8], esi
  485.         jnz     .cont
  486.         mov     ecx, [eax]
  487.         jecxz   @f
  488.         push    dword [eax+12]
  489.         pop     dword [ecx+12]
  490. @@:
  491.         mov     ecx, [eax+12]
  492.         push    dword [eax]
  493.         pop     dword [ecx]
  494.         xor     ecx, ecx
  495.         mov     [eax], ecx
  496.         mov     [eax+4], ecx
  497.         mov     [eax+8], ecx
  498.         mov     [eax+12], ecx
  499. .cont:
  500.         add     eax, 16
  501.         cmp     eax, hotkey_list+256*16
  502.         jb      .loop
  503. ; remove hotkeys in buffer
  504.         mov     eax, hotkey_buffer
  505. .loop2:
  506.         cmp     [eax], esi
  507.         jnz     .cont2
  508.         and     dword [eax+4], 0
  509.         and     dword [eax], 0
  510. .cont2:
  511.         add     eax, 8
  512.         cmp     eax, hotkey_buffer+120*8
  513.         jb      .loop2
  514.  
  515.     mov   ecx,esi                 ; remove buttons
  516.   bnewba2:
  517.     mov   edi,[BTN_ADDR]
  518.     mov   eax,edi
  519.     cld
  520.     movzx ebx,word [edi]
  521.     inc   bx
  522.   bnewba:
  523.     dec   bx
  524.     jz    bnmba
  525.     add   eax,0x10
  526.     cmp   cx,[eax]
  527.     jnz   bnewba
  528.     pusha
  529.     mov   ecx,ebx
  530.     inc   ecx
  531.     shl   ecx,4
  532.     mov   ebx,eax
  533.     add   eax,0x10
  534.     call  memmove
  535.     dec   dword [edi]
  536.     popa
  537.     jmp   bnewba2
  538.   bnmba:
  539.  
  540.     pusha     ; save window coordinates for window restoring
  541.     cld
  542.     shl   esi,5
  543.     add   esi,window_data
  544.     mov   eax,[esi+WDATA.box.left]
  545.     mov   [dlx],eax
  546.     add   eax,[esi+WDATA.box.width]
  547.     mov   [dlxe],eax
  548.     mov   eax,[esi+WDATA.box.top]
  549.     mov   [dly],eax
  550.     add   eax,[esi+WDATA.box.height]
  551.     mov   [dlye],eax
  552.  
  553.     xor   eax, eax
  554.     mov   [esi+WDATA.box.left],eax
  555.     mov   [esi+WDATA.box.width],eax
  556.     mov   [esi+WDATA.box.top],eax
  557.     mov   [esi+WDATA.box.height],eax
  558.     mov   [esi+WDATA.cl_workarea],eax
  559.     mov   [esi+WDATA.cl_titlebar],eax
  560.     mov   [esi+WDATA.cl_frames],eax
  561.     mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
  562.     lea   edi, [esi-window_data+draw_data]
  563.     mov   ecx,32/4
  564.     rep   stosd
  565.     popa
  566.  
  567. ; debuggee test
  568.     pushad
  569.     mov  edi, esi
  570.     shl  edi, 5
  571.     mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
  572.     test eax, eax
  573.     jz   .nodebug
  574.     push 8
  575.     pop  ecx
  576.     push dword [CURRENT_TASK+edi+TASKDATA.pid]   ; PID
  577.     push 2
  578.     call debugger_notify
  579.     pop  ecx
  580.     pop  ecx
  581. .nodebug:
  582.     popad
  583.  
  584.            mov ebx, [.slot]
  585.            shl ebx, 8
  586.            push ebx
  587.            mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
  588.  
  589.            stdcall kernel_free, ebx
  590.  
  591.            pop ebx
  592.            mov ebx,[SLOT_BASE+ebx+APPDATA.cur_dir]
  593.            stdcall kernel_free, ebx
  594.  
  595.            mov edi, [.slot]
  596.            shl edi,8
  597.            add edi,SLOT_BASE
  598.  
  599.            mov eax, [edi+APPDATA.io_map]
  600.            cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
  601.            je @F
  602.            call free_page
  603. @@:
  604.            mov eax, [edi+APPDATA.io_map+4]
  605.            cmp eax, (tss._io_map_1-OS_BASE+PG_MAP)
  606.            je @F
  607.            call free_page
  608. @@:
  609.            mov eax, 0x20202020
  610.            stosd
  611.            stosd
  612.            stosd
  613.            mov ecx,244/4
  614.            xor eax, eax
  615.            rep stosd
  616.  
  617.   ; activate window
  618.         movzx  eax, word [WIN_STACK + esi*2]
  619.         cmp    eax, [TASK_COUNT]
  620.         jne    .dont_activate
  621.         pushad
  622.  .check_next_window:
  623.         dec    eax
  624.         cmp    eax, 1
  625.         jbe    .nothing_to_activate
  626.         lea    esi, [WIN_POS+eax*2]
  627.         movzx  edi, word [esi]               ; edi = process
  628.         shl    edi, 5
  629.         cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
  630.         je     .check_next_window
  631.         add    edi, window_data
  632. ; \begin{diamond}[19.09.2006]
  633. ; skip minimized windows
  634.         test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
  635.         jnz    .check_next_window
  636. ; \end{diamond}
  637.         call   waredraw
  638.  .nothing_to_activate:
  639.         popad
  640.  .dont_activate:
  641.  
  642.         push    esi     ; remove hd1 & cd & flp reservation
  643.         shl     esi, 5
  644.         mov     esi, [esi+CURRENT_TASK+TASKDATA.pid]
  645.         cmp     [hd1_status], esi
  646.         jnz     @f
  647.         call    free_hd_channel
  648.         mov     [hd1_status], 0
  649. @@:
  650.         cmp     [cd_status], esi
  651.         jnz     @f
  652.         call    free_cd_channel
  653.         mov     [cd_status], 0
  654. @@:
  655.         cmp     [flp_status], esi
  656.         jnz     @f
  657.         mov     [flp_status], 0
  658. @@:
  659.         pop     esi
  660.         cmp     [bgrlockpid], esi
  661.         jnz     @f
  662.         and     [bgrlockpid], 0
  663.         mov     [bgrlock], 0
  664. @@:
  665.  
  666.     pusha ; remove all irq reservations
  667.     mov   eax,esi
  668.     shl   eax, 5
  669.     mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
  670.     mov   edi,irq_owner
  671.     xor   ebx, ebx
  672.     xor   edx, edx
  673.   newirqfree:
  674.     cmp   [edi + 4 * ebx], eax
  675.     jne   nofreeirq
  676.     mov   [edi + 4 * ebx], edx                          ; remove irq reservation
  677.     mov   [irq_tab + 4 * ebx], edx                      ; remove irq handler
  678.     mov   [irq_rights + 4 * ebx], edx                   ; set access rights to full access
  679.   nofreeirq:
  680.     inc   ebx
  681.     cmp   ebx, 16
  682.     jb    newirqfree
  683.     popa
  684.  
  685.     pusha                     ; remove all port reservations
  686.     mov   edx,esi
  687.     shl   edx, 5
  688.     add   edx,CURRENT_TASK
  689.     mov   edx,[edx+TASKDATA.pid]
  690.  
  691.   rmpr0:
  692.  
  693.     mov   esi,[RESERVED_PORTS]
  694.  
  695.     cmp   esi,0
  696.     je    rmpr9
  697.  
  698.   rmpr3:
  699.  
  700.     mov   edi,esi
  701.     shl   edi,4
  702.     add   edi,RESERVED_PORTS
  703.  
  704.     cmp   edx,[edi]
  705.     je    rmpr4
  706.  
  707.     dec   esi
  708.     jnz   rmpr3
  709.  
  710.     jmp   rmpr9
  711.  
  712.   rmpr4:
  713.  
  714.     mov   ecx,256
  715.     sub   ecx,esi
  716.     shl   ecx,4
  717.  
  718.     mov   esi,edi
  719.     add   esi,16
  720.     cld
  721.     rep   movsb
  722.  
  723.     dec   dword [RESERVED_PORTS]
  724.  
  725.     jmp   rmpr0
  726.  
  727.   rmpr9:
  728.  
  729.     popa
  730.     mov  edi,esi         ; do not run this process slot
  731.     shl  edi, 5
  732.     mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
  733. ; debugger test - terminate all debuggees
  734.     mov  eax, 2
  735.     mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
  736. .xd0:
  737.     cmp  eax, [TASK_COUNT]
  738.     ja   .xd1
  739.     cmp  dword [ecx], esi
  740.     jnz  @f
  741.     and  dword [ecx], 0
  742.     pushad
  743.     xchg eax, ecx
  744.     mov  ebx, 2
  745.     call sys_system
  746.     popad
  747. @@:
  748.     inc  eax
  749.     add  ecx, 0x100
  750.     jmp  .xd0
  751. .xd1:
  752. ;    call  systest
  753.     sti  ; .. and life goes on
  754.  
  755.     mov   eax, [dlx]
  756.     mov   ebx, [dly]
  757.     mov   ecx, [dlxe]
  758.     mov   edx, [dlye]
  759.     call  calculatescreen
  760.     xor   eax, eax
  761.     xor   esi, esi
  762.     call  redrawscreen
  763.  
  764.     mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
  765.     mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
  766.  
  767.     mov   [application_table_status],0
  768.     ;mov   esi,process_terminated
  769.     ;call  sys_msg_board_str
  770.     DEBUGF 1,"%s",process_terminated
  771.     add esp, 4
  772.     ret
  773. restore .slot
  774.  
  775. iglobal
  776.   boot_sched_1    db   'Building gdt tss pointer',0
  777.   boot_sched_2    db   'Building IDT table',0
  778. endg
  779.  
  780.  
  781. build_scheduler:
  782.  
  783.         mov    esi,boot_sched_1
  784.         call   boot_log
  785.   ;      call   build_process_gdt_tss_pointer
  786.  
  787.   ;      mov    esi,boot_sched_2
  788.   ;      call   boot_log
  789.  
  790.         ret
  791.