Subversion Repositories Kolibri OS

Rev

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