Subversion Repositories Kolibri OS

Rev

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

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