Subversion Repositories Kolibri OS

Rev

Rev 430 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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