Subversion Repositories Kolibri OS

Rev

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

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