Subversion Repositories Kolibri OS

Rev

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

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