Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 928 $
  9.  
  10. EFL_IF      equ 0x0200
  11. EFL_IOPL1   equ 0x1000
  12. EFL_IOPL2   equ 0x2000
  13. EFL_IOPL3   equ 0x3000
  14.  
  15.  
  16. struc APP_HEADER_00
  17. { .banner      dq ?
  18.   .version     dd ?    ;+8
  19.   .start       dd ?    ;+12
  20.   .i_end       dd ?    ;+16
  21.   .mem_size    dd ?    ;+20
  22.   .i_param     dd ?    ;+24
  23. }
  24.  
  25. struc APP_HEADER_01
  26. { .banner      dq ?
  27.   .version     dd ?    ;+8
  28.   .start       dd ?    ;+12
  29.   .i_end       dd ?    ;+16
  30.   .mem_size    dd ?    ;+20
  31.   .stack_top   dd ?    ;+24
  32.   .i_param     dd ?    ;+28
  33.   .i_icon      dd ?    ;+32
  34. }
  35.  
  36.  
  37. struc APP_PARAMS
  38. { .app_cmdline   ;0x00
  39.   .app_path      ;0x04
  40.   .app_eip       ;0x08
  41.   .app_esp       ;0x0C
  42.   .app_mem       ;0x10
  43. }
  44.  
  45. macro _clear_ op
  46. {  mov ecx, op/4
  47.    xor eax, eax
  48.    cld
  49.    rep stosd
  50. }
  51.  
  52. align 4
  53. test_app_header:
  54.            virtual at eax
  55.              APP_HEADER_00 APP_HEADER_00
  56.            end virtual
  57.            virtual at eax
  58.              APP_HEADER_01 APP_HEADER_01
  59.            end virtual
  60.  
  61.            cmp dword [eax], 'MENU'
  62.            jne .fail
  63.            cmp word [eax+4],'ET'
  64.            jne .fail
  65.  
  66.            cmp [eax+6], word '00'
  67.            jne  .check_01_header
  68.  
  69.            mov  ecx,[APP_HEADER_00.start]
  70.        mov  [ebx+0x08], ecx              ;app_eip
  71.            mov  edx,[APP_HEADER_00.mem_size]
  72.        mov  [ebx+0x10], edx              ;app_mem
  73.            shr  edx,1
  74.            sub  edx,0x10
  75.        mov  [ebx+0x0C], edx              ;app_esp
  76.            mov  ecx,[APP_HEADER_00.i_param]
  77.        mov  [ebx], ecx                   ;app_cmdline
  78.        mov  [ebx+4], dword 0             ;app_path
  79.            mov  edx, [APP_HEADER_00.i_end]
  80.            mov  [ebx+0x14], edx
  81.            ret
  82.  
  83.  .check_01_header:
  84.  
  85.            cmp  [eax+6],word '01'
  86.            jne  .fail
  87.  
  88.            mov  ecx,[APP_HEADER_01.start]
  89.            mov  [ebx+0x08], ecx                ;app_eip
  90.            mov  edx,[APP_HEADER_01.mem_size]
  91.  
  92. ; \begin{diamond}[20.08.2006]
  93. ; sanity check (functions 19,58 load app_i_end bytes and that must
  94. ; fit in allocated memory to prevent kernel faults)
  95.            cmp  edx,[APP_HEADER_01.i_end]
  96.            jb   .fail
  97. ; \end{diamond}[20.08.2006]
  98.  
  99.        mov  [ebx+0x10], edx                  ;app_mem
  100.            mov  ecx,[APP_HEADER_01.stack_top]
  101.        mov  [ebx+0x0C], ecx                  ;app_esp
  102.            mov  edx,[APP_HEADER_01.i_param]
  103.        mov  [ebx], edx                       ;app_cmdline
  104.            mov  ecx,[APP_HEADER_01.i_icon]
  105.        mov  [ebx+4], ecx                     ;app_path
  106.            mov  edx, [APP_HEADER_01.i_end]
  107.            mov  [ebx+0x14], edx
  108.            ret
  109. .fail:
  110.            xor eax, eax
  111.            ret
  112.  
  113. align 4
  114. proc mnt_exec stdcall file_base:dword, file_size:dword, \
  115.                       path:dword, cmd_line:dword, flags:dword
  116.  
  117.            locals
  118.              cmdline       rb 256
  119.              filename      rb 1024
  120.  
  121.              save_cr3      dd ?
  122.              slot      dd ?
  123.              slot_base     dd ?
  124.  
  125.                           ;app header data
  126.              hdr_cmdline   dd ? ;0x00
  127.              hdr_path      dd ? ;0x04
  128.              hdr_eip       dd ? ;0x08
  129.              hdr_esp       dd ? ;0x0C
  130.              hdr_mem       dd ? ;0x10
  131.              hdr_i_end     dd ? ;0x14
  132.            endl
  133.  
  134.            push ebx
  135.            push edi
  136.            push esi
  137.  
  138.            mov esi, [path]
  139.            lea edi, [filename]
  140.            lea ecx, [edi+1024]
  141. @@:
  142.            cmp edi, ecx
  143.            jae .bigfilename
  144.            lodsb
  145.            stosb
  146.            test al, al
  147.            jnz @b
  148.  
  149.            lea edi, [cmdline]
  150.            mov dword [edi],0
  151.            mov esi, [cmd_line]
  152.            test esi, esi
  153.            jz .no_cmdline
  154.  
  155.            lea ecx, [edi+255]
  156.            mov [edi+252], dword 0
  157. @@:
  158.            cmp edi, ecx
  159.            jae .no_cmdline
  160.  
  161.            lodsb
  162.            stosb
  163.            test al, al
  164.            jnz @b
  165.  
  166. .no_cmdline:
  167.  
  168.            mov eax, [file_base]
  169.            lea ebx, [hdr_cmdline]
  170.            call test_app_header
  171.            mov ecx, -0x1F
  172.            test eax, eax
  173.            jz .err_hdr
  174.  
  175.            DEBUGF 1,"%s",new_process_loading
  176.  
  177.            lea ebx, [application_table_status]
  178.            call wait_mutex
  179.  
  180.            call set_application_table_status
  181.  
  182.            call get_new_process_place
  183.            test eax, eax
  184.            mov ecx, -0x20      ; too many processes
  185.            jz .err
  186.  
  187.            mov [slot], eax
  188.            shl eax, 8
  189.            add eax, SLOT_BASE
  190.            mov [slot_base], eax
  191.            mov edi, eax
  192.            _clear_ 256     ;clean extended information about process
  193.  
  194. ; write application name
  195.            lea eax, [filename]
  196.            stdcall strrchr,  eax, '/'  ; now eax points to name without path
  197.  
  198.            lea esi, [eax+1]
  199.            test eax, eax
  200.            jnz @F
  201.            lea esi, [filename]
  202. @@:
  203.            mov ecx, 8  ; 8 chars for name
  204.            mov edi, [slot_base]
  205. .copy_process_name_loop:
  206.            lodsb
  207.            cmp al, '.'
  208.            jz .copy_process_name_done
  209.            test al, al
  210.            jz .copy_process_name_done
  211.            stosb
  212.            loop .copy_process_name_loop
  213. .copy_process_name_done:
  214.  
  215.            mov ebx, cr3
  216.            mov [save_cr3], ebx
  217.  
  218.            stdcall create_app_space,[hdr_mem],[file_base],[file_size]
  219.            mov ecx, -30  ; no memory
  220.            test eax, eax
  221.            jz .failed
  222.  
  223.            mov   ebx,[slot_base]
  224.            mov   [ebx+APPDATA.dir_table],eax
  225.            mov   eax,[hdr_mem]
  226.            mov   [ebx+APPDATA.mem_size],eax
  227.  
  228.            mov ecx, [hdr_mem]
  229.            mov edi, [file_size]
  230.          ;  add edi, 4095
  231.          ;  and edi, not 4095
  232.            sub ecx, edi
  233.            jna @F
  234.  
  235.            xor eax, eax
  236.            cld
  237.            rep stosb
  238. @@:
  239.            mov ecx, [file_base]
  240.            call @mem_free@4
  241.  
  242.            lea eax, [hdr_cmdline]
  243.            lea ebx, [cmdline]
  244.            lea ecx, [filename]
  245.            stdcall set_app_params ,[slot],eax,ebx,ecx,[flags]
  246.  
  247.            mov eax, [save_cr3]
  248.            call set_cr3
  249.  
  250.            mov eax,[process_number]  ;set result
  251.            mov [application_table_status], 0 ;unlock application_table_status mutex
  252.  
  253.            pop edi
  254.            pop esi
  255.            pop ebx
  256.  
  257.            ret
  258.  
  259. .bigfilename:
  260.            pop edi
  261.            pop esi
  262.            pop ebx
  263.            mov eax, -ERROR_FILE_NOT_FOUND
  264.            ret
  265. .failed:
  266.            mov eax, [save_cr3]
  267.            call set_cr3
  268. .err:
  269. .err_hdr:
  270.            mov ecx, [file_base]
  271.            call @mem_free@4
  272.  
  273.            pop edi
  274.            pop esi
  275.            pop ebx
  276.  
  277.            xor eax, eax
  278.            mov [application_table_status],eax
  279.            mov eax, ecx
  280.            ret
  281. endp
  282.  
  283. align 4
  284. proc pe_app_param stdcall path:dword, raw:dword, ex_pg_dir:dword, ex_stack:dword
  285.  
  286.            locals
  287.              slot        dd ?
  288.              slot_base   dd ?
  289.              pl0_stack   dd ?
  290.            endl
  291.  
  292.            push ebx
  293.            push esi
  294.            push edi
  295.  
  296.            lea ebx, [application_table_status]
  297.            call wait_mutex
  298.  
  299.            call set_application_table_status
  300.  
  301.            call get_new_process_place
  302.            test eax, eax
  303.            mov ecx, -0x20      ; too many processes
  304.            jz .err
  305.  
  306.            mov [slot], eax
  307.            shl eax, 8
  308.            add eax, SLOT_BASE
  309.            mov [slot_base], eax
  310.            mov edi, eax
  311.            _clear_ 256     ;clean extended information about process
  312.  
  313. ; write application name
  314.            stdcall strrchr,  [path], '/'  ; now eax points to name without path
  315.            lea esi, [eax+1]
  316.            test eax, eax
  317.            jnz @F
  318.            lea esi, [path]
  319. @@:
  320.            mov ecx, 8  ; 8 chars for name
  321.            mov edi, [slot_base]
  322. .copy_process_name_loop:
  323.            lodsb
  324.            cmp al, '.'
  325.            jz .copy_process_name_done
  326.            test al, al
  327.            jz .copy_process_name_done
  328.            stosb
  329.            loop .copy_process_name_loop
  330. .copy_process_name_done:
  331.  
  332.            mov eax, [ex_pg_dir]
  333.            mov ebx, [slot_base]
  334.            mov [ebx+APPDATA.dir_table],eax
  335.  
  336.            ;mov   eax,[hdr_mem]
  337.            ;mov   [ebx+APPDATA.mem_size],eax
  338.  
  339.  
  340.            mov ecx, 1
  341.            call @core_alloc@4
  342.            lea edi, [eax+OS_BASE]
  343.            mov [pl0_stack], edi
  344.  
  345.            mov [ebx+APPDATA.pl0_stack], edi
  346.            add edi, RING0_STACK_SIZE
  347.            mov [ebx+APPDATA.saved_esp0], edi
  348.            mov [ebx+APPDATA.fpu_state],  edi
  349.            mov [ebx+APPDATA.fpu_handler], 0
  350.            mov [ebx+APPDATA.sse_handler], 0
  351.  
  352. ;set default io permission map
  353.            mov [ebx+APPDATA.io_map],\
  354.                (tss._io_map_0-OS_BASE+PG_MAP)
  355.            mov [ebx+APPDATA.io_map+4],\
  356.                (tss._io_map_1-OS_BASE+PG_MAP)
  357.  
  358.            mov esi, fpu_data
  359.            mov ecx, 512/4
  360.            rep movsd
  361.  
  362.            mov eax, [slot]
  363.            cmp eax,[TASK_COUNT]
  364.            jle .noinc
  365.            inc dword [TASK_COUNT]       ;update number of processes
  366. .noinc:
  367.            lea edx, [ebx+APP_EV_OFFSET]
  368.            mov [ebx+APPDATA.fd_ev],edx
  369.            mov [ebx+APPDATA.bk_ev],edx
  370.  
  371.            add edx, APP_OBJ_OFFSET-APP_EV_OFFSET
  372.            mov [ebx+APPDATA.fd_obj],edx
  373.            mov [ebx+APPDATA.bk_obj],edx
  374.  
  375.            mov ecx, [def_cursor]
  376.            mov [ebx+APPDATA.cursor],ecx
  377.  
  378.            xor ecx, ecx
  379.            call @core_alloc@4
  380.            lea edi, [eax+OS_BASE]         ; FIXME
  381.  
  382.            mov esi,[current_slot]
  383.            mov esi,[esi+APPDATA.cur_dir]
  384.            mov ecx,0x1000/4
  385.            mov [ebx+APPDATA.cur_dir],edi
  386.            rep movsd
  387.  
  388.            mov ebx, [slot]
  389.            mov eax, ebx
  390.            shl ebx, 5
  391.            mov dword [CURRENT_TASK+ebx+0x10], 0
  392.  
  393.            lea    ecx,[draw_data+ebx]  ;ecx - pointer to draw data
  394.  
  395. ; set window state to 'normal' (non-minimized/maximized/rolled-up) state
  396.            mov     [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
  397.            mov     [ebx+window_data+WDATA.fl_redraw], 1
  398.            add    ebx,CURRENT_TASK        ;ebx - pointer to information about process
  399.            mov    [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot
  400.  
  401.            mov    [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function)
  402.  
  403.            inc    dword [process_number]
  404.            mov    eax,[process_number]
  405.            mov    [ebx+4],eax       ;set PID
  406.  
  407. ;set draw data to full screen
  408.  
  409.            mov    [ecx+0],dword 0
  410.            mov    [ecx+4],dword 0
  411.            mov    eax,[Screen_Max_X]
  412.            mov    [ecx+8],eax
  413.            mov    eax,[Screen_Max_Y]
  414.            mov    [ecx+12],eax
  415.  
  416.            mov ebx, [pl0_stack]
  417.  
  418.            mov eax,   [raw]
  419.            lea ecx, [ebx+REG_EDI]
  420.            mov edx,   [ex_stack]
  421.  
  422.            mov [ebx+REG_ENTRY],   dword  _sys_app_entry
  423.            mov [ebx+REG_RESTART], dword _pe_restart
  424.            mov [ebx+REG_RAW], eax
  425.            mov [ebx+REG_CSTACK], ecx
  426.            mov [ebx+REG_USTACK], edx
  427.  
  428.            lea ebx, [ebx+REG_ENTRY]
  429.  
  430.            mov ecx, [slot]
  431.            shl ecx, 5
  432.            mov [ecx*8+SLOT_BASE+APPDATA.saved_esp], ebx
  433.            mov  [CURRENT_TASK+ecx+TASKDATA.state], 0
  434.  
  435.            DEBUGF 1,"%s",new_process_running
  436. .err:
  437.            mov eax,[process_number]  ;set result
  438.            mov [application_table_status], 0 ;unlock application_table_status mutex
  439.  
  440.            pop edi
  441.            pop esi
  442.            pop ebx
  443.  
  444.            ret
  445. endp
  446.  
  447. align 4
  448. _pe_restart:
  449.            xchg bx, bx
  450.            add esp, 12
  451.            popad
  452.            iretd
  453.  
  454.  
  455. align 4
  456. proc get_new_process_place
  457. ;input:
  458. ;  none
  459. ;result:
  460. ;  eax=[new_process_place]<>0 - ok
  461. ;      0 - failed.
  462. ;This function find least empty slot.
  463. ;It doesn't increase [TASK_COUNT]!
  464.            mov    eax,CURRENT_TASK
  465.            mov    ebx,[TASK_COUNT]
  466.            inc    ebx
  467.            shl    ebx,5
  468.            add    ebx,eax               ;ebx - address of process information for (last+1) slot
  469. .newprocessplace:
  470. ;eax = address of process information for current slot
  471.            cmp    eax,ebx
  472.            jz     .endnewprocessplace   ;empty slot after high boundary
  473.            add    eax,0x20
  474.            cmp    word [eax+0xa],9      ;check process state, 9 means that process slot is empty
  475.            jnz    .newprocessplace
  476. .endnewprocessplace:
  477.            mov    ebx,eax
  478.            sub    eax,CURRENT_TASK
  479.            shr    eax,5                 ;calculate slot index
  480.            cmp    eax,256
  481.            jge    .failed               ;it should be <256
  482.            mov    word [ebx+0xa],9      ;set process state to 9 (for slot after hight boundary)
  483.            ret
  484. .failed:
  485.            xor    eax,eax
  486.            ret
  487. endp
  488.  
  489. align 4
  490. proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
  491.            locals
  492.              app_pages   dd ?
  493.              img_pages   dd ?
  494.              dir_addr    dd ?
  495.              app_tabs    dd ?
  496.            endl
  497.  
  498.            mov ebx, pg_data.pg_mutex
  499.            call wait_mutex   ;ebx
  500.  
  501.            xor eax, eax
  502.            mov [dir_addr], eax
  503.  
  504.            mov eax, [app_size]
  505.            add eax, 4095
  506.            and eax, not 4095
  507.            mov [app_size], eax
  508.            mov ebx, eax
  509.            shr eax, 12
  510.            mov [app_pages], eax
  511.  
  512.            add ebx, 0x3FFFFF
  513.            and ebx, not 0x3FFFFF
  514.            shr ebx, 22
  515.            mov [app_tabs], ebx
  516.  
  517.            mov ecx, [img_size]
  518.            add ecx, 4095
  519.            and ecx, not 4095
  520.  
  521.            mov [img_size], ecx
  522.            shr ecx, 12
  523.            mov [img_pages], ecx
  524.  
  525.            call _alloc_page
  526.            test eax, eax
  527.            mov [dir_addr], eax
  528.            jz .fail
  529.  
  530.            ;lea edi, [eax + OS_BASE]
  531.            ;mov ecx, (OS_BASE shr 20)/4
  532.            ;xor eax, eax
  533.            ;cld
  534.            ;rep stosd
  535.  
  536.            ;mov ecx, 1024-(OS_BASE shr 20)/4
  537.            ;mov esi, _sys_pdbr+(OS_BASE shr 20)
  538.            ;rep movsd
  539.  
  540.            lea edi, [eax+OS_BASE]
  541.            mov ecx, 512
  542.            xor eax, eax
  543.            cld
  544.            rep stosd
  545.  
  546.            mov ecx, 512
  547.            mov esi, _sys_pdbr+(HEAP_BASE shr 20)
  548.            rep movsd
  549.  
  550.            mov edi, [dir_addr]
  551.            lea eax, [edi+PG_SW]
  552.            mov [edi+OS_BASE+(page_tabs shr 20)], eax
  553.  
  554.            mov eax, edi
  555.            call set_cr3
  556.  
  557.            mov edx, [app_tabs]
  558.            mov edi, master_tab
  559. @@:
  560.            call _alloc_page
  561.            test eax, eax
  562.            jz .fail
  563.  
  564.            or eax, PG_UW
  565.            stosd
  566.            dec edx
  567.            jnz @B
  568.  
  569.            mov edi, page_tabs
  570.            mov ecx, [app_tabs]
  571.            shl ecx, 10
  572.            xor eax, eax
  573.            rep stosd
  574.  
  575.            mov ecx, [app_pages]
  576.            xor ebx, ebx
  577. .alloc:
  578.            xor ecx, ecx
  579.            call @core_alloc@4
  580.            test eax, eax
  581.            jz .fail
  582.  
  583.            stdcall map_page,ebx,eax,dword PG_UW
  584.            add ebx, 0x1000
  585.            dec [app_pages]
  586.            jnz .alloc
  587.  
  588.            mov ecx, [img_size]                 ; FIXME remap md
  589.            mov esi, [img_base]
  590.            xor edi, edi
  591.  
  592.            rep movsb
  593.  
  594. .done:
  595.            dec [pg_data.pg_mutex]
  596.            mov eax, [dir_addr]
  597.            ret
  598. .fail:
  599.            dec [pg_data.pg_mutex]
  600.            cmp [dir_addr], 0
  601.            je @f
  602.            stdcall destroy_app_space, [dir_addr]
  603. @@:
  604.            xor eax, eax
  605.            ret
  606. endp
  607.  
  608. ;addr_t __fastcall pe_app_space(size_t size);
  609. align 4
  610. @pe_app_space@4:
  611.            sub esp, 16
  612.  
  613.            mov [esp+4],  ebx
  614.            mov [esp+8],  esi
  615.            mov [esp+12], edi
  616.  
  617.            lea ebx, [ecx+0x3FFFFF]
  618.  
  619.            xor ecx, ecx
  620.            call @core_alloc@4
  621.            test eax, eax
  622.            mov [esp], eax
  623.            jz .fail
  624.  
  625.            mov ecx, 512
  626.            lea edi, [eax + OS_BASE]
  627.            xor eax, eax
  628.            cld
  629.            rep stosd
  630.  
  631.            mov ecx, 512
  632.            mov esi, _sys_pdbr+(HEAP_BASE shr 20)
  633.            rep movsd
  634.  
  635.            mov esi, [esp]
  636.            shr ebx, 22
  637. .new_ptab:
  638.            xor ecx, ecx
  639.            call @core_alloc@4
  640.            test eax, eax
  641.            jz .fail
  642.  
  643.            lea edi, [eax+OS_BASE]
  644.            or eax, PG_UW
  645.            mov [esi+OS_BASE], eax
  646.  
  647.            mov ecx, 1024
  648.            xor eax, eax
  649.            rep stosd
  650.  
  651.            add esi, 4
  652.            dec ebx
  653.            jnz .new_ptab
  654.  
  655.            xor ecx, ecx
  656.            call @core_alloc@4
  657.            test eax, eax
  658.            jz .fail
  659.  
  660.            lea edi, [eax+OS_BASE]
  661.            or eax, PG_UW
  662.  
  663.            mov ebx, [esp]
  664.            lea edx, [ebx+PG_SW]
  665.            mov [ebx+OS_BASE+(0x7FC00000 shr 20)], eax
  666.            mov [ebx+OS_BASE+(page_tabs shr 20)], edx
  667.  
  668.            mov ecx, 1024
  669.            xor eax, eax
  670.            rep stosd
  671.  
  672.            mov eax, ebx
  673. .fail:
  674.            mov ebx, [esp+4]
  675.            mov esi, [esp+8]
  676.            mov edi, [esp+12]
  677.  
  678.            add esp, 16
  679.            ret
  680.  
  681. align 4
  682. set_cr3:
  683.  
  684.            mov ebx, [current_slot]
  685.            mov [ebx+APPDATA.dir_table], eax
  686.            mov cr3, eax
  687.            ret
  688.  
  689. align 4
  690. proc destroy_page_table stdcall, pg_tab:dword
  691.  
  692.            push ebx
  693.            push esi
  694.  
  695.            mov esi, [pg_tab]
  696.            mov ebx, 1024
  697. .free:
  698.            mov ecx, [esi]
  699.            test ecx, 1
  700.            jz .next
  701.  
  702.            test ecx, 1 shl 9
  703.            jnz .next                      ;skip shared pages
  704.  
  705.            call @core_free@4
  706. .next:
  707.            add esi, 4
  708.            dec ebx
  709.            jnz .free
  710.            pop esi
  711.            pop ebx
  712.            ret
  713. endp
  714.  
  715. align 4
  716. proc destroy_app_space stdcall, pg_dir:dword
  717.  
  718.            mov ebx, pg_data.pg_mutex
  719.            call wait_mutex   ;ebx
  720.  
  721.            xor   edx,edx
  722.            mov   eax,0x2
  723.            mov ebx, [pg_dir]
  724. .loop:
  725. ;eax = current slot of process
  726.            mov   ecx,eax
  727.            shl   ecx,5
  728.            cmp   byte [CURRENT_TASK+ecx+0xa],9  ;if process running?
  729.            jz    @f                             ;skip empty slots
  730.  
  731.            shl   ecx,3
  732.            cmp   [SLOT_BASE+ecx+0xB8],ebx       ;compare page directory addresses
  733.            jnz   @f
  734.  
  735.            inc   edx                            ;thread found
  736. @@:
  737.            inc   eax
  738.            cmp   eax,[TASK_COUNT]               ;exit loop if we look through all processes
  739.            jle   .loop
  740.  
  741. ;edx = number of threads
  742. ;our process is zombi so it isn't counted
  743.            cmp   edx,1
  744.            jg    .exit
  745. ;if there isn't threads then clear memory.
  746.  
  747.            mov eax, [pg_dir]
  748.            and eax, -4096
  749.            add eax, OS_BASE
  750.            mov [tmp_task_pdir], eax
  751.            mov esi, eax
  752.            mov edi, (HEAP_BASE shr 20)/4
  753. .destroy:
  754.            mov eax, [esi]
  755.            test eax, 1
  756.            jz .next
  757.            and eax, not 0xFFF
  758.            add eax, OS_BASE
  759.  
  760.            stdcall destroy_page_table, eax
  761.  
  762.            mov ecx, [esi]
  763.            call @core_free@4
  764. .next:
  765.            add esi, 4
  766.            dec edi
  767.            jnz .destroy
  768.  
  769.            mov ecx, [pg_dir]
  770.            call @core_free@4
  771. .exit:
  772.            dec [pg_data.pg_mutex]
  773.            ret
  774. endp
  775.  
  776. align 4
  777. get_pid:
  778.            mov eax, [TASK_BASE]
  779.            mov eax, [eax+TASKDATA.pid]
  780.            ret
  781.  
  782. pid_to_slot:
  783. ;Input:
  784. ;  eax - pid of process
  785. ;Output:
  786. ;  eax - slot of process or 0 if process don't exists
  787. ;Search process by PID.
  788.     push   ebx
  789.     push   ecx
  790.     mov    ebx,[TASK_COUNT]
  791.     shl    ebx,5
  792.     mov    ecx,2*32
  793.  
  794. .loop:
  795. ;ecx=offset of current process info entry
  796. ;ebx=maximum permitted offset
  797.     cmp    byte [CURRENT_TASK+ecx+0xa],9
  798.     jz     .endloop              ;skip empty slots
  799.     cmp    [CURRENT_TASK+ecx+0x4],eax ;check PID
  800.     jz     .pid_found
  801. .endloop:
  802.     add    ecx,32
  803.     cmp    ecx,ebx
  804.     jle    .loop
  805.  
  806.     pop    ecx
  807.     pop    ebx
  808.     xor    eax,eax
  809.     ret
  810.  
  811. .pid_found:
  812.     shr    ecx,5
  813.     mov    eax,ecx               ;convert offset to index of slot
  814.     pop    ecx
  815.     pop    ebx
  816.     ret
  817.  
  818. check_region:
  819. ;input:
  820. ;  ebx - start of buffer
  821. ;  ecx - size of buffer
  822. ;result:
  823. ;  eax = 1 region lays in app memory
  824. ;  eax = 0 region don't lays in app memory
  825.      mov  eax,[CURRENT_TASK]
  826.      jmp  check_process_region
  827. ;-----------------------------------------------------------------------------
  828. check_process_region:
  829. ;input:
  830. ;  eax - slot
  831. ;  ebx - start of buffer
  832. ;  ecx - size of buffer
  833. ;result:
  834. ;  eax = 1 region lays in app memory
  835. ;  eax = 0 region don't lays in app memory
  836.  
  837.      test ecx,ecx
  838.      jle  .ok
  839.      shl  eax,5
  840.      cmp  word [CURRENT_TASK+eax+0xa],0
  841.      jnz  .failed
  842.      shl  eax,3
  843.      mov  eax,[SLOT_BASE+eax+0xb8]
  844.      test eax,eax
  845.      jz   .failed
  846.  
  847.      mov  eax,1
  848.      ret
  849.  
  850. ;    call MEM_Get_Linear_Address
  851. ;    push ebx
  852. ;    push ecx
  853. ;    push edx
  854. ;    mov  edx,ebx
  855. ;    and  edx,not (4096-1)
  856. ;    sub  ebx,edx
  857. ;    add  ecx,ebx
  858. ;    mov  ebx,edx
  859. ;    add  ecx,(4096-1)
  860. ;    and  ecx,not (4096-1)
  861. ;.loop:
  862. ;;eax - linear address of page directory
  863. ;;ebx - current page
  864. ;;ecx - current size
  865. ;    mov  edx,ebx
  866. ;    shr  edx,22
  867. ;    mov  edx,[eax+4*edx]
  868. ;    and  edx,not (4096-1)
  869. ;    test edx,edx
  870. ;    jz   .failed1
  871. ;    push eax
  872. ;    mov  eax,edx
  873. ;    call MEM_Get_Linear_Address
  874. ;    mov  edx,ebx
  875. ;    shr  edx,12
  876. ;    and  edx,(1024-1)
  877. ;    mov  eax,[eax+4*edx]
  878. ;    and  eax,not (4096-1)
  879. ;    test eax,eax
  880. ;    pop  eax
  881. ;    jz   .failed1
  882. ;    add  ebx,4096
  883. ;    sub  ecx,4096
  884. ;    jg   .loop
  885. ;    pop  edx
  886. ;    pop  ecx
  887. ;    pop  ebx
  888. .ok:
  889.     mov  eax,1
  890.     ret
  891. ;
  892. ;.failed1:
  893. ;    pop  edx
  894. ;    pop  ecx
  895. ;    pop  ebx
  896. .failed:
  897.     xor  eax,eax
  898.     ret
  899.  
  900. align 4
  901. proc read_process_memory
  902. ;Input:
  903. ;  eax - process slot
  904. ;  ebx - buffer address
  905. ;  ecx - buffer size
  906. ;  edx - start address in other process
  907. ;Output:
  908. ;  eax - number of bytes read.
  909.            locals
  910.              slot       dd ?
  911.              buff       dd ?
  912.              r_count    dd ?
  913.              offset     dd ?
  914.              tmp_r_cnt  dd ?
  915.            endl
  916.  
  917.            mov [slot], eax
  918.            mov [buff], ebx
  919.            and [r_count], 0
  920.            mov [tmp_r_cnt], ecx
  921.            mov [offset], edx
  922.  
  923.            pushad
  924. .read_mem:
  925.            mov edx, [offset]
  926.            mov ebx, [tmp_r_cnt]
  927.  
  928.            mov ecx, 0x400000
  929.            and edx, 0x3FFFFF
  930.            sub ecx, edx
  931.            cmp ecx, ebx
  932.            jbe @f
  933.            mov ecx, ebx
  934. @@:
  935.            cmp ecx, 0x8000
  936.            jna @F
  937.            mov ecx, 0x8000
  938. @@:
  939.            mov eax, [slot]
  940.            shl  eax,8
  941.            mov ebx, [offset]
  942.            push ecx
  943.            stdcall map_memEx, [proc_mem_map],\
  944.                               [SLOT_BASE+eax+0xB8],\
  945.                               ebx, ecx
  946.            pop ecx
  947.  
  948.            mov esi, [offset]
  949.            and esi, 0xfff
  950.            add esi, [proc_mem_map]
  951.            mov edi, [buff]
  952.            mov edx, ecx
  953.            rep movsb
  954.            add [r_count], edx
  955.  
  956.            add [offset], edx
  957.            sub [tmp_r_cnt], edx
  958.            jnz .read_mem
  959.  
  960.            popad
  961.            mov eax, [r_count]
  962.            ret
  963. endp
  964.  
  965. align 4
  966. proc write_process_memory
  967. ;Input:
  968. ;  eax - process slot
  969. ;  ebx - buffer address
  970. ;  ecx - buffer size
  971. ;  edx - start address in other process
  972. ;Output:
  973. ;  eax - number of bytes written
  974.  
  975.            locals
  976.              slot       dd ?
  977.              buff       dd ?
  978.              w_count    dd ?
  979.              offset     dd ?
  980.              tmp_w_cnt  dd ?
  981.            endl
  982.  
  983.            mov [slot], eax
  984.            mov [buff], ebx
  985.            and [w_count], 0
  986.            mov [tmp_w_cnt], ecx
  987.            mov [offset], edx
  988.  
  989.            pushad
  990. .read_mem:
  991.            mov edx, [offset]
  992.            mov ebx, [tmp_w_cnt]
  993.  
  994.            mov ecx, 0x400000
  995.            and edx, 0x3FFFFF
  996.            sub ecx, edx
  997.            cmp ecx, ebx
  998.            jbe @f
  999.            mov ecx, ebx
  1000. @@:
  1001.            cmp ecx, 0x8000
  1002.            jna @F
  1003.            mov ecx, 0x8000
  1004. @@:
  1005.            mov eax, [slot]
  1006.            shl  eax,8
  1007.            mov ebx, [offset]
  1008.       ;     add ebx, new_app_base
  1009.            push ecx
  1010.            stdcall map_memEx, [proc_mem_map],\
  1011.                               [SLOT_BASE+eax+0xB8],\
  1012.                               ebx, ecx
  1013.            pop ecx
  1014.  
  1015.            mov edi, [offset]
  1016.            and edi, 0xfff
  1017.            add edi, [proc_mem_map]
  1018.            mov esi, [buff]
  1019.            mov edx, ecx
  1020.            rep movsb
  1021.  
  1022.            add [w_count], edx
  1023.            add [offset], edx
  1024.            sub [tmp_w_cnt], edx
  1025.            jnz .read_mem
  1026.  
  1027.            popad
  1028.            mov eax, [w_count]
  1029.            ret
  1030. endp
  1031.  
  1032. align 4
  1033. proc new_sys_threads
  1034.            locals
  1035.              slot      dd ?
  1036.              app_cmdline   dd ? ;0x00
  1037.              app_path      dd ? ;0x04
  1038.              app_eip       dd ? ;0x08
  1039.              app_esp       dd ? ;0x0C
  1040.              app_mem       dd ? ;0x10
  1041.            endl
  1042.  
  1043.            cmp eax,1
  1044.            jne .failed          ;other subfunctions
  1045.  
  1046.            xor  eax,eax
  1047.            mov [app_cmdline], eax
  1048.            mov [app_path], eax
  1049.            mov [app_eip], ebx
  1050.            mov [app_esp], ecx
  1051.  
  1052.            ;mov    esi,new_process_loading
  1053.            ;call   sys_msg_board_str
  1054.            DEBUGF 1,"%s",new_process_loading
  1055. .wait_lock:
  1056.            cmp [application_table_status],0
  1057.            je .get_lock
  1058.  
  1059.            call   change_task
  1060.            jmp .wait_lock
  1061.  
  1062. .get_lock:
  1063.            mov eax, 1
  1064.            xchg eax, [application_table_status]
  1065.            cmp eax, 0
  1066.            jne .wait_lock
  1067.  
  1068.            call   set_application_table_status
  1069.  
  1070.            call get_new_process_place
  1071.            test eax, eax
  1072.            jz .failed
  1073.  
  1074.            mov [slot], eax
  1075.  
  1076.            mov    esi,[current_slot]
  1077.            mov    ebx,esi         ;ebx=esi - pointer to extended information about current thread
  1078.  
  1079.            mov    edi, eax
  1080.            shl    edi,8
  1081.            add    edi,SLOT_BASE
  1082.            mov    edx,edi         ;edx=edi - pointer to extended infomation about new thread
  1083.            mov    ecx,256/4
  1084.            xor eax, eax
  1085.            cld
  1086.            rep    stosd           ;clean extended information about new thread
  1087.            mov    esi,ebx
  1088.            mov    edi,edx
  1089.            mov    ecx,11
  1090.            rep    movsb           ;copy process name
  1091.  
  1092.            mov eax,[ebx+APPDATA.heap_base]
  1093.            mov [edx+APPDATA.heap_base], eax
  1094.  
  1095.            mov ecx,[ebx+APPDATA.heap_top]
  1096.            mov [edx+APPDATA.heap_top], ecx
  1097.  
  1098.            mov eax,[ebx+APPDATA.mem_size]
  1099.            mov [edx+APPDATA.mem_size], eax
  1100.  
  1101.            mov ecx,[ebx+APPDATA.dir_table]
  1102.            mov [edx+APPDATA.dir_table],ecx  ;copy page directory
  1103.  
  1104.            lea eax, [app_cmdline]
  1105.            stdcall set_app_params ,[slot],eax,dword 0,\
  1106.                          dword 0,dword 0
  1107.  
  1108.            ;mov    esi,new_process_running
  1109.            ;call   sys_msg_board_str     ;output information about succefull startup
  1110.            DEBUGF 1,"%s",new_process_running
  1111.  
  1112.            mov    [application_table_status],0 ;unlock application_table_status mutex
  1113.            mov    eax,[process_number]  ;set result
  1114.            ret
  1115. .failed:
  1116.            mov    [application_table_status],0
  1117.            mov    eax,-1
  1118.            ret
  1119. endp
  1120.  
  1121. ; param
  1122. ;  ebx=mutex
  1123.  
  1124. align 4
  1125. wait_mutex:
  1126.            push eax
  1127.            push ebx
  1128. .do_wait:
  1129.            cmp dword [ebx],0
  1130.            je .get_lock
  1131.  
  1132.            call change_task
  1133.            jmp .do_wait
  1134. .get_lock:
  1135.            mov eax, 1
  1136.            xchg eax, [ebx]
  1137.            test eax, eax
  1138.            jnz .do_wait
  1139.  
  1140.            pop ebx
  1141.            pop eax
  1142.            ret
  1143.  
  1144.  
  1145.  
  1146. align 4
  1147. proc set_app_params stdcall,slot:dword, params:dword,\
  1148.                         cmd_line:dword, app_path:dword, flags:dword
  1149.  
  1150.            locals
  1151.              pl0_stack dd ?
  1152.            endl
  1153.  
  1154.            mov ecx, 1            ;(RING0_STACK_SIZE+512) shr 12
  1155.            call @core_alloc@4
  1156.            add eax, OS_BASE
  1157.            mov [pl0_stack], eax
  1158.  
  1159.            lea edi, [eax+RING0_STACK_SIZE]
  1160.  
  1161.            mov eax, [slot]
  1162.            mov ebx, eax
  1163.  
  1164.            shl eax, 8
  1165.            mov [eax+SLOT_BASE+APPDATA.fpu_state], edi
  1166.            mov [eax+SLOT_BASE+APPDATA.fpu_handler], 0
  1167.            mov [eax+SLOT_BASE+APPDATA.sse_handler], 0
  1168.  
  1169. ;set default io permission map
  1170.            mov [eax+SLOT_BASE+APPDATA.io_map],\
  1171.                (tss._io_map_0-OS_BASE+PG_MAP)
  1172.            mov [eax+SLOT_BASE+APPDATA.io_map+4],\
  1173.                (tss._io_map_1-OS_BASE+PG_MAP)
  1174.  
  1175.            mov esi, fpu_data
  1176.            mov ecx, 512/4
  1177.            rep movsd
  1178.  
  1179.            cmp    ebx,[TASK_COUNT]
  1180.            jle    .noinc
  1181.            inc    dword [TASK_COUNT]       ;update number of processes
  1182. .noinc:
  1183.            shl ebx,8
  1184.            lea edx, [ebx+SLOT_BASE+APP_EV_OFFSET]
  1185.            mov [SLOT_BASE+APPDATA.fd_ev+ebx],edx
  1186.            mov [SLOT_BASE+APPDATA.bk_ev+ebx],edx
  1187.  
  1188.            add edx, APP_OBJ_OFFSET-APP_EV_OFFSET
  1189.            mov [SLOT_BASE+APPDATA.fd_obj+ebx],edx
  1190.            mov [SLOT_BASE+APPDATA.bk_obj+ebx],edx
  1191.  
  1192.            mov ecx, [def_cursor]
  1193.            mov [SLOT_BASE+APPDATA.cursor+ebx],ecx
  1194.            mov eax, [pl0_stack]
  1195.            mov [SLOT_BASE+APPDATA.pl0_stack+ebx],eax
  1196.            add eax, RING0_STACK_SIZE
  1197.            mov [SLOT_BASE+APPDATA.saved_esp0+ebx], eax
  1198.  
  1199.            call _alloc_page
  1200.            add eax, OS_BASE
  1201.            mov esi,[current_slot]
  1202.            mov esi,[esi+APPDATA.cur_dir]
  1203.            mov ecx,0x1000/4
  1204.            mov edi,eax
  1205.            mov [ebx+SLOT_BASE+APPDATA.cur_dir],eax
  1206.            rep movsd
  1207.  
  1208.            shr ebx,3
  1209.            mov dword [CURRENT_TASK+ebx+0x10], 0
  1210.  
  1211. .add_command_line:
  1212.            mov edx,[params]
  1213.            mov edx,[edx]       ;app_cmdline
  1214.            test edx,edx
  1215.            jz @f           ;application doesn't need parameters
  1216.  
  1217.            mov     eax, edx
  1218.            add     eax, 256
  1219.            jc      @f
  1220.  
  1221.            cmp     eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
  1222.            ja      @f
  1223.  
  1224.            mov     byte [edx], 0   ;force empty string if no cmdline given
  1225.            mov     eax, [cmd_line]
  1226.            test    eax, eax
  1227.            jz      @f
  1228.            stdcall strncpy, edx, eax, 256
  1229. @@:
  1230.            mov edx,[params]
  1231.            mov edx, [edx+4]    ;app_path
  1232.            test edx,edx
  1233.            jz @F           ;application don't need path of file
  1234.            mov     eax, edx
  1235.            add     eax, 1024
  1236.            jc      @f
  1237.            cmp     eax, [SLOT_BASE+APPDATA.mem_size+ebx*8]
  1238.            ja      @f
  1239.            stdcall strncpy, edx, [app_path], 1024
  1240. @@:
  1241.            mov    ebx,[slot]
  1242.            mov    eax,ebx
  1243.            shl    ebx,5
  1244.            lea    ecx,[draw_data+ebx]  ;ecx - pointer to draw data
  1245.  
  1246. ; set window state to 'normal' (non-minimized/maximized/rolled-up) state
  1247.            mov     [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
  1248.            mov     [ebx+window_data+WDATA.fl_redraw], 1
  1249.            add    ebx,CURRENT_TASK        ;ebx - pointer to information about process
  1250.            mov    [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot
  1251.  
  1252.            mov    [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function)
  1253.  
  1254.            inc    dword [process_number]
  1255.            mov    eax,[process_number]
  1256.            mov    [ebx+4],eax       ;set PID
  1257.  
  1258. ;set draw data to full screen
  1259.  
  1260.            mov    [ecx+0],dword 0
  1261.            mov    [ecx+4],dword 0
  1262.            mov    eax,[Screen_Max_X]
  1263.            mov    [ecx+8],eax
  1264.            mov    eax,[Screen_Max_Y]
  1265.            mov    [ecx+12],eax
  1266.  
  1267.            mov ebx, [pl0_stack]
  1268.            mov esi,[params]
  1269.            lea ecx, [ebx+REG_EIP]
  1270.            xor eax, eax
  1271.  
  1272.            mov [ebx+REG_RET], dword irq0.return
  1273.            mov [ebx+REG_EDI], eax
  1274.            mov [ebx+REG_ESI], eax
  1275.            mov [ebx+REG_EBP], eax
  1276.            mov [ebx+REG_ESP], ecx   ;ebx+REG_EIP
  1277.            mov [ebx+REG_EBX], eax
  1278.            mov [ebx+REG_EDX], eax
  1279.            mov [ebx+REG_ECX], eax
  1280.            mov [ebx+REG_EAX], eax
  1281.  
  1282.            mov eax, [esi+0x08]       ;app_eip
  1283.            mov [ebx+REG_EIP],  eax   ;app_entry
  1284.            mov [ebx+REG_CS], dword sel_app_code
  1285.                mov [ebx+REG_EFLAGS], dword EFL_IOPL3+EFL_IF
  1286.  
  1287.            mov eax, [esi+0x0C]       ;app_esp
  1288.            mov [ebx+REG_APP_ESP], eax    ;app_stack
  1289.            mov [ebx+REG_SS], dword sel_app_data
  1290.  
  1291.            lea ecx, [ebx+REG_RET]
  1292.            mov ebx, [slot]
  1293.            shl ebx, 5
  1294.            mov [ebx*8+SLOT_BASE+APPDATA.saved_esp], ecx
  1295.  
  1296.            xor  ecx, ecx    ; process state - running
  1297. ; set if debuggee
  1298.            test byte [flags], 1
  1299.            jz   .no_debug
  1300.  
  1301.            inc  ecx     ; process state - suspended
  1302.            mov  eax,[CURRENT_TASK]
  1303.            mov  [SLOT_BASE+ebx*8+APPDATA.debugger_slot],eax
  1304. .no_debug:
  1305.            mov  [CURRENT_TASK+ebx+TASKDATA.state], cl
  1306.            DEBUGF 1,"%s",new_process_running
  1307.            ret
  1308. endp
  1309.  
  1310. include "debug.inc"
  1311.