Subversion Repositories Kolibri OS

Rev

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