Subversion Repositories Kolibri OS

Rev

Rev 276 | Rev 279 | 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.  
  7.            mov eax, cr0
  8.            and eax, not (CR0_CD+CR0_NW)
  9.            or eax, CR0_CD         ;disable caching
  10.            mov cr0, eax
  11.            wbinvd                 ;invalidate cache
  12.  
  13.            xor edi, edi
  14.            mov ebx, 'TEST'
  15. @@:
  16.            add edi, 0x400000
  17.            xchg ebx, dword [edi]
  18.            cmp dword [edi], 'TEST'
  19.            xchg ebx, dword [edi]
  20.            je @b
  21.  
  22.            and eax, not (CR0_CD+CR0_NW)  ;enable caching
  23.            mov cr0, eax
  24.            mov eax, edi
  25.            mov [LFBSize], 0x00800000
  26.            ret
  27. endp
  28.  
  29. align 4
  30. proc init_memEx
  31.            xor eax, eax
  32.            mov edi, sys_pgdir
  33.            mov ecx, 2048
  34.            rep stosd
  35.  
  36.            bt [cpu_caps], CAPS_PSE
  37.            jnc .no_PSE
  38.  
  39.            mov ebx, cr4
  40.            or ebx, CR4_PSE
  41.            mov eax, PG_LARGE+PG_SW
  42.            bt [cpu_caps], CAPS_PGE
  43.            jnc @F
  44.            or eax, PG_GLOBAL
  45.            or ebx, CR4_PGE
  46. @@:
  47.            mov cr4, ebx
  48.  
  49.            mov dword [sys_pgdir], eax
  50.            add eax, 0x00400000
  51.            mov dword [sys_pgdir+4], eax
  52.            add eax, 0x00400000
  53.            mov dword [sys_pgdir+8], 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.            lea eax, [eax+ebx*8]
  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.            mov dword [exp_lfb+4], esi
  309.  
  310.            shr edi, 12
  311.            mov [pg_count], edi
  312.            shr edi, 10
  313.  
  314.            bt [cpu_caps], CAPS_PSE
  315.            jnc .map_page_tables
  316.            mov ebx, esi
  317.            or esi, PG_LARGE+PG_UW
  318.            shr ebx, 20
  319.            mov ecx, ebx
  320. @@:
  321.            mov [sys_pgdir+ebx], esi
  322.            add ebx, 4
  323.            add esi, 0x00400000
  324.            dec edi
  325.            jnz @B
  326.  
  327.            bt [cpu_caps], CAPS_PGE
  328.            jnc @F
  329.            or dword [sys_pgdir+ecx], PG_GLOBAL
  330. @@:
  331.            mov eax, cr3       ;flush TLB
  332.            mov cr3, eax
  333.            ret
  334.  
  335. .map_page_tables:
  336.  
  337. @@:
  338.            call alloc_page
  339.            stdcall map_page_table, esi, eax
  340.            add esi, 0x00400000
  341.            dec edi
  342.            jnz @B
  343.  
  344.            mov eax, [LFBAddress]
  345.            mov esi, eax
  346.            shr esi, 10
  347.            add esi, pages_tab
  348.            or eax, PG_UW
  349.            mov ecx, [pg_count]
  350.            shr ecx, 2
  351. .map:
  352.            mov [esi], eax
  353.            add eax, 0x1000
  354.            mov [esi+4], eax
  355.            add eax, 0x1000
  356.            mov [esi+8], eax
  357.            add eax, 0x1000
  358.            mov [esi+12], eax
  359.            add eax, 0x1000
  360.            add esi, 16
  361.            sub ecx, 1
  362.            jnz .map
  363.  
  364.            mov eax, cr3       ;flush TLB
  365.            mov cr3, eax
  366.  
  367.            ret
  368. endp
  369.  
  370. align 4
  371. proc new_mem_resize stdcall, new_size:dword
  372.  
  373.            mov ebx, pg_data.pg_mutex
  374.            call wait_mutex    ;ebx
  375.  
  376.            mov edi, [new_size]
  377.            add edi,4095
  378.            and edi,not 4095
  379.            mov [new_size], edi
  380.  
  381.            mov edx,[CURRENT_TASK]
  382.            shl edx,8
  383.            cmp [PROC_BASE+APPDATA.heap_base+edx],0
  384.            jne .exit
  385.  
  386.            mov esi, [PROC_BASE+APPDATA.mem_size+edx]
  387.            add esi, 4095
  388.            and esi, not 4095
  389.  
  390.            cmp edi, esi
  391.            jae .expand
  392.  
  393.            shr edi, 12
  394.            shr esi, 12
  395. @@:
  396.            mov eax, [pages_tab+0x00181000+edi*4]
  397.            test eax, 1
  398.            jz .next
  399.            mov dword [pages_tab+0x00181000+edi*4], 2
  400.            mov ebx, edi
  401.            shl ebx, 12
  402.            invlpg [ebx+std_application_base_address]
  403.            call free_page
  404.  
  405. .next:     add edi, 1
  406.            cmp edi, esi
  407.            jb @B
  408.  
  409. .update_size:
  410.  
  411.            mov ebx, [new_size]
  412.            mov    [PROC_BASE+0x8c+edx],ebx
  413.  
  414. ;search threads and update
  415. ;application memory size infomation
  416.            mov    ecx,[PROC_BASE+0xb8+edx]
  417.            mov    eax,2
  418.  
  419. .search_threads:
  420. ;eax = current slot
  421. ;ebx = new memory size
  422. ;ecx = page directory
  423.            cmp    eax,[TASK_COUNT]
  424.            jg     .search_threads_end
  425.            mov    edx,eax
  426.            shl    edx,5
  427.            cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
  428.            jz     .search_threads_next
  429.            shl    edx,3
  430.            cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
  431.            jnz    .search_threads_next
  432.            mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
  433. .search_threads_next:
  434.            inc    eax
  435.            jmp    .search_threads
  436. .search_threads_end:
  437.            xor eax, eax
  438.            dec [pg_data.pg_mutex]
  439.            ret
  440.  
  441. .expand:
  442.            add edi, new_app_base
  443.            add esi, new_app_base
  444.  
  445.            push esi
  446.            push edi
  447.  
  448.            add edi, 0x3FFFFF
  449.            and edi, not(0x3FFFFF)
  450.            add esi, 0x3FFFFF
  451.            and esi, not(0x3FFFFF)
  452.  
  453.            cmp esi, edi
  454.            jae .grow
  455.  
  456.            xchg esi, edi
  457.  
  458. @@:
  459.            call alloc_page
  460.            test eax, eax
  461.            jz .exit
  462.  
  463.            stdcall map_page_table, edi, eax
  464.  
  465.            push edi
  466.            shr edi, 10
  467.            add edi, pages_tab
  468.            mov ecx, 1024
  469.            xor eax, eax
  470.            cld
  471.            rep stosd
  472.            pop edi
  473.  
  474.            add edi, 0x00400000
  475.            cmp edi, esi
  476.            jb @B
  477. .grow:
  478.            pop edi
  479.            pop esi
  480. @@:
  481.            call alloc_page
  482.            test eax, eax
  483.            jz .exit
  484.            stdcall map_page,esi,eax,dword PG_UW
  485.  
  486.            push edi
  487.            mov edi, esi
  488.            xor eax, eax
  489.            mov ecx, 1024
  490.            cld
  491.            rep stosd
  492.            pop edi
  493.  
  494.            add esi, 0x1000
  495.            cmp esi, edi
  496.            jna @B
  497.  
  498.            jmp .update_size
  499. .exit:
  500.            xor eax, eax
  501.            inc eax
  502.            dec [pg_data.pg_mutex]
  503.            ret
  504. endp
  505.  
  506. align 4
  507. proc get_pg_addr stdcall, lin_addr:dword
  508.            mov ebx, [lin_addr]
  509.            shr ebx, 12
  510.            mov eax, [pages_tab+ebx*4]
  511.            and eax, 0xFFFFF000
  512.            ret
  513. endp
  514.  
  515. align 4
  516. proc page_fault_handler
  517.            pushad
  518.  
  519.            mov ebp, esp
  520.            mov eax, cr2
  521.            push eax
  522.            push ds
  523.            push es
  524.  
  525.            mov ax, 0x10
  526.            mov ds, ax
  527.            mov es, ax
  528.  
  529.            inc [pg_data.pages_faults]
  530.  
  531.            mov ebx, [ebp-4]
  532.  
  533.            cmp ebx, 0xe0000000
  534.            jae .lfb_addr
  535.  
  536.            cmp ebx, 0x60400000
  537.            jae .user_space
  538.  
  539.            cmp ebx, master_tab+0x1000
  540.            jae .alloc
  541.  
  542.            cmp ebx, 0x60000000
  543.            jae .tab_space
  544.  
  545.            jmp .kernel_space
  546.  
  547. .user_space:
  548.            shr ebx, 12
  549.            mov ecx, ebx
  550.            shr ecx, 10
  551.            mov edx, [master_tab+ecx*4]
  552.            test edx, 1
  553.            jz .fail
  554.  
  555.            mov eax, [pages_tab+ebx*4]
  556.            test eax, 2
  557.            jz .fail
  558. .alloc:
  559.            call alloc_page
  560.            and eax, eax
  561.            jz .exit
  562.  
  563.            stdcall map_page,[ebp-4],eax,dword PG_UW
  564.  
  565.            mov edi, [ebp-4]
  566.            and edi, 0xFFFFF000
  567.            mov ecx, 1024
  568.            xor eax, eax
  569.            cld
  570.            rep stosd
  571. .exit:
  572.            pop es
  573.            pop ds
  574.            mov esp, ebp
  575.            popad
  576.            add esp, 4
  577.            iretd
  578. .fail:
  579.            pop es
  580.            pop ds
  581.            mov esp, ebp
  582.            popad
  583.            add esp, 4
  584.  
  585.            save_ring3_context     ;debugger support
  586.  
  587.            mov bl, 14
  588.            jmp exc_c
  589.            iretd
  590.  
  591. .kernel_space:
  592. ;           shr ebx, 12
  593. ;           mov eax, [pages_tab+ebx*4]
  594. ;           shr ebx, 10
  595. ;           mov eax, [master_tab+ebx*4]
  596.            jmp .exit
  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.            jmp .exit
  603. .lfb_addr:
  604. ;           shr ebx, 22
  605. ;           ;mov ecx, [sys_page_dir]
  606. ;           mov eax, [master_tab+ebx*4]
  607.            jmp .exit
  608. .tab_space:
  609. ;           shr ebx, 12
  610. ;           mov eax, [pages_tab+ebx*4]
  611. ;           shr ebx, 10
  612. ;           ;mov ecx, [sys_page_dir]
  613. ;           mov eax, [master_tab+ebx*4]
  614.            jmp .exit
  615. endp
  616.  
  617. align 4
  618. proc map_mem stdcall, lin_addr:dword,pdir:dword,\
  619.                       ofs:dword,buf_size:dword
  620.            mov eax, [buf_size]
  621.            test eax, eax
  622.            jz .exit
  623.  
  624.            mov eax, [pdir]
  625.            and eax, 0xFFFFF000
  626.  
  627.            stdcall map_page,[ipc_pdir],eax,dword PG_UW
  628.            mov ebx, [ofs]
  629.            shr ebx, 22
  630.            mov esi, [ipc_pdir]
  631.            mov edi, [ipc_ptab]
  632.            mov eax, [esi+ebx*4]
  633.            and eax, 0xFFFFF000
  634.            test eax, eax
  635.            jz .exit
  636.            stdcall map_page,edi,eax,dword PG_UW
  637. ;           inc ebx
  638. ;           add edi, 0x1000
  639. ;           mov eax, [esi+ebx*4]
  640. ;           test eax, eax
  641. ;           jz @f
  642. ;          and eax, 0xFFFFF000
  643. ;           stdcall map_page, edi, eax
  644.  
  645. @@:        mov edi, [lin_addr]
  646.            and edi, 0xFFFFF000
  647.            mov ecx, [buf_size]
  648.            add ecx, 4095
  649.            shr ecx, 12
  650.            inc ecx
  651.  
  652.            mov edx, [ofs]
  653.            shr edx, 12
  654.            and edx, 0x3FF
  655.            mov esi, [ipc_ptab]
  656.  
  657. .map:      mov eax, [esi+edx*4]
  658.            and eax, 0xFFFFF000
  659.            test eax, eax
  660.            jz .exit
  661.            stdcall map_page,edi,eax,dword PG_UW
  662.            add edi, 0x1000
  663.            inc edx
  664.            dec ecx
  665.            jnz .map
  666.  
  667. .exit:
  668.            ret
  669. endp
  670.  
  671. align 4
  672. proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
  673.                         ofs:dword,buf_size:dword
  674.            mov eax, [buf_size]
  675.            test eax, eax
  676.            jz .exit
  677.  
  678.            mov eax, [pdir]
  679.            and eax, 0xFFFFF000
  680.  
  681.            stdcall map_page,[proc_mem_pdir],eax,dword PG_UW
  682.            mov ebx, [ofs]
  683.            shr ebx, 22
  684.            mov esi, [proc_mem_pdir]
  685.            mov edi, [proc_mem_tab]
  686.            mov eax, [esi+ebx*4]
  687.            and eax, 0xFFFFF000
  688.            test eax, eax
  689.            jz .exit
  690.            stdcall map_page,edi,eax,dword PG_UW
  691.  
  692. @@:        mov edi, [lin_addr]
  693.            and edi, 0xFFFFF000
  694.            mov ecx, [buf_size]
  695.            add ecx, 4095
  696.            shr ecx, 12
  697.            inc ecx
  698.  
  699.            mov edx, [ofs]
  700.            shr edx, 12
  701.            and edx, 0x3FF
  702.            mov esi, [proc_mem_tab]
  703.  
  704. .map:      mov eax, [esi+edx*4]
  705. ;           and eax, 0xFFFFF000
  706. ;           test eax, eax
  707. ;           jz .exit
  708.            stdcall map_page,edi,eax,dword PG_UW
  709.            add edi, 0x1000
  710.            inc edx
  711.            dec ecx
  712.            jnz .map
  713. .exit:
  714.            ret
  715. endp
  716.  
  717.  
  718.  
  719.  
  720. sys_IPC:
  721. ;input:
  722. ;  eax=1 - set ipc buffer area
  723. ;    ebx=address of buffer
  724. ;    ecx=size of buffer
  725. ;  eax=2 - send message
  726. ;    ebx=PID
  727. ;    ecx=address of message
  728. ;    edx=size of message
  729.  
  730.            cmp  eax,1
  731.            jne @f
  732.            call set_ipc_buff
  733.            mov [esp+36], eax
  734.            ret
  735. @@:
  736.            cmp eax, 2
  737.            jne @f
  738.            stdcall sys_ipc_send, ebx, ecx, edx
  739.            mov [esp+36], eax
  740.            ret
  741. @@:
  742.            xor eax, eax
  743.            not eax
  744.            mov [esp+36], eax
  745.            ret
  746.  
  747. align 4
  748. proc set_ipc_buff
  749.  
  750.            mov  eax,[CURRENT_TASK]
  751.            shl  eax,8
  752.            add  eax, PROC_BASE
  753.            pushf
  754.            cli
  755.            mov  [eax+0xA0],ebx     ;set fields in extended information area
  756.            mov  [eax+0xA4],ecx
  757.  
  758.            add ebx,  new_app_base
  759.            add ecx, ebx
  760.            add ecx, 4095
  761.            and ecx, not 4095
  762.  
  763. .touch:    mov eax, [ebx]
  764.            add ebx, 0x1000
  765.            cmp ebx, ecx
  766.            jna .touch
  767.  
  768.            popf
  769.            xor eax, eax
  770.            ret
  771. endp
  772.  
  773. proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
  774.            locals
  775.              dst_slot   dd ?
  776.              dst_offset dd ?
  777.              buf_size   dd ?
  778.            endl
  779.  
  780.            pushf
  781.            cli
  782.  
  783.            mov  eax, [PID]
  784.            call pid_to_slot
  785.            test eax,eax
  786.            jz   .no_pid
  787.  
  788.            mov [dst_slot], eax
  789.            shl  eax,8
  790.            mov  edi,[eax+PROC_BASE+0xa0]  ;is ipc area defined?
  791.            test edi,edi
  792.            jz   .no_ipc_area
  793.  
  794.            mov ebx, edi
  795.            add edi, new_app_base
  796.            and ebx, 0xFFF
  797.            mov [dst_offset], ebx
  798.  
  799.            mov esi, [eax+PROC_BASE+0xa4]
  800.            mov [buf_size], esi
  801.  
  802.            stdcall map_mem, [ipc_tmp], [PROC_BASE+eax+0xB8],\
  803.                              edi, esi
  804.  
  805.            mov edi, [dst_offset]
  806.            add edi, [ipc_tmp]
  807.            cmp dword [edi], 0
  808.            jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
  809.  
  810.            mov ebx, dword [edi+4]
  811.            mov edx, ebx
  812.            add ebx, 8
  813.            add ebx, [msg_size]
  814.            cmp ebx, [buf_size]
  815.            ja .buffer_overflow         ;esi<0 - not enough memory in buffer
  816.  
  817.            mov dword [edi+4], ebx
  818.            mov eax,[TASK_BASE]
  819.            mov eax, [eax+0x04]         ;eax - our PID
  820.            mov edi, [dst_offset]
  821.            add edi, [ipc_tmp]
  822.            add edi, edx
  823.            mov [edi], eax
  824.            mov ecx, [msg_size]
  825.  
  826.            mov [edi+4], ecx
  827.            add edi, 8
  828.            mov esi, [msg_addr]
  829.            add esi, new_app_base
  830.            cld
  831.            rep movsb
  832.  
  833.            mov ebx, [ipc_tmp]
  834.            mov edx, ebx
  835.            shr ebx, 12
  836.            xor eax, eax
  837.            mov [pages_tab+ebx*4], eax
  838.            invlpg [edx]
  839.  
  840.            mov ebx, [ipc_pdir]
  841.            mov edx, ebx
  842.            shr ebx, 12
  843.            xor eax, eax
  844.            mov [pages_tab+ebx*4], eax
  845.            invlpg [edx]
  846.  
  847.            mov ebx, [ipc_ptab]
  848.            mov edx, ebx
  849.            shr ebx, 12
  850.            xor eax, eax
  851.            mov [pages_tab+ebx*4], eax
  852.            invlpg [edx]
  853.  
  854.            mov  eax, [dst_slot]
  855.            shl eax, 8
  856.            or   [eax+PROC_BASE+0xA8],dword 0x40
  857.            cmp  dword [check_idle_semaphore],20
  858.            jge  .ipc_no_cis
  859.  
  860.            mov  dword [check_idle_semaphore],5
  861. .ipc_no_cis:
  862.            popf
  863.            xor eax, eax
  864.            ret
  865. .no_pid:
  866.            popf
  867.            mov  eax, 4
  868.            ret
  869. .no_ipc_area:
  870.            popf
  871.            xor eax, eax
  872.            inc eax
  873.            ret
  874. .ipc_blocked:
  875.            popf
  876.            mov  eax, 2
  877.            ret
  878. .buffer_overflow:
  879.            popf
  880.            mov  eax, 3
  881.            ret
  882. endp
  883.  
  884. align 4
  885. sysfn_meminfo:
  886.  
  887.            add ebx, new_app_base
  888.            cmp ebx, new_app_base
  889.            jb .fail
  890.  
  891.            mov eax, [pg_data.pages_count]
  892.            mov [ebx], eax
  893.            shl eax, 12
  894.            mov [esp+36], eax
  895.            mov ecx, [pg_data.pages_free]
  896.            mov [ebx+4], ecx
  897.            mov edx, [pg_data.pages_faults]
  898.            mov [ebx+8], edx
  899.            mov esi, [heap_size]
  900.            mov [ebx+12], esi
  901.            mov edi, [heap_free]
  902.            mov [ebx+16], edi
  903.            mov eax, [heap_blocks]
  904.            mov [ebx+20], eax
  905.            mov ecx, [free_blocks]
  906.            mov [ebx+24], ecx
  907.            ret
  908. .fail:
  909.            mov dword [esp+36], -1
  910.            ret
  911.  
  912. align 4
  913. new_services:
  914.  
  915.            cmp  eax,4
  916.            jle  sys_sheduler
  917.  
  918.            cmp eax, 11
  919.            jb .fail
  920.            ja @f
  921.  
  922.            call init_heap
  923.            mov [esp+36], eax
  924.            ret
  925. @@:
  926.            cmp eax, 12
  927.            ja @f
  928.  
  929.            stdcall user_alloc, ebx
  930.            mov [esp+36], eax
  931.            ret
  932. @@:
  933.            cmp eax, 13
  934.            ja @f
  935.            add ebx, new_app_base
  936.            stdcall user_free, ebx
  937.            mov [esp+36], eax
  938.            ret
  939. @@:
  940.            cmp eax, 14
  941.            ja @f
  942.            add ebx, new_app_base
  943.            cmp ebx, new_app_base
  944.            jb .fail
  945.            stdcall get_event_ex, ebx, ecx
  946.            mov [esp+36], eax
  947.            ret
  948. @@:
  949.            cmp eax, 15
  950.            ja @f
  951.            mov ecx, [CURRENT_TASK]
  952.            shl ecx, 8
  953.            mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler]
  954.            mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx
  955.            mov [esp+36], eax
  956.            ret
  957. @@:
  958.            cmp eax, 16
  959.            ja @f
  960.  
  961.            test ebx, ebx
  962.            jz .fail
  963.            add ebx, new_app_base
  964.            cmp ebx, new_app_base
  965.            jb .fail
  966.            stdcall get_service, ebx
  967.            mov [esp+36], eax
  968.            ret
  969. @@:
  970.            cmp eax, 17
  971.            ja @f
  972.            stdcall srv_handlerEx, ebx
  973.            mov [esp+36], eax
  974.            ret
  975. @@:
  976.            cmp eax, 18
  977.            ja @f
  978.            mov ecx, [CURRENT_TASK]
  979.            shl ecx, 8
  980.            mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
  981.            mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
  982.            mov [esp+36], eax
  983.            ret
  984. @@:
  985.            cmp eax, 19
  986.            ja .fail
  987.            add ebx, new_app_base
  988.            cmp ebx, new_app_base
  989.            jb .fail
  990.            stdcall load_library, ebx
  991.            mov [esp+36], eax
  992.            ret
  993.  
  994. .fail:
  995.            xor eax, eax
  996.            mov [esp+36], eax
  997.            ret
  998.  
  999. align 4
  1000. proc strncmp stdcall, str1:dword, str2:dword, count:dword
  1001.  
  1002.           mov ecx,[count]
  1003.           jecxz .end
  1004.  
  1005.           mov ebx,ecx
  1006.  
  1007.           mov edi,[str1]
  1008.           mov esi,edi
  1009.           xor eax,eax
  1010.           repne scasb
  1011.           neg ecx             ; cx = count - strlen
  1012.           add ecx,ebx         ; strlen + count - strlen
  1013.  
  1014. .okay:
  1015.           mov edi,esi
  1016.           mov esi,[str2]
  1017.           repe cmpsb
  1018.           mov al,[esi-1]
  1019.           xor ecx,ecx
  1020.  
  1021.           cmp al,[edi-1]
  1022.           ja .str2_big
  1023.           je .end
  1024.  
  1025. .str1_big:
  1026.           sub ecx,2
  1027.  
  1028. .str2_big:
  1029.           not ecx
  1030. .end:
  1031.           mov eax,ecx
  1032.           ret
  1033. endp
  1034.  
  1035. align 4
  1036. proc test_cpu
  1037.            locals
  1038.               cpu_type   dd ?
  1039.               cpu_id     dd ?
  1040.               cpu_Intel  dd ?
  1041.               cpu_AMD    dd ?
  1042.            endl
  1043.  
  1044.            mov [cpu_type], 0
  1045.            xor eax, eax
  1046.            mov [cpu_caps], eax
  1047.            mov [cpu_caps+4], eax
  1048.  
  1049.            pushfd
  1050.            pop eax
  1051.            mov ecx, eax
  1052.            xor eax, 0x40000
  1053.            push eax
  1054.            popfd
  1055.            pushfd
  1056.            pop eax
  1057.            xor eax, ecx
  1058.            mov [cpu_type], CPU_386
  1059.            jz .end_cpuid
  1060.            push ecx
  1061.            popfd
  1062.  
  1063.            mov [cpu_type], CPU_486
  1064.            mov eax, ecx
  1065.            xor eax, 0x200000
  1066.            push eax
  1067.            popfd
  1068.            pushfd
  1069.            pop eax
  1070.            xor eax, ecx
  1071.            je .end_cpuid
  1072.            mov [cpu_id], 1
  1073.  
  1074.            xor eax, eax
  1075.            cpuid
  1076.            mov [cpu_vendor], ebx
  1077.            mov [cpu_vendor+4], edx
  1078.            mov [cpu_vendor+8], ecx
  1079.            cmp ebx, dword [intel_str]
  1080.            jne .check_AMD
  1081.            cmp edx, dword [intel_str+4]
  1082.            jne .check_AMD
  1083.            cmp ecx, dword [intel_str+8]
  1084.            jne .check_AMD
  1085.            mov [cpu_Intel], 1
  1086.            cmp eax, 1
  1087.            jl .end_cpuid
  1088.            mov eax, 1
  1089.            cpuid
  1090.            mov [cpu_sign], eax
  1091.            mov [cpu_info],  ebx
  1092.            mov [cpu_caps],  edx
  1093.            mov [cpu_caps+4],ecx
  1094.  
  1095.            shr eax, 8
  1096.            and eax, 0x0f
  1097.            ret
  1098. .end_cpuid:
  1099.            mov eax, [cpu_type]
  1100.            ret
  1101.  
  1102. .check_AMD:
  1103.            cmp ebx, dword [AMD_str]
  1104.            jne .unknown
  1105.            cmp edx, dword [AMD_str+4]
  1106.            jne .unknown
  1107.            cmp ecx, dword [AMD_str+8]
  1108.            jne .unknown
  1109.            mov [cpu_AMD], 1
  1110.            cmp eax, 1
  1111.            jl .unknown
  1112.            mov eax, 1
  1113.            cpuid
  1114.            mov [cpu_sign], eax
  1115.            mov [cpu_info],  ebx
  1116.            mov [cpu_caps],  edx
  1117.            mov [cpu_caps+4],ecx
  1118.            shr eax, 8
  1119.            and eax, 0x0f
  1120.            ret
  1121. .unknown:
  1122.            mov eax, 1
  1123.            cpuid
  1124.            mov [cpu_sign], eax
  1125.            mov [cpu_info],  ebx
  1126.            mov [cpu_caps],  edx
  1127.            mov [cpu_caps+4],ecx
  1128.            shr eax, 8
  1129.            and eax, 0x0f
  1130.            ret
  1131. endp
  1132.  
  1133. MEM_WB     equ 6               ;write-back memory
  1134. MEM_WC     equ 1               ;write combined memory
  1135. MEM_UC     equ 0               ;uncached memory
  1136.  
  1137. align 4
  1138. proc init_mtrr
  1139.  
  1140.            cmp [0x2f0000+0x901c],byte 2
  1141.            je  .exit
  1142.  
  1143.            bt [cpu_caps], CAPS_MTRR
  1144.            jnc .exit
  1145.  
  1146.            mov eax, cr0
  1147.            or eax, 0x60000000   ;disable caching
  1148.            mov cr0, eax
  1149.            wbinvd               ;invalidate cache
  1150.  
  1151.            mov ecx, 0x2FF
  1152.            rdmsr                ;
  1153.            push eax
  1154.  
  1155.            xor edx, edx
  1156.            xor eax, eax
  1157.            mov ecx, 0x2FF
  1158.            wrmsr                ;disable all MTRR
  1159.  
  1160.            stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB
  1161.            stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
  1162.            xor edx, edx
  1163.            xor eax, eax
  1164.            mov ecx, 0x204
  1165.            mov ebx, 6
  1166. @@:
  1167.            wrmsr                ;disable unused MTRR
  1168.            inc ecx
  1169.            wrmsr
  1170.            inc ecx
  1171.            dec ebx
  1172.            jnz @b
  1173.  
  1174.            wbinvd               ;again invalidate
  1175.  
  1176.            pop eax
  1177.            or eax, 0x800        ;set default memtype to UC
  1178.            and al, 0xF0
  1179.            mov ecx, 0x2FF
  1180.            wrmsr                ;and enable MTRR
  1181.  
  1182.            mov eax, cr0
  1183.            and eax, not 0x60000000
  1184.            mov cr0, eax         ; enable caching
  1185. .exit:
  1186.            ret
  1187. endp
  1188.  
  1189. align 4
  1190. proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
  1191.  
  1192.            xor edx, edx
  1193.            mov eax, [base]
  1194.            or eax, [mem_type]
  1195.            mov ecx, [reg]
  1196.            lea ecx, [0x200+ecx*2]
  1197.            wrmsr
  1198.  
  1199.            mov ebx, [size]
  1200.            dec ebx
  1201.            mov eax, 0xFFFFFFFF
  1202.            mov edx, 0x0000000F
  1203.            sub eax, ebx
  1204.            sbb edx, 0
  1205.            or eax, 0x800
  1206.            inc ecx
  1207.            wrmsr
  1208.            ret
  1209. endp
  1210.  
  1211. align 4
  1212. proc stall stdcall, delay:dword
  1213.            push ecx
  1214.            push edx
  1215.            push ebx
  1216.            push eax
  1217.  
  1218.            mov eax, [delay]
  1219.            mul [stall_mcs]
  1220.            mov ebx, eax       ;low
  1221.            mov ecx, edx       ;high
  1222.            rdtsc
  1223.            add ebx, eax
  1224.            adc ecx,edx
  1225. @@:
  1226.            rdtsc
  1227.            sub eax, ebx
  1228.            sbb edx, ecx
  1229.            jb @B
  1230.  
  1231.            pop eax
  1232.            pop ebx
  1233.            pop edx
  1234.            pop ecx
  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.   fpu_data          rd 1
  1264.   fdd_buff          rd 1
  1265.   LFBSize           rd 1
  1266.  
  1267.   stall_mcs         rd 1
  1268. ;;CPUID information
  1269.  
  1270.   cpu_vendor        rd 3
  1271.   cpu_sign          rd 1
  1272.   cpu_info          rd 1
  1273.  
  1274. ;;;;;   cursors data
  1275.  
  1276. align 16
  1277. cur_saved_data   rb 4096
  1278.  
  1279. ;cursors          rb CURSOR_SIZE*64
  1280. ;cursor_map       rd 2
  1281. ;cursor_start     rd 1
  1282. ;cursor_end       rd 1
  1283.  
  1284. def_cursor       rd 1
  1285. hw_cursor        rd 1
  1286.  
  1287. scr_width        rd 1
  1288. scr_height       rd 1
  1289.  
  1290. cur_def_interl   rd 1
  1291. cur_saved_base   rd 1
  1292. cur_saved_interl rd 1
  1293. cur_saved_w      rd 1
  1294. cur_saved_h      rd 1
  1295.  
  1296. endg
  1297.  
  1298. uglobal
  1299. align 16
  1300.  
  1301.    mst MEM_STATE
  1302.  
  1303. ;   dll_tab         rb 32*32
  1304. ;   srv_tab         rb 36*32
  1305.    mem_block_map   rb 512
  1306.    event_map       rb 128
  1307.    mem_block_list  rd 64
  1308.    mem_block_mask  rd 2
  1309.  
  1310. ;   dll_map         rd 1
  1311. ;   srv_map         rd 1
  1312.  
  1313.    srv.fd          rd 1
  1314.    srv.bk          rd 1
  1315.  
  1316.    mem_used_list   rd 1
  1317.    mem_block_arr   rd 1
  1318.    mem_block_start rd 1
  1319.    mem_block_end   rd 1
  1320.    heap_size       rd 1
  1321.    heap_free       rd 1
  1322.    heap_blocks     rd 1
  1323.    free_blocks     rd 1
  1324.  
  1325.    page_start      rd 1
  1326.    page_end        rd 1
  1327.    events          rd 1
  1328.    event_start     rd 1
  1329.    event_end       rd 1
  1330.  
  1331.    sys_page_map    rd 1
  1332. endg
  1333.  
  1334.  
  1335. ;     push eax
  1336. ;     push edx
  1337. ;     mov edx, 0x400   ;bocsh
  1338. ;     mov al,0xff      ;bocsh
  1339. ;     out dx, al       ;bocsh
  1340. ;     pop edx
  1341. ;     pop eax
  1342.  
  1343.  
  1344. align 4
  1345. k_strrchr:
  1346.         push eax
  1347.         xor eax,eax
  1348.         or  ecx,-1
  1349.         repne scasb
  1350.         add ecx,1
  1351.         neg ecx
  1352.         sub edi,1
  1353.         pop eax
  1354.         std
  1355.         repne scasb
  1356.         cld
  1357.         add edi,1
  1358.  
  1359.         cmp [edi],al
  1360.         jne @F
  1361.         mov eax,edi
  1362.         ret
  1363. @@:
  1364.         xor eax,eax
  1365.         ret
  1366.  
  1367. align 4
  1368. proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
  1369.         mov eax, [dest]
  1370.         mov esi, [src]
  1371.         mov ecx, [maxlen]
  1372.         test eax, eax
  1373.         jz .L9
  1374.         test esi, esi
  1375.         jz .L9
  1376.         test ecx, ecx
  1377.         jz .L9
  1378.  
  1379.         sub  esi, eax
  1380.         jmp .L1
  1381.  
  1382. align 4
  1383. .L2:
  1384.         mov edx, [esi+eax]
  1385.         mov [eax], dl
  1386.         test dl, dl
  1387.         jz .L7
  1388.  
  1389.         mov [eax+1], dh
  1390.         test dh, dh
  1391.         jz .L6
  1392.  
  1393.         shr edx, 16
  1394.         mov [eax+2],dl
  1395.         test dl, dl
  1396.         jz .L5
  1397.  
  1398.         mov [eax+3], dh
  1399.         test dh, dh
  1400.         jz .L4
  1401.         add eax, 4
  1402. .L1:
  1403.         sub ecx, 4
  1404.         jae .L2
  1405.  
  1406.         add ecx, 4
  1407.         jz .L9
  1408.  
  1409.         mov dl, [eax+esi]
  1410.         mov [eax], dl
  1411.         test dl, dl
  1412.         jz .L3
  1413.  
  1414.         inc eax
  1415.         dec ecx
  1416.         jz .L9
  1417.  
  1418.         mov dl, [eax+esi]
  1419.         mov [eax], dl
  1420.         test dl, dl
  1421.         jz .L3
  1422.  
  1423.         inc eax
  1424.         dec ecx
  1425.         jz .L9
  1426.  
  1427.         mov dl, [eax+esi]
  1428.         mov [eax], dl
  1429.         test dl, dl
  1430.         jz .L3
  1431.  
  1432.         inc eax
  1433.         jmp .L9
  1434.  
  1435. .L4:    dec ecx
  1436.         inc eax
  1437.  
  1438. .L5:    dec ecx
  1439.         inc eax
  1440.  
  1441. .L6:    dec ecx
  1442.         inc eax
  1443. .L7:
  1444.         add ecx,3
  1445.         jz .L9
  1446. .L8:
  1447.         mov byte [ecx+eax], 0
  1448. .L3:
  1449.         dec ecx
  1450.         jnz .L8
  1451. .L9:
  1452.         ret
  1453. endp
  1454.  
  1455. if 0
  1456.  
  1457. magic equ 0xfefefeff
  1458.  
  1459. k_strlen:
  1460.         mov eax,[esp+4]
  1461.         mov edx, 3
  1462.  
  1463.         and edx, eax
  1464.         jz .L1
  1465.         jp .L0
  1466.  
  1467.         cmp dh, byte [eax]
  1468.         je .L2
  1469.  
  1470.         inc eax
  1471.         cmp dh, byte [eax]
  1472.  
  1473.         je .L2
  1474.  
  1475.         inc eax
  1476.         xor edx, 2
  1477.  
  1478.         jz .L1
  1479. .L0:
  1480.         cmp dh, [eax]
  1481.         je .L2
  1482.  
  1483.         inc eax
  1484.         xor edx, edx
  1485.  
  1486. .L1:
  1487.         mov ecx, [eax]
  1488.         add eax, 4
  1489.  
  1490.         sub edx, ecx
  1491.         add ecx, magic
  1492.  
  1493.         dec edx
  1494.         jnc .L3
  1495.  
  1496.         xor edx, ecx
  1497.         and edx, not magic
  1498.         jne .L3
  1499.  
  1500.         mov ecx, [eax]
  1501.         add eax, 4
  1502.  
  1503.         sub edx, ecx
  1504.         add ecx, magic
  1505.         dec edx
  1506.         jnc .L3
  1507.  
  1508.         xor edx, ecx
  1509.         and edx, not magic
  1510.         jne .L3
  1511.  
  1512.         mov ecx, [eax]
  1513.         add eax, 4
  1514.  
  1515.         sub edx, ecx
  1516.         add ecx, magic
  1517.  
  1518.         dec edx
  1519.         jnc .L3
  1520.  
  1521.         xor edx, ecx
  1522.  
  1523.         and edx, not magic
  1524.         jne .L3
  1525.  
  1526.         mov ecx, [eax]
  1527.         add eax, 4
  1528.  
  1529.         sub edx, ecx
  1530.         add ecx, magic
  1531.  
  1532.         dec edx
  1533.         jnc .L3
  1534.  
  1535.         xor edx, ecx
  1536.  
  1537.         and edx, not magic
  1538.         je .L1
  1539.  
  1540. .L3:    sub eax ,4
  1541.         sub ecx, magic
  1542.  
  1543.         cmp cl, 0
  1544.         jz .L2
  1545.  
  1546.         inc eax
  1547.         test ch, ch
  1548.         jz .L2
  1549.  
  1550.         shr ecx, 16
  1551.         inc eax
  1552.  
  1553.         cmp cl,0
  1554.         jz .L2
  1555.  
  1556.         inc eax
  1557.  
  1558. .L2:
  1559.         sub eax, [esp+4]
  1560.         ret
  1561.  
  1562. end if
  1563.