Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. tmp_page_tab      equ 0x01000000
  3.  
  4. align 4
  5. proc mem_test
  6.            mov eax, cr0
  7.            or eax, (CR0_CD+CR0_NW);disable caching
  8.            mov cr0, eax
  9.            wbinvd                 ;invalidate cache
  10.  
  11.            xor     edi, edi
  12.            mov ebx, 'TEST'
  13. @@:
  14.            add edi, 0x400000
  15.            xchg ebx, dword [edi]
  16.            cmp dword [edi], 'TEST'
  17.            xchg ebx, dword [edi]
  18.            je @b
  19.  
  20.            and eax, not (CR0_CD+CR0_NW)
  21.            mov cr0, eax
  22.            mov eax, edi
  23.            ret
  24. endp
  25.  
  26. align 4
  27. proc init_memEx
  28.            xor eax, eax
  29.            mov edi, sys_pgdir
  30.            mov ecx, 2048
  31.            rep stosd
  32.  
  33.            bt [cpu_caps], CAPS_PSE
  34.            jnc .no_PSE
  35.  
  36.            mov ebx, cr4
  37.            or ebx, CR4_PSE
  38.            mov eax, PG_LARGE+PG_SW
  39.            bt [cpu_caps], CAPS_PGE
  40.            jnc @F
  41.            or eax, PG_GLOBAL
  42.            or ebx, CR4_PGE
  43.  
  44. @@:
  45.            mov cr4, ebx
  46.  
  47.            mov dword [sys_pgdir], eax
  48.            add eax, 0x00400000
  49.            mov dword [sys_pgdir+4], eax
  50.            add eax, 0x00400000
  51.            mov dword [sys_pgdir+8], eax
  52.            add eax, 0x00400000
  53.            mov dword [sys_pgdir+12], eax
  54.  
  55.            mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
  56.            mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
  57.  
  58.            mov ecx, [pg_data.kernel_tables]
  59.            sub ecx, 4
  60.            mov eax, tmp_page_tab+PG_SW
  61.            mov edi, sys_pgdir+16
  62.            mov esi, sys_master_tab+16
  63.  
  64.            jmp .map_kernel_tabs
  65. .no_PSE:
  66.            mov eax, PG_SW
  67.            mov esi, tmp_page_tab
  68.            mov ecx, 4096/4      ;0x0 - 0x00FFFFFF
  69. .map_low:
  70.            mov [esi], eax
  71.            add eax, 0x1000
  72.            mov [esi+4], eax
  73.            add eax, 0x1000
  74.            mov [esi+8], eax
  75.            add eax, 0x1000
  76.            mov [esi+12], eax
  77.            add eax, 0x1000
  78.            add esi, 16
  79.            dec ecx
  80.            jnz .map_low            ;ÿäðî
  81.  
  82.            mov ecx, [pg_data.kernel_tables]
  83.            mov eax, tmp_page_tab+PG_SW
  84.            mov edi, sys_pgdir
  85.            mov esi, sys_master_tab
  86.  
  87. .map_kernel_tabs:
  88.  
  89.            mov [edi], eax
  90.            mov [esi], eax
  91.            add eax, 0x1000
  92.            add edi, 4
  93.            add esi, 4
  94.            dec ecx
  95.            jnz .map_kernel_tabs
  96.  
  97.            mov edi, tmp_page_tab
  98.            bt [cpu_caps], CAPS_PSE
  99.            jc @F
  100.            add edi, 4096*4      ;skip low kernel memory
  101. @@:
  102.            mov ecx, [pg_data.kernel_tables]
  103.            sub ecx, 4
  104.            shl ecx, 10
  105.            xor eax, eax
  106.            cld
  107.            rep stosd
  108.  
  109.            mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
  110.            mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
  111.            ret
  112. endp
  113.  
  114. align 4
  115. proc init_page_map
  116.            mov edi, sys_pgmap
  117.            mov ecx, 512/4
  118.            xor eax,eax
  119.            cld
  120.            rep stosd
  121.  
  122.            not eax
  123.            mov ecx, [pg_data.pagemap_size]
  124.            sub ecx, 512
  125.            shr ecx, 2
  126.            rep stosd
  127.  
  128.            mov edi, sys_pgmap+512
  129.            mov edx, [pg_data.pages_count]
  130.            mov ecx, [pg_data.kernel_tables]
  131.            bt [cpu_caps], CAPS_PSE
  132.            jnc @f
  133.            sub ecx, 4
  134. @@:
  135.            sub edx, 4096
  136.            sub edx, ecx
  137.            mov [pg_data.pages_free], edx
  138.  
  139.            xor eax, eax
  140.            mov ebx, ecx
  141.            shr ecx, 5
  142.            rep stosd
  143.  
  144.            not eax
  145.            mov ecx, ebx
  146.            and ecx, 31
  147.            shl eax, cl
  148.            stosd
  149.  
  150.            mov [page_start], sys_pgmap+512
  151.            mov ebx, sys_pgmap
  152.            add ebx, [pg_data.pagemap_size]
  153.            mov [page_end], ebx
  154.  
  155.            mov [pg_data.pg_mutex], 0
  156.  
  157.            ret
  158. endp
  159.  
  160. align 4
  161. proc alloc_page
  162.  
  163.            pushfd
  164.            cli
  165.            mov ebx, [page_start]
  166.            mov ecx, [page_end]
  167. .l1:
  168.            bsf eax,[ebx];
  169.            jnz .found
  170.            add ebx,4
  171.            cmp ebx, ecx
  172.            jb .l1
  173.            popfd
  174.            xor eax,eax
  175.            ret
  176. .found:
  177.            btr [ebx], eax
  178.            mov [page_start],ebx
  179.            sub ebx, sys_pgmap
  180.            shl ebx, 3
  181.            add eax,ebx
  182.            shl eax, 12
  183.            dec [pg_data.pages_free]
  184.            popfd
  185.            ret
  186. endp
  187.  
  188. align 4
  189. proc alloc_pages stdcall, count:dword
  190.            pushfd
  191.            cli
  192.            mov eax, [count]
  193.            add eax, 7
  194.            shr eax, 3
  195.            mov [count], eax
  196.            cmp eax, [pg_data.pages_free]
  197.            ja .fail
  198.  
  199.            mov ecx, [page_start]
  200.            mov ebx, [page_end]
  201. .find:
  202.            mov edx, [count]
  203.            mov edi, ecx
  204.  
  205. .match:
  206.            cmp byte [ecx], 0xFF
  207.            jne .next
  208.            dec edx
  209.            jz .ok
  210.            inc ecx
  211.            cmp ecx,ebx
  212.            jb .match
  213. .fail:     xor eax, eax
  214.            popfd
  215.            ret
  216. .next:
  217.            inc ecx
  218.            cmp ecx, ebx
  219.            jb .find
  220.            popfd
  221.            xor eax, eax
  222.            ret
  223. .ok:
  224.            sub ecx, edi
  225.            inc ecx
  226.            mov esi, edi
  227.            xor eax, eax
  228.            rep stosb
  229.            sub esi, sys_pgmap
  230.            shl esi, 3+12
  231.            mov eax, esi
  232.            mov ebx, [count]
  233.            shl ebx, 3
  234.            sub [pg_data.pages_free], ebx
  235.            popfd
  236.            ret
  237. endp
  238.  
  239. align 4
  240. proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
  241.            mov eax, [phis_addr]
  242.            and eax, not 0xFFF
  243.            or eax, [flags]
  244.            mov ebx, [lin_addr]
  245.            shr ebx, 12
  246.            mov [pages_tab+ebx*4], eax
  247.            mov eax, [lin_addr]
  248.            invlpg [eax]
  249.            ret
  250. endp
  251.  
  252. align 4
  253. proc free_page
  254. ;arg:  eax  page address
  255.            pushfd
  256.            cli
  257.            inc [pg_data.pages_free]
  258.            shr eax, 12              ;page index
  259.            mov ebx, sys_pgmap
  260.            bts [ebx], eax           ;that's all!
  261.            shr eax, 3
  262.            and eax, not 3           ;dword offset from page_map
  263.            add eax, ebx
  264.            cmp [page_start], eax
  265.            ja @f
  266.            popfd
  267.            ret
  268. @@:
  269.            mov [page_start], eax
  270.            popfd
  271.            ret
  272. endp
  273.  
  274. align 4
  275. proc map_page_table stdcall,page_dir:dword, lin_addr:dword, phis_addr:dword
  276.            mov ebx, [lin_addr]
  277.            shr ebx, 22
  278.            mov eax, [phis_addr]
  279.            and eax, not 0xFFF
  280.            or eax, PG_UW          ;+PG_NOCACHE
  281.            mov ecx, [page_dir]
  282.            mov dword [ecx+ebx*4], eax
  283.            mov dword [master_tab+ebx*4], eax
  284.            mov eax, [lin_addr]
  285.            shr eax, 10
  286.            add eax, pages_tab
  287.            invlpg [eax]
  288.            ret
  289. endp
  290.  
  291. align 4
  292. proc init_LFB
  293.  
  294.            cmp dword [LFBAddress], -1
  295.            jne @f
  296.  
  297.            stdcall kernel_alloc, 0x280000
  298.            mov [LFBAddress], eax
  299.            ret
  300. @@:
  301.            test [SCR_MODE],word 0100000000000000b
  302.            jz @f
  303.            call map_LFB
  304. @@:
  305.            ret
  306. endp
  307.  
  308. align 4
  309. proc map_LFB
  310.            locals
  311.              pg_count dd ?
  312.            endl
  313.  
  314.            mov edi, [LFBSize]
  315.            mov esi, [LFBAddress]
  316.            shr edi, 12
  317.            mov [pg_count], edi
  318.            shr edi, 10
  319.  
  320.            bt [cpu_caps], CAPS_PSE
  321.            jnc .map_page_tables
  322.            mov ebx, esi
  323.            or esi, PG_LARGE+PG_UW
  324.            shr ebx, 20
  325.            mov ecx, ebx
  326. @@:
  327.            mov [sys_pgdir+ebx], esi
  328.            add ebx, 4
  329.            add esi, 0x00400000
  330.            dec edi
  331.            jnz @B
  332.  
  333.            or dword [sys_pgdir+ecx], PG_GLOBAL
  334.            mov eax, cr3       ;flush TLB
  335.            mov cr3, eax
  336.            ret
  337.  
  338. .map_page_tables:
  339.  
  340. @@:
  341.            call alloc_page
  342.            stdcall map_page_table,sys_pgdir, esi, eax
  343.            add esi, 0x00400000
  344.            dec edi
  345.            jnz @B
  346.  
  347.            mov eax, [LFBAddress]
  348.            mov esi, eax
  349.            shr esi, 10
  350.            add esi, pages_tab
  351.            or eax, PG_UW
  352.            mov ecx, [pg_count]
  353.            shr ecx, 2
  354. .map:
  355.            mov [esi], eax
  356.            add eax, 0x1000
  357.            mov [esi+4], eax
  358.            add eax, 0x1000
  359.            mov [esi+8], eax
  360.            add eax, 0x1000
  361.            mov [esi+12], eax
  362.            add eax, 0x1000
  363.            add esi, 16
  364.            sub ecx, 1
  365.            jnz .map
  366.  
  367.            mov eax, cr3       ;flush TLB
  368.            mov cr3, eax
  369.  
  370.            ret
  371. endp
  372.  
  373. align 4
  374. proc new_mem_resize stdcall, new_size:dword
  375.  
  376.            stdcall wait_mutex, pg_data.pg_mutex
  377.  
  378.            mov edi, [new_size]
  379.            add edi,4095
  380.            and edi,not 4095
  381.            mov [new_size], edi
  382.  
  383.            mov edx,[CURRENT_TASK]
  384.            shl edx,8
  385.            mov esi, [PROC_BASE+0x8c+edx]
  386.            add esi, 4095
  387.            and esi, not 4095
  388.  
  389.            cmp edi, esi
  390.            jae .expand
  391.  
  392.            shr edi, 12
  393.            shr esi, 12
  394. @@:
  395.            mov eax, [pages_tab+0x00181000+edi*4]
  396.            test eax, 1
  397.            jz .next
  398.            mov dword [pages_tab+0x00181000+edi*4], 2
  399.            mov ebx, edi
  400.            shl ebx, 12
  401.            invlpg [ebx+std_application_base_address]
  402.            call free_page
  403.  
  404. .next:     add edi, 1
  405.            cmp edi, esi
  406.            jb @B
  407.  
  408. .update_size:
  409.  
  410.            mov ebx, [new_size]
  411.            mov    [PROC_BASE+0x8c+edx],ebx
  412.  
  413. ;search threads and update
  414. ;application memory size infomation
  415.            mov    ecx,[PROC_BASE+0xb8+edx]
  416.            mov    eax,2
  417.  
  418. .search_threads:
  419. ;eax = current slot
  420. ;ebx = new memory size
  421. ;ecx = page directory
  422.            cmp    eax,[TASK_COUNT]
  423.            jg     .search_threads_end
  424.            mov    edx,eax
  425.            shl    edx,5
  426.            cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
  427.            jz     .search_threads_next
  428.            shl    edx,3
  429.            cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
  430.            jnz    .search_threads_next
  431.            mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
  432. .search_threads_next:
  433.            inc    eax
  434.            jmp    .search_threads
  435. .search_threads_end:
  436.            xor eax, eax
  437.            dec [pg_data.pg_mutex]
  438.            ret
  439.  
  440. .expand:
  441.            add edi, new_app_base
  442.            add esi, new_app_base
  443.  
  444.            push esi
  445.            push edi
  446.  
  447.            add edi, 0x3FFFFF
  448.            and edi, not(0x3FFFFF)
  449.            add esi, 0x3FFFFF
  450.            and esi, not(0x3FFFFF)
  451.  
  452.            cmp esi, edi
  453.            jae .grow
  454.  
  455.            xchg esi, edi
  456.  
  457.            mov eax, cr3
  458.            stdcall map_page,[tmp_task_pdir],eax,dword PG_SW+PG_NOCACHE
  459.  
  460. @@:
  461.            call alloc_page
  462.            test eax, eax
  463.            jz .exit
  464.  
  465.            stdcall map_page_table,[tmp_task_pdir], edi, eax
  466.  
  467.            push edi
  468.            shr edi, 10
  469.            add edi, pages_tab
  470.            mov ecx, 1024
  471.            xor eax, eax
  472.            cld
  473.            rep stosd
  474.            pop edi
  475.  
  476.            add edi, 0x00400000
  477.            cmp edi, esi
  478.            jb @B
  479.  
  480.            stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
  481. .grow:
  482.            pop edi
  483.            pop esi
  484. @@:
  485.            call alloc_page
  486.            test eax, eax
  487.            jz .exit
  488.            stdcall map_page,esi,eax,dword PG_UW
  489.  
  490.            push edi
  491.            mov edi, esi
  492.            xor eax, eax
  493.            mov ecx, 1024
  494.            cld
  495.            rep stosd
  496.            pop edi
  497.  
  498.            add esi, 0x1000
  499.            cmp esi, edi
  500.            jna @B
  501.  
  502.            jmp .update_size
  503. .exit:
  504.            xor eax, eax
  505.            inc eax
  506.            dec [pg_data.pg_mutex]
  507.            ret
  508. endp
  509.  
  510. align 4
  511. proc get_pg_addr stdcall, lin_addr:dword
  512.            mov ebx, [lin_addr]
  513.            shr ebx, 12
  514.            mov eax, [pages_tab+ebx*4]
  515.            and eax, 0xFFFFF000
  516.            ret
  517. endp
  518.  
  519. align 16
  520. proc page_fault_handler
  521.            pushad
  522.  
  523.            mov ebp, esp
  524.            mov eax, cr2
  525.            sub esp, 4
  526.            mov [esp], eax
  527.            push ds
  528.  
  529.            mov ax, 0x10
  530.            mov ds, ax
  531.  
  532. ;     mov edx, 0x400   ;bocsh
  533. ;     mov al,0xff      ;bocsh
  534. ;     out dx, al       ;bocsh
  535. ;     nop              ;bocsh fix
  536.  
  537.  
  538.            mov ebx, [ebp-4]
  539.  
  540.            cmp ebx, 0xe0000000
  541.            jae .lfb_addr
  542.  
  543.            cmp ebx, 0x60400000
  544.            jae .user_space
  545.  
  546.            cmp ebx, 0x60000000
  547.            jae .tab_space
  548.  
  549.            jmp .kernel_space
  550.  
  551. .user_space:
  552.            inc [pg_data.pages_faults]
  553.  
  554.            shr ebx, 12
  555.            mov eax, [pages_tab+ebx*4]
  556.  
  557.            shr ebx, 10
  558.            mov edx, [master_tab+ebx*4]
  559.  
  560.            test eax, 2
  561.            jz .exit
  562.  
  563.            call alloc_page
  564.            and eax, eax
  565.            jz .exit
  566.  
  567.            stdcall map_page,[ebp-4],eax,dword PG_UW
  568.  
  569.            mov esi, [ebp-4]
  570.            and esi, 0xFFFFF000
  571.            mov ecx, 1024
  572.            xor eax, eax
  573. @@:
  574.            mov [esi], eax
  575.            add esi, 4
  576.            dec ecx
  577.            jnz @B
  578. .exit:
  579.            pop ds
  580.            mov esp, ebp
  581.            popad
  582.            add esp, 4
  583.            iretd
  584.  
  585. .kernel_space:
  586.            shr ebx, 12
  587.            mov eax, [pages_tab+ebx*4]
  588.            shr ebx, 10
  589.            mov eax, [master_tab+ebx*4]
  590.  
  591.            pop ds
  592.            mov esp, ebp
  593.            popad
  594.            add esp, 4
  595.            iretd
  596.  
  597. .old_addr:
  598.            shr ebx, 12
  599. ;           mov eax, [pages_tab+ebx*4]
  600.            shr ebx, 10
  601.            mov eax, [master_tab+ebx*4]
  602.  
  603.            pop ds
  604.            mov esp, ebp
  605.            popad
  606.            add esp, 4
  607.            iretd
  608.  
  609. .lfb_addr:
  610.            shr ebx, 22
  611.            ;mov ecx, [sys_page_dir]
  612.            mov eax, [master_tab+ebx*4]
  613.  
  614.            pop ds
  615.            mov esp, ebp
  616.            popad
  617.            add esp, 4
  618.            iretd
  619.  
  620. .tab_space:
  621.            shr ebx, 12
  622. ;           mov eax, [pages_tab+ebx*4]
  623.            shr ebx, 10
  624.            ;mov ecx, [sys_page_dir]
  625.            mov eax, [master_tab+ebx*4]
  626.  
  627.            pop ds
  628.            mov esp, ebp
  629.            popad
  630.            add esp, 4
  631.            iretd
  632. endp
  633.  
  634. align 4
  635. proc map_mem stdcall, lin_addr:dword,pdir:dword,\
  636.                       ofs:dword,buf_size:dword
  637.            mov eax, [buf_size]
  638.            test eax, eax
  639.            jz .exit
  640.  
  641.            mov eax, [pdir]
  642.            and eax, 0xFFFFF000
  643.  
  644.            stdcall map_page,[ipc_pdir],eax,dword PG_UW
  645.            mov ebx, [ofs]
  646.            shr ebx, 22
  647.            mov esi, [ipc_pdir]
  648.            mov edi, [ipc_ptab]
  649.            mov eax, [esi+ebx*4]
  650.            and eax, 0xFFFFF000
  651.            test eax, eax
  652.            jz .exit
  653.            stdcall map_page,edi,eax,dword PG_UW
  654. ;           inc ebx
  655. ;           add edi, 0x1000
  656. ;           mov eax, [esi+ebx*4]
  657. ;           test eax, eax
  658. ;           jz @f
  659. ;          and eax, 0xFFFFF000
  660. ;           stdcall map_page, edi, eax
  661.  
  662. @@:        mov edi, [lin_addr]
  663.            and edi, 0xFFFFF000
  664.            mov ecx, [buf_size]
  665.            add ecx, 4095
  666.            shr ecx, 12
  667.            inc ecx
  668.  
  669.            mov edx, [ofs]
  670.            shr edx, 12
  671.            and edx, 0x3FF
  672.            mov esi, [ipc_ptab]
  673.  
  674. .map:      mov eax, [esi+edx*4]
  675.            and eax, 0xFFFFF000
  676.            test eax, eax
  677.            jz .exit
  678.            stdcall map_page,edi,eax,dword PG_UW
  679.            add edi, 0x1000
  680.            inc edx
  681.            dec ecx
  682.            jnz .map
  683.  
  684. .exit:
  685.            ret
  686. endp
  687.  
  688. align 4
  689. proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
  690.                         ofs:dword,buf_size:dword
  691.            mov eax, [buf_size]
  692.            test eax, eax
  693.            jz .exit
  694.  
  695.            mov eax, [pdir]
  696.            and eax, 0xFFFFF000
  697.  
  698.            stdcall map_page,[proc_mem_pdir],eax,dword PG_UW
  699.            mov ebx, [ofs]
  700.            shr ebx, 22
  701.            mov esi, [proc_mem_pdir]
  702.            mov edi, [proc_mem_tab]
  703.            mov eax, [esi+ebx*4]
  704.            and eax, 0xFFFFF000
  705.            test eax, eax
  706.            jz .exit
  707.            stdcall map_page,edi,eax,dword PG_UW
  708.  
  709. @@:        mov edi, [lin_addr]
  710.            and edi, 0xFFFFF000
  711.            mov ecx, [buf_size]
  712.            add ecx, 4095
  713.            shr ecx, 12
  714.            inc ecx
  715.  
  716.            mov edx, [ofs]
  717.            shr edx, 12
  718.            and edx, 0x3FF
  719.            mov esi, [proc_mem_tab]
  720.  
  721. .map:      mov eax, [esi+edx*4]
  722. ;           and eax, 0xFFFFF000
  723. ;           test eax, eax
  724. ;           jz .exit
  725.            stdcall map_page,edi,eax,dword PG_UW
  726.            add edi, 0x1000
  727.            inc edx
  728.            dec ecx
  729.            jnz .map
  730. .exit:
  731.            ret
  732. endp
  733.  
  734.  
  735.  
  736.  
  737. sys_IPC:
  738. ;input:
  739. ;  eax=1 - set ipc buffer area
  740. ;    ebx=address of buffer
  741. ;    ecx=size of buffer
  742. ;  eax=2 - send message
  743. ;    ebx=PID
  744. ;    ecx=address of message
  745. ;    edx=size of message
  746.  
  747.            cmp  eax,1
  748.            jne @f
  749.            call set_ipc_buff
  750.            mov [esp+36], eax
  751.            ret
  752.  
  753. @@:
  754.            cmp eax, 2
  755.            jne @f
  756.            stdcall sys_ipc_send, ebx, ecx, edx
  757.            mov [esp+36], eax
  758.            ret
  759.  
  760. @@:
  761.            xor eax, eax
  762.            not eax
  763.            mov [esp+36], eax
  764.            ret
  765.  
  766. align 4
  767. proc set_ipc_buff
  768.  
  769.            mov  eax,[CURRENT_TASK]
  770.            shl  eax,8
  771.            add  eax, PROC_BASE
  772.            pushf
  773.            cli
  774.            mov  [eax+0xA0],ebx     ;set fields in extended information area
  775.            mov  [eax+0xA4],ecx
  776.  
  777.            add ebx,  new_app_base
  778.            add ecx, ebx
  779.            add ecx, 4095
  780.            and ecx, not 4095
  781.  
  782. .touch:    mov eax, [ebx]
  783.            add ebx, 0x1000
  784.            cmp ebx, ecx
  785.            jna .touch
  786.  
  787.            popf
  788.            xor eax, eax
  789.            ret
  790. endp
  791.  
  792. proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
  793.            locals
  794.              dst_slot   dd ?
  795.              dst_offset dd ?
  796.              buf_size   dd ?
  797.            endl
  798.  
  799.            pushf
  800.            cli
  801.  
  802.            mov  eax, [PID]
  803.            call pid_to_slot
  804.            test eax,eax
  805.            jz   .no_pid
  806.  
  807.            mov [dst_slot], eax
  808.            shl  eax,8
  809.            mov  edi,[eax+PROC_BASE+0xa0]  ;is ipc area defined?
  810.            test edi,edi
  811.            jz   .no_ipc_area
  812.  
  813.            mov ebx, edi
  814.            add edi, new_app_base
  815.            and ebx, 0xFFF
  816.            mov [dst_offset], ebx
  817.  
  818.            mov esi, [eax+PROC_BASE+0xa4]
  819.            mov [buf_size], esi
  820.  
  821.            stdcall map_mem, [ipc_tmp], [PROC_BASE+eax+0xB8],\
  822.                              edi, esi
  823.  
  824.            mov edi, [dst_offset]
  825.            add edi, [ipc_tmp]
  826.            cmp dword [edi], 0
  827.            jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
  828.            mov ebx, dword [edi+4]
  829.            mov edx, ebx
  830.            add ebx, 8
  831.            add ebx, [msg_size]
  832.            cmp ebx, [buf_size]
  833.            ja .buffer_overflow         ;esi<0 - not enough memory in buffer
  834.            mov dword [edi+4], ebx
  835.            mov eax,[TASK_BASE]
  836.            mov eax, [eax+0x04]         ;eax - our PID
  837.            mov edi, [dst_offset]
  838.            add edi, [ipc_tmp]
  839.            add edi, edx
  840.            mov [edi], eax
  841.            mov ecx, [msg_size]
  842.  
  843.            mov [edi+4], ecx
  844.            add edi, 8
  845.            mov esi, [msg_addr]
  846.            add esi, new_app_base
  847.            cld
  848.            rep movsb
  849.  
  850.            mov ebx, [ipc_tmp]
  851.            mov edx, ebx
  852.            shr ebx, 12
  853.            xor eax, eax
  854.            mov [pages_tab+ebx*4], eax
  855.            invlpg [edx]
  856.  
  857.            mov ebx, [ipc_pdir]
  858.            mov edx, ebx
  859.            shr ebx, 12
  860.            xor eax, eax
  861.            mov [pages_tab+ebx*4], eax
  862.            invlpg [edx]
  863.  
  864.            mov ebx, [ipc_ptab]
  865.            mov edx, ebx
  866.            shr ebx, 12
  867.            xor eax, eax
  868.            mov [pages_tab+ebx*4], eax
  869.            invlpg [edx]
  870.  
  871.            mov  eax, [dst_slot]
  872.            shl eax, 8
  873.            or   [eax+PROC_BASE+0xA8],dword 0x40
  874.            cmp  dword [check_idle_semaphore],20
  875.            jge  .ipc_no_cis
  876.  
  877.            mov  dword [check_idle_semaphore],5
  878. .ipc_no_cis:
  879.            popf
  880.            xor eax, eax
  881.            ret
  882. .no_pid:
  883.            popf
  884.            mov  eax, 4
  885.            ret
  886. .no_ipc_area:
  887.            popf
  888.            xor eax, eax
  889.            inc eax
  890.            ret
  891. .ipc_blocked:
  892.            popf
  893.            mov  eax, 2
  894.            ret
  895. .buffer_overflow:
  896.            popf
  897.            mov  eax, 3
  898.            ret
  899. endp
  900.  
  901. align 4
  902. sysfn_meminfo:
  903.  
  904.            add ebx, new_app_base
  905.            mov eax, [pg_data.pages_count]
  906.            mov [ebx], eax
  907.            mov ecx, [pg_data.pages_free]
  908.            mov [ebx+4], ecx
  909.            mov edx, [pg_data.pages_faults]
  910.            mov [ebx+8], edx
  911.            mov esi, [heap_size]
  912.            mov [ebx+12], esi
  913.            mov edi, [heap_free]
  914.            mov [ebx+16], edi
  915.            mov eax, [heap_blocks]
  916.            mov [ebx+20], eax
  917.            mov ecx, [free_blocks]
  918.            mov [ebx+24], ecx
  919.  
  920.            ret
  921.  
  922. align 4
  923. new_services:
  924.  
  925.            cmp  eax,4
  926.            jle  sys_sheduler
  927.  
  928.            cmp eax, 11
  929.            jb .fail
  930.            ja @f
  931.  
  932. ;           add ebx, new_app_base
  933. ;           stdcall get_mem_info, ebx
  934. ;           mov [esp+36], eax
  935. ;           ret
  936. ;@@:
  937. ;           cmp eax, 11
  938. ;           ja @f
  939.  
  940.            stdcall init_heap, ebx
  941.            mov [esp+36], eax
  942.            ret
  943. @@:
  944.            cmp eax, 12
  945.            ja @f
  946.  
  947.            stdcall user_alloc, ebx
  948.            mov [esp+36], eax
  949.            ret
  950. @@:
  951.            cmp eax, 13
  952.            ja @f
  953.  
  954.            stdcall user_free, ebx
  955.            mov [esp+36], eax
  956.            ret
  957. @@:
  958.            cmp eax, 14
  959.            ja @f
  960.            add ebx,new_app_base
  961.            stdcall get_notify, ebx
  962.            ret
  963. @@:
  964.            cmp eax, 15
  965.            ja @f
  966.            mov ecx, [CURRENT_TASK]
  967.            shl ecx, 8
  968.            mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler]
  969.            mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx
  970.            mov [esp+36], eax
  971.            ret
  972. @@:
  973.            cmp eax, 16
  974.            ja @f
  975.  
  976.            add ebx, new_app_base
  977.            stdcall get_service, ebx
  978.            mov [esp+36], eax
  979.            ret
  980. @@:
  981.            cmp eax, 17
  982.            ja @f
  983.            stdcall srv_handlerEx, ebx
  984.            mov [esp+36], eax
  985.            ret
  986. @@:
  987.            cmp eax, 18
  988.            ja @f
  989.            mov ecx, [CURRENT_TASK]
  990.            shl ecx, 8
  991.            mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
  992.            mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
  993.            mov [esp+36], eax
  994.            ret
  995.  
  996. @@:
  997. .fail:
  998.            xor eax, eax
  999.            mov [esp+36], eax
  1000.            ret
  1001.  
  1002.  
  1003. align 4
  1004. proc strncmp stdcall, str1:dword, str2:dword, count:dword
  1005.  
  1006.           mov ecx,[count]
  1007.           jecxz .end
  1008.  
  1009.           mov ebx,ecx
  1010.  
  1011.           mov edi,[str1]
  1012.           mov esi,edi
  1013.           xor eax,eax
  1014.           repne scasb
  1015.           neg ecx             ; cx = count - strlen
  1016.           add ecx,ebx         ; strlen + count - strlen
  1017.  
  1018. .okay:
  1019.           mov edi,esi
  1020.           mov esi,[str2]
  1021.           repe cmpsb
  1022.           mov al,[esi-1]
  1023.           xor ecx,ecx
  1024.  
  1025.           cmp al,[edi-1]
  1026.           ja .str2_big
  1027.           je .end
  1028.  
  1029. .str1_big:
  1030.           sub ecx,2
  1031.  
  1032. .str2_big:
  1033.           not ecx
  1034. .end:
  1035.           mov eax,ecx
  1036.           ret
  1037. endp
  1038.  
  1039. align 4
  1040. proc fpu_save
  1041.            clts
  1042.            mov ebx, [fpu_owner]
  1043.            shl ebx, 8
  1044.            mov eax, [ebx+PROC_BASE+0x10]
  1045.            mov ebx, [CURRENT_TASK]
  1046.            mov [fpu_owner], ebx
  1047.  
  1048.            bt [cpu_caps], CAPS_FXSR
  1049.            jnc .no_SSE
  1050.  
  1051.            fxsave [eax]
  1052.            ret
  1053. .no_SSE:
  1054.            fnsave [eax]
  1055.            ret
  1056. endp
  1057.  
  1058. align 4
  1059. proc fpu_restore
  1060.            mov ebx, [CURRENT_TASK]
  1061.            shl ebx, 8
  1062.            mov eax, [ebx+PROC_BASE+0x10]
  1063.            bt [cpu_caps], CAPS_FXSR
  1064.            jnc .no_SSE
  1065.  
  1066.            fxrstor [eax]
  1067.            ret
  1068. .no_SSE:
  1069.            frstor [eax]
  1070.            ret
  1071. endp
  1072.  
  1073. align 4
  1074. proc test_cpu
  1075.            locals
  1076.               cpu_type   dd ?
  1077.               cpu_id     dd ?
  1078.               cpu_Intel  dd ?
  1079.               cpu_AMD    dd ?
  1080.            endl
  1081.  
  1082.            mov [cpu_type], 0
  1083.  
  1084.            pushfd
  1085.            pop eax
  1086.            mov ecx, eax
  1087.            xor eax, 0x40000
  1088.            push eax
  1089.            popfd
  1090.            pushfd
  1091.            pop eax
  1092.            xor eax, ecx
  1093.            mov [cpu_type], CPU_386
  1094.            jz .end_cpu
  1095.            push ecx
  1096.            popfd
  1097.  
  1098.            mov [cpu_type], CPU_486
  1099.            mov eax, ecx
  1100.            xor eax, 0x200000
  1101.            push eax
  1102.            popfd
  1103.            pushfd
  1104.            pop eax
  1105.            xor eax, ecx
  1106.            je .end_cpu
  1107.            mov [cpu_id], 1
  1108.  
  1109.            xor eax, eax
  1110.            cpuid
  1111.            mov [cpu_vendor], ebx
  1112.            mov [cpu_vendor+4], edx
  1113.            mov [cpu_vendor+8], ecx
  1114.            cmp ebx, dword [intel_str]
  1115.            jne .check_AMD
  1116.            cmp edx, dword [intel_str+4]
  1117.            jne .check_AMD
  1118.            cmp ecx, dword [intel_str+8]
  1119.            jne .check_AMD
  1120.            mov [cpu_Intel], 1
  1121.            cmp eax, 1
  1122.            jl .end_cpuid
  1123.            mov eax, 1
  1124.            cpuid
  1125.            mov [cpu_sign], eax
  1126.            mov [cpu_info],  ebx
  1127.            mov [cpu_caps],  edx
  1128.            mov [cpu_caps+4],ecx
  1129.  
  1130.            shr eax, 8
  1131.            and eax, 0x0f
  1132.            mov [cpu_type], eax
  1133.            ret
  1134.  
  1135. .end_cpuid:
  1136.            mov eax, [cpu_type]
  1137.            ret
  1138.  
  1139. .check_AMD:
  1140.            cmp ebx, dword [AMD_str]
  1141.            jne .end_cpu
  1142.            cmp edx, dword [AMD_str+4]
  1143.            jne .end_cpu
  1144.            cmp ecx, dword [AMD_str+8]
  1145.            jne .end_cpu
  1146.            mov [cpu_AMD], 1
  1147.            cmp eax, 1
  1148.            jl .end_cpuid
  1149.            mov eax, 1
  1150.            cpuid
  1151.            mov [cpu_sign], eax
  1152.            mov [cpu_info],  ebx
  1153.            mov [cpu_caps],  edx
  1154.            mov [cpu_caps+4],ecx
  1155.            shr eax, 8
  1156.            and eax, 0x0f
  1157.            mov [cpu_type], eax
  1158. .end_cpu:
  1159.            mov eax, [cpu_type]
  1160.            ret
  1161. endp
  1162.  
  1163. MEM_WB     equ 6               ;write-back memory
  1164. MEM_WC     equ 1               ;write combined memory
  1165. MEM_UC     equ 0               ;uncached memory
  1166.  
  1167. align 4
  1168. proc init_mtrr
  1169.  
  1170.            cmp [0x2f0000+0x901c],byte 2
  1171.            je  .exit
  1172.  
  1173.            mov eax, cr0
  1174.            or eax, 0x60000000   ;disable caching
  1175.            mov cr0, eax
  1176.            wbinvd               ;invalidate cache
  1177.  
  1178.            mov ecx, 0x2FF
  1179.            rdmsr                ;
  1180.            push eax
  1181.  
  1182.            xor edx, edx
  1183.            xor eax, eax
  1184.            mov ecx, 0x2FF
  1185.            wrmsr                ;disable all MTRR
  1186.  
  1187.            stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB
  1188.            stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
  1189.            xor edx, edx
  1190.            xor eax, eax
  1191.            mov ecx, 0x204
  1192.            mov ebx, 6
  1193. @@:
  1194.            wrmsr                ;disable unused MTRR
  1195.            inc ecx
  1196.            wrmsr
  1197.            inc ecx
  1198.            dec ebx
  1199.            jnz @b
  1200.  
  1201.            wbinvd               ;again invalidate
  1202.  
  1203.            pop eax
  1204.            or eax, 0x800        ;set default memtype to UC
  1205.            and al, 0xF0
  1206.            mov ecx, 0x2FF
  1207.            wrmsr                ;and enable MTRR
  1208.  
  1209.            mov eax, cr0
  1210.            and eax, not 0x60000000
  1211.            mov cr0, eax         ; enable caching
  1212. .exit:
  1213.            ret
  1214. endp
  1215.  
  1216. align 4
  1217. proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
  1218.  
  1219.            xor edx, edx
  1220.            mov eax, [base]
  1221.            or eax, [mem_type]
  1222.            mov ecx, [reg]
  1223.            lea ecx, [0x200+ecx*2]
  1224.            wrmsr
  1225.  
  1226.            mov ebx, [size]
  1227.            dec ebx
  1228.            mov eax, 0xFFFFFFFF
  1229.            mov edx, 0x0000000F
  1230.            sub eax, ebx
  1231.            sbb edx, 0
  1232.            or eax, 0x800
  1233.            inc ecx
  1234.            wrmsr
  1235.            ret
  1236. endp
  1237.  
  1238. iglobal
  1239. align 4
  1240.   intel_str    db "GenuineIntel",0
  1241.   AMD_str      db "AuthenticAMD",0
  1242. endg
  1243.  
  1244. uglobal
  1245. align 16
  1246.   irq_tab           rd 16
  1247.  
  1248.  
  1249.   MEM_FreeSpace     rd 1
  1250.  
  1251.   ipc_tmp           rd 1
  1252.   ipc_pdir          rd 1
  1253.   ipc_ptab          rd 1
  1254.  
  1255.   proc_mem_map      rd 1
  1256.   proc_mem_pdir     rd 1
  1257.   proc_mem_tab      rd 1
  1258.  
  1259.   tmp_task_pdir     rd 1
  1260.   tmp_task_ptab     rd 1
  1261.   tmp_task_data     rd 1
  1262.  
  1263.   current_pdir      rd 1
  1264.  
  1265.   fpu_data          rd 1
  1266.   fdd_buff          rd 1
  1267.  
  1268. ;;CPUID information
  1269.  
  1270.   cpu_vendor        rd 3
  1271.   cpu_sign          rd 1
  1272.   cpu_info          rd 1
  1273.  
  1274. endg
  1275.  
  1276. uglobal
  1277. align 16
  1278.    dll_tab         rb 32*32
  1279.    srv_tab         rb 32*32
  1280.    dll_map         rd 1
  1281.    srv_map         rd 1
  1282.  
  1283.    mem_used_list   rd 1
  1284.    mem_block_list  rd 64
  1285.    mem_block_map   rb 512
  1286.    mem_block_arr   rd 1
  1287.    mem_block_start rd 1
  1288.    mem_block_end   rd 1
  1289.    mem_block_mask  rd 2
  1290.    heap_size       rd 1
  1291.    heap_free       rd 1
  1292.    heap_blocks     rd 1
  1293.    free_blocks     rd 1
  1294.  
  1295.    page_start      rd 1
  1296.    page_end        rd 1
  1297.    sys_page_map    rd 1
  1298. ;   app_load        rd 1
  1299. endg
  1300.  
  1301.  
  1302. ;     push eax
  1303. ;     push edx
  1304. ;     mov edx, 0x400   ;bocsh
  1305. ;     mov al,0xff      ;bocsh
  1306. ;     out dx, al       ;bocsh
  1307. ;     pop edx
  1308. ;     pop eax
  1309.  
  1310.