Subversion Repositories Kolibri OS

Rev

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

  1. $Revision: 479 $
  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,irq_serv.irq_12,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_irq14:
  278.         save_ring3_context
  279.         mov     ax, app_data  ;os_data
  280.         mov     ds, ax
  281.         mov     es, ax
  282.         call    [irq14_func]
  283.         call    ready_for_next_irq_1
  284.         restore_ring3_context
  285.         iret
  286. p_irq15:
  287.         save_ring3_context
  288.         mov     ax, app_data  ;os_data
  289.         mov     ds, ax
  290.         mov     es, ax
  291.         call    [irq15_func]
  292.         call    ready_for_next_irq_1
  293.         restore_ring3_context
  294.         iret
  295.  
  296. ready_for_next_irq:
  297.      mov    [check_idle_semaphore],5
  298.      mov   al, 0x20
  299.      out   0x20, al
  300.      ret
  301.  
  302. ready_for_next_irq_1:
  303.      mov    [check_idle_semaphore],5
  304.      mov   al, 0x20
  305.      out    0xa0,al
  306.      out   0x20, al
  307.      ret
  308.  
  309. irqD:
  310.      save_ring3_context
  311.      mov   ax, app_data  ;os_data
  312.      mov   ds, ax
  313.      mov   es, ax
  314.  
  315.      mov   dx,0xf0
  316.      mov   al,0
  317.      out   dx,al
  318.  
  319.      mov   dx,0xa0
  320.      mov   al,0x20
  321.      out   dx,al
  322.      mov   dx,0x20
  323.      out   dx,al
  324.  
  325.      restore_ring3_context
  326.  
  327.      iret
  328.  
  329.  
  330. irqhandler:
  331.  
  332.      push   edi
  333.  
  334.      mov    esi,edi          ; 1
  335.      shl    esi,6            ; 1
  336.      add    esi,irq00read    ; 1
  337.      shl    edi,12           ; 1
  338.      add    edi,IRQ_SAVE
  339.      mov    ecx,16
  340.  
  341.      mov    [check_idle_semaphore],5
  342.  
  343.    irqnewread:
  344.      dec    ecx
  345.      js     irqover
  346.  
  347.      mov    dx,[esi]         ; 2+
  348.  
  349.      cmp    dx,0             ; 1
  350.      jz     irqover
  351.      cmp    [esi+3],byte 1   ; 2     ; byte read
  352.      jne    noirqbyte        ; 4-11
  353.  
  354.      in     al,dx
  355.  
  356.      mov    edx,[edi]
  357.      cmp    edx,4000
  358.      je     irqfull
  359.      mov    ebx,edi
  360.      add    ebx,0x10
  361.      add    ebx,edx
  362.      mov    [ebx],al
  363.      inc    edx
  364.      mov    [edi],edx
  365.  
  366.      add    esi,4
  367.      jmp    irqnewread
  368.  
  369.    noirqbyte:
  370.  
  371.  
  372.      cmp    [esi+3],byte 2     ; word read
  373.      jne    noirqword
  374.  
  375.      in     ax,dx
  376.  
  377.      mov    edx,[edi]
  378.      cmp    edx,4000
  379.      je     irqfull
  380.      mov    ebx,edi
  381.      add    ebx,0x10
  382.      add    ebx,edx
  383.      mov    [ebx],ax
  384.      add    edx,2
  385.      mov    [edi],edx
  386.      add    esi,4
  387.      jmp    irqnewread
  388.  
  389.    noirqword:
  390.    irqfull:
  391.    irqover:
  392.  
  393.      mov    al,0x20            ; ready for next irq
  394.      out    0x20,al
  395.  
  396.      pop    ebx
  397.      cmp    ebx,7
  398.      jbe    noa0
  399.      out    0xa0,al
  400.    noa0:
  401.  
  402.      ret
  403.  
  404.  
  405.  
  406. set_application_table_status:
  407.         push eax
  408.  
  409.         mov  eax,[CURRENT_TASK]
  410.         shl  eax, 5
  411.         add  eax,CURRENT_TASK+TASKDATA.pid
  412.         mov  eax,[eax]
  413.  
  414.         mov  [application_table_status],eax
  415.  
  416.         pop  eax
  417.  
  418.         ret
  419.  
  420.  
  421. clear_application_table_status:
  422.         push eax
  423.  
  424.         mov  eax,[CURRENT_TASK]
  425.         shl  eax, 5
  426.         add  eax,CURRENT_TASK+TASKDATA.pid
  427.         mov  eax,[eax]
  428.  
  429.         cmp  eax,[application_table_status]
  430.         jne  apptsl1
  431.         mov  [application_table_status],0
  432.       apptsl1:
  433.  
  434.         pop  eax
  435.  
  436.         ret
  437.  
  438. sys_resize_app_memory:
  439.         ; eax = 1 - resize
  440.         ;     ebx = new amount of memory
  441.  
  442.         cmp    eax,1
  443.         jne    .no_application_mem_resize
  444.  
  445.         stdcall new_mem_resize, ebx
  446.         mov [esp+36], eax
  447.         ret
  448.  
  449. .no_application_mem_resize:
  450.         ret
  451.  
  452. sys_threads:
  453.  
  454. ; eax=1 create thread
  455. ;
  456. ;   ebx=thread start
  457. ;   ecx=thread stack value
  458. ;
  459. ; on return : eax = pid
  460. jmp new_sys_threads
  461.  
  462. iglobal
  463.   process_terminating   db 'K : Process - terminating',13,10,0
  464.   process_terminated    db 'K : Process - done',13,10,0
  465.   msg_obj_destroy       db 'K : destroy app object',13,10,0
  466. endg
  467.  
  468. ; param
  469. ;  esi= slot
  470.  
  471. terminate: ; terminate application
  472.  
  473.            .slot equ esp   ;locals
  474.  
  475.            push   esi      ;save .slot
  476.  
  477.            shl esi, 8
  478.            cmp [SLOT_BASE+esi+APPDATA.dir_table], 0
  479.            jne @F
  480.            add esp, 4
  481.            ret
  482. @@:
  483.            mov    esi,process_terminating
  484.            call   sys_msg_board_str
  485. @@:
  486.            cli
  487.            cmp   [application_table_status],0
  488.            je    term9
  489.            sti
  490.            call  change_task
  491.            jmp   @b
  492. term9:
  493.            call  set_application_table_status
  494.  
  495.            mov esi, [.slot]
  496.            shl esi,8
  497.            add esi, SLOT_BASE+APP_OBJ_OFFSET
  498. @@:
  499.            mov eax, [esi+APPOBJ.fd]
  500.            test eax, eax
  501.            jz @F
  502.  
  503.            cmp eax, esi
  504.            je @F
  505.  
  506.            push esi
  507.            call [eax+APPOBJ.destroy]
  508.            mov  esi, msg_obj_destroy
  509.            call sys_msg_board_str
  510.            pop esi
  511.            jmp @B
  512. @@:
  513.            mov eax, [.slot]
  514.            shl eax, 8
  515.            mov eax,[SLOT_BASE+eax+APPDATA.dir_table]
  516.            stdcall destroy_app_space, eax
  517.  
  518.            mov esi, [.slot]
  519.            cmp [fpu_owner],esi   ; if user fpu last -> fpu user = 1
  520.            jne @F
  521.  
  522.            mov [fpu_owner],1
  523.            mov eax, [256+SLOT_BASE+APPDATA.fpu_state]
  524.            clts
  525.            bt [cpu_caps], CAPS_SSE
  526.            jnc .no_SSE
  527.            fxrstor [eax]
  528.            jmp @F
  529. .no_SSE:
  530.            fnclex
  531.            frstor [eax]
  532. @@:
  533.  
  534.     mov   [KEY_COUNT],byte 0           ; empty keyboard buffer
  535.     mov   [BTN_COUNT],byte 0           ; empty button buffer
  536.  
  537.  
  538. ; remove defined hotkeys
  539.         mov     eax, hotkey_list
  540. .loop:
  541.         cmp     [eax+8], esi
  542.         jnz     .cont
  543.         mov     ecx, [eax]
  544.         jecxz   @f
  545.         push    dword [eax+12]
  546.         pop     dword [ecx+12]
  547. @@:
  548.         mov     ecx, [eax+12]
  549.         push    dword [eax]
  550.         pop     dword [ecx]
  551.         xor     ecx, ecx
  552.         mov     [eax], ecx
  553.         mov     [eax+4], ecx
  554.         mov     [eax+8], ecx
  555.         mov     [eax+12], ecx
  556. .cont:
  557.         add     eax, 16
  558.         cmp     eax, hotkey_list+256*16
  559.         jb      .loop
  560. ; remove hotkeys in buffer
  561.         mov     eax, hotkey_buffer
  562. .loop2:
  563.         cmp     [eax], esi
  564.         jnz     .cont2
  565.         and     dword [eax+4], 0
  566.         and     dword [eax], 0
  567. .cont2:
  568.         add     eax, 8
  569.         cmp     eax, hotkey_buffer+120*8
  570.         jb      .loop2
  571.  
  572.     mov   ecx,esi                 ; remove buttons
  573.   bnewba2:
  574.     mov   edi,[BTN_ADDR]
  575.     mov   eax,edi
  576.     cld
  577.     movzx ebx,word [edi]
  578.     inc   bx
  579.   bnewba:
  580.     dec   bx
  581.     jz    bnmba
  582.     add   eax,0x10
  583.     cmp   cx,[eax]
  584.     jnz   bnewba
  585.     pusha
  586.     mov   ecx,ebx
  587.     inc   ecx
  588.     shl   ecx,4
  589.     mov   ebx,eax
  590.     add   eax,0x10
  591.     call  memmove
  592.     dec   dword [edi]
  593.     popa
  594.     jmp   bnewba2
  595.   bnmba:
  596.  
  597.     pusha     ; save window coordinates for window restoring
  598.     cld
  599.     shl   esi,5
  600.     add   esi,window_data
  601.     mov   eax,[esi+WDATA.box.left]
  602.     mov   [dlx],eax
  603.     add   eax,[esi+WDATA.box.width]
  604.     mov   [dlxe],eax
  605.     mov   eax,[esi+WDATA.box.top]
  606.     mov   [dly],eax
  607.     add   eax,[esi+WDATA.box.height]
  608.     mov   [dlye],eax
  609.  
  610.     xor   eax, eax
  611.     mov   [esi+WDATA.box.left],eax
  612.     mov   [esi+WDATA.box.width],eax
  613.     mov   [esi+WDATA.box.top],eax
  614.     mov   [esi+WDATA.box.height],eax
  615.     mov   [esi+WDATA.cl_workarea],eax
  616.     mov   [esi+WDATA.cl_titlebar],eax
  617.     mov   [esi+WDATA.cl_frames],eax
  618.     mov   dword [esi+WDATA.reserved],eax ; clear all flags: wstate, redraw, wdrawn
  619.     lea   edi, [esi-window_data+draw_data]
  620.     mov   ecx,32/4
  621.     rep   stosd
  622.     popa
  623.  
  624. ; debuggee test
  625.     pushad
  626.     mov  edi, esi
  627.     shl  edi, 5
  628.     mov  eax, [SLOT_BASE+edi*8+APPDATA.debugger_slot]
  629.     test eax, eax
  630.     jz   .nodebug
  631.     push 8
  632.     pop  ecx
  633.     push dword [CURRENT_TASK+edi+TASKDATA.pid]   ; PID
  634.     push 2
  635.     call debugger_notify
  636.     pop  ecx
  637.     pop  ecx
  638. .nodebug:
  639.     popad
  640.  
  641.            mov ebx, [.slot]
  642.            shl ebx, 8
  643.            mov ebx,[SLOT_BASE+ebx+APPDATA.pl0_stack]
  644.  
  645.            stdcall kernel_free, ebx
  646.  
  647.            mov edi, [.slot]
  648.            shl edi,8
  649.            add edi,SLOT_BASE
  650.  
  651.            mov eax, [edi+APPDATA.io_map]
  652.            cmp eax, (tss._io_map_0-OS_BASE+PG_MAP)
  653.            je @F
  654.            call free_page
  655. @@:
  656.            mov eax, [edi+APPDATA.io_map+4]
  657.            cmp eax, (tss._io_map_1-OS_BASE+PG_MAP)
  658.            je @F
  659.            call free_page
  660. @@:
  661.            mov eax, 0x20202020
  662.            stosd
  663.            stosd
  664.            stosd
  665.            mov ecx,244/4
  666.            xor eax, eax
  667.            rep stosd
  668.  
  669.   ; activate window
  670.         movzx  eax, word [WIN_STACK + esi*2]
  671.         cmp    eax, [TASK_COUNT]
  672.         jne    .dont_activate
  673.         pushad
  674.  .check_next_window:
  675.         dec    eax
  676.         cmp    eax, 1
  677.         jbe    .nothing_to_activate
  678.         lea    esi, [WIN_POS+eax*2]
  679.         movzx  edi, word [esi]               ; edi = process
  680.         shl    edi, 5
  681.         cmp    [CURRENT_TASK + edi + TASKDATA.state], byte 9  ; skip dead slots
  682.         je     .check_next_window
  683.         add    edi, window_data
  684. ; \begin{diamond}[19.09.2006]
  685. ; skip minimized windows
  686.         test   [edi + WDATA.fl_wstate], WSTATE_MINIMIZED
  687.         jnz    .check_next_window
  688. ; \end{diamond}
  689.         call   waredraw
  690.  .nothing_to_activate:
  691.         popad
  692.  .dont_activate:
  693.  
  694.         push    esi     ; remove hd1 & cd & flp reservation
  695.         shl     esi, 5
  696.         mov     esi, [esi+CURRENT_TASK+TASKDATA.pid]
  697.         cmp     [hd1_status], esi
  698.         jnz     @f
  699.         call    free_hd_channel
  700.         mov     [hd1_status], 0
  701. @@:
  702.         cmp     [cd_status], esi
  703.         jnz     @f
  704.         call    free_cd_channel
  705.         mov     [cd_status], 0
  706. @@:
  707.         cmp     [flp_status], esi
  708.         jnz     @f
  709.         mov     [flp_status], 0
  710. @@:
  711.         pop     esi
  712.  
  713.     pusha ; remove all irq reservations
  714.     mov   eax,esi
  715.     shl   eax, 5
  716.     mov   eax,[eax+CURRENT_TASK+TASKDATA.pid]
  717.     mov   edi,irq_owner
  718.     mov   ecx,16
  719.   newirqfree:
  720.     scasd
  721.     jne   nofreeirq
  722.     mov   [edi-4],dword 0
  723.   nofreeirq:
  724.     loop   newirqfree
  725.     popa
  726.  
  727.     pusha                     ; remove all port reservations
  728.     mov   edx,esi
  729.     shl   edx, 5
  730.     add   edx,CURRENT_TASK
  731.     mov   edx,[edx+TASKDATA.pid]
  732.  
  733.   rmpr0:
  734.  
  735.     mov   esi,[RESERVED_PORTS]
  736.  
  737.     cmp   esi,0
  738.     je    rmpr9
  739.  
  740.   rmpr3:
  741.  
  742.     mov   edi,esi
  743.     shl   edi,4
  744.     add   edi,RESERVED_PORTS
  745.  
  746.     cmp   edx,[edi]
  747.     je    rmpr4
  748.  
  749.     dec   esi
  750.     jnz   rmpr3
  751.  
  752.     jmp   rmpr9
  753.  
  754.   rmpr4:
  755.  
  756.     mov   ecx,256
  757.     sub   ecx,esi
  758.     shl   ecx,4
  759.  
  760.     mov   esi,edi
  761.     add   esi,16
  762.     cld
  763.     rep   movsb
  764.  
  765.     dec   dword [RESERVED_PORTS]
  766.  
  767.     jmp   rmpr0
  768.  
  769.   rmpr9:
  770.  
  771.     popa
  772.     mov  edi,esi         ; do not run this process slot
  773.     shl  edi, 5
  774.     mov  [edi+CURRENT_TASK + TASKDATA.state],byte 9
  775. ; debugger test - terminate all debuggees
  776.     mov  eax, 2
  777.     mov  ecx, SLOT_BASE+2*0x100+APPDATA.debugger_slot
  778. .xd0:
  779.     cmp  eax, [TASK_COUNT]
  780.     ja   .xd1
  781.     cmp  dword [ecx], esi
  782.     jnz  @f
  783.     and  dword [ecx], 0
  784.     pushad
  785.     xchg eax, ebx
  786.     mov  eax, 2
  787.     call sys_system
  788.     popad
  789. @@:
  790.     inc  eax
  791.     add  ecx, 0x100
  792.     jmp  .xd0
  793. .xd1:
  794. ;    call  systest
  795.     sti  ; .. and life goes on
  796.  
  797.     mov   eax, [dlx]
  798.     mov   ebx, [dly]
  799.     mov   ecx, [dlxe]
  800.     mov   edx, [dlye]
  801.     call  calculatescreen
  802.     xor   eax, eax
  803.     xor   esi, esi
  804.     call  redrawscreen
  805.  
  806.     mov   [MOUSE_BACKGROUND],byte 0  ; no mouse background
  807.     mov   [DONT_DRAW_MOUSE],byte 0  ; draw mouse
  808.  
  809.     mov   [application_table_status],0
  810.     mov   esi,process_terminated
  811.     call  sys_msg_board_str
  812.     add esp, 4
  813.     ret
  814. restore .slot
  815.  
  816. iglobal
  817.   boot_sched_1    db   'Building gdt tss pointer',0
  818.   boot_sched_2    db   'Building IDT table',0
  819. endg
  820.  
  821.  
  822. build_scheduler:
  823.  
  824.         mov    esi,boot_sched_1
  825.         call   boot_log
  826.   ;      call   build_process_gdt_tss_pointer
  827.  
  828.   ;      mov    esi,boot_sched_2
  829.   ;      call   boot_log
  830.  
  831.         ret
  832.  
  833.