Subversion Repositories Kolibri OS

Rev

Rev 418 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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