Subversion Repositories Kolibri OS

Rev

Rev 413 | 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. align 4
  452. proc page_fault_handler
  453.            pushad
  454.  
  455.      push eax
  456.      push edx
  457.      mov edx, 0x400   ;bocsh
  458.      mov al,0xff      ;bocsh
  459.      out dx, al       ;bocsh
  460.      pop edx
  461.      pop eax
  462.  
  463.            mov ebp, esp
  464.            mov eax, cr2
  465.            push eax
  466.            push ds
  467.            push es
  468.  
  469.            mov ax, 0x10
  470.            mov ds, ax
  471.            mov es, ax
  472.  
  473.            inc [pg_data.pages_faults]
  474.  
  475.            mov ebx, [ebp-4]
  476.  
  477.            cmp ebx, 0x80000000
  478.            jae .kernel_space
  479.  
  480.            cmp ebx, page_tabs+0x200000
  481.            jae .tab_space
  482.  
  483.            cmp ebx, app_page_tabs
  484.            jae .alloc
  485.  
  486.            cmp ebx, 0x7DC00000
  487.            jae .lfb_addr
  488.  
  489. ;           cmp ebx, 0x1000000
  490. ;           jb .exit
  491.  
  492. .user_space:
  493.            shr ebx, 12
  494.            mov ecx, ebx
  495.            shr ecx, 10
  496.            mov edx, [master_tab+ecx*4]
  497.            test edx, 1
  498.            jz .fail
  499.  
  500.            mov eax, [page_tabs+ebx*4]
  501.            test eax, 2
  502.            jz .fail
  503. .alloc:
  504.            call alloc_page
  505.            and eax, eax
  506.            jz .exit
  507.  
  508.            stdcall map_page,[ebp-4],eax,dword PG_UW
  509.  
  510.            mov edi, [ebp-4]
  511.            and edi, 0xFFFFF000
  512.            mov ecx, 1024
  513.            xor eax, eax
  514.            cld
  515.            rep stosd
  516. .exit:
  517.            pop es
  518.            pop ds
  519.            mov esp, ebp
  520.            popad
  521.            add esp, 4
  522.            iretd
  523. .fail:
  524.            pop es
  525.            pop ds
  526.            mov esp, ebp
  527.            popad
  528.            add esp, 4
  529.            iretd
  530.  
  531.            save_ring3_context     ;debugger support
  532.  
  533.            mov bl, 14
  534.            jmp exc_c
  535.            iretd
  536.  
  537. .kernel_space:
  538. ;           shr ebx, 12
  539. ;           mov eax, [page_tabs+ebx*4]
  540. ;           shr ebx, 10
  541. ;           mov eax, [master_tab+ebx*4]
  542.            jmp .exit
  543. .old_addr:
  544. ;           shr ebx, 12
  545. ;           mov eax, [page_tabs+ebx*4]
  546. ;           shr ebx, 10
  547. ;           mov eax, [master_tab+ebx*4]
  548.            jmp .exit
  549. .lfb_addr:
  550. ;           shr ebx, 22
  551. ;           ;mov ecx, [sys_page_dir]
  552. ;           mov eax, [master_tab+ebx*4]
  553.            jmp .exit
  554. .tab_space:
  555. ;           shr ebx, 12
  556. ;           mov eax, [page_tabs+ebx*4]
  557. ;           shr ebx, 10
  558. ;           ;mov ecx, [sys_page_dir]
  559. ;           mov eax, [master_tab+ebx*4]
  560.            jmp .exit
  561. endp
  562.  
  563. align 4
  564. proc map_mem stdcall, lin_addr:dword,pdir:dword,\
  565.                       ofs:dword,buf_size:dword
  566.            mov eax, [buf_size]
  567.            test eax, eax
  568.            jz .exit
  569.  
  570.            mov eax, [pdir]
  571.            and eax, 0xFFFFF000
  572.  
  573.            stdcall map_page,[ipc_pdir],eax,dword PG_UW
  574.            mov ebx, [ofs]
  575.            shr ebx, 22
  576.            mov esi, [ipc_pdir]
  577.            mov edi, [ipc_ptab]
  578.            mov eax, [esi+ebx*4]
  579.            and eax, 0xFFFFF000
  580.            test eax, eax
  581.            jz .exit
  582.            stdcall map_page,edi,eax,dword PG_UW
  583. ;           inc ebx
  584. ;           add edi, 0x1000
  585. ;           mov eax, [esi+ebx*4]
  586. ;           test eax, eax
  587. ;           jz @f
  588. ;          and eax, 0xFFFFF000
  589. ;           stdcall map_page, edi, eax
  590.  
  591. @@:        mov edi, [lin_addr]
  592.            and edi, 0xFFFFF000
  593.            mov ecx, [buf_size]
  594.            add ecx, 4095
  595.            shr ecx, 12
  596.            inc ecx
  597.  
  598.            mov edx, [ofs]
  599.            shr edx, 12
  600.            and edx, 0x3FF
  601.            mov esi, [ipc_ptab]
  602.  
  603. .map:      mov eax, [esi+edx*4]
  604.            and eax, 0xFFFFF000
  605.            test eax, eax
  606.            jz .exit
  607.            stdcall map_page,edi,eax,dword PG_UW
  608.            add edi, 0x1000
  609.            inc edx
  610.            dec ecx
  611.            jnz .map
  612.  
  613. .exit:
  614.            ret
  615. endp
  616.  
  617. align 4
  618. proc map_memEx 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,[proc_mem_pdir],eax,dword PG_UW
  628.            mov ebx, [ofs]
  629.            shr ebx, 22
  630.            mov esi, [proc_mem_pdir]
  631.            mov edi, [proc_mem_tab]
  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.  
  638. @@:        mov edi, [lin_addr]
  639.            and edi, 0xFFFFF000
  640.            mov ecx, [buf_size]
  641.            add ecx, 4095
  642.            shr ecx, 12
  643.            inc ecx
  644.  
  645.            mov edx, [ofs]
  646.            shr edx, 12
  647.            and edx, 0x3FF
  648.            mov esi, [proc_mem_tab]
  649.  
  650. .map:      mov eax, [esi+edx*4]
  651. ;           and eax, 0xFFFFF000
  652. ;           test eax, eax
  653. ;           jz .exit
  654.            stdcall map_page,edi,eax,dword PG_UW
  655.            add edi, 0x1000
  656.            inc edx
  657.            dec ecx
  658.            jnz .map
  659. .exit:
  660.            ret
  661. endp
  662.  
  663.  
  664.  
  665.  
  666. sys_IPC:
  667. ;input:
  668. ;  eax=1 - set ipc buffer area
  669. ;    ebx=address of buffer
  670. ;    ecx=size of buffer
  671. ;  eax=2 - send message
  672. ;    ebx=PID
  673. ;    ecx=address of message
  674. ;    edx=size of message
  675.  
  676.            cmp  eax,1
  677.            jne @f
  678.            call set_ipc_buff
  679.            mov [esp+36], eax
  680.            ret
  681. @@:
  682.            cmp eax, 2
  683.            jne @f
  684.            stdcall sys_ipc_send, ebx, ecx, edx
  685.            mov [esp+36], eax
  686.            ret
  687. @@:
  688.            xor eax, eax
  689.            not eax
  690.            mov [esp+36], eax
  691.            ret
  692.  
  693. align 4
  694. proc set_ipc_buff
  695.  
  696.            mov  eax,[CURRENT_TASK]
  697.            shl  eax,8
  698.            add  eax, SLOT_BASE
  699.            pushf
  700.            cli
  701.            mov  [eax+0xA0],ebx     ;set fields in extended information area
  702.            mov  [eax+0xA4],ecx
  703.  
  704.            add ebx,  new_app_base
  705.            add ecx, ebx
  706.            add ecx, 4095
  707.            and ecx, not 4095
  708.  
  709. .touch:    mov eax, [ebx]
  710.            add ebx, 0x1000
  711.            cmp ebx, ecx
  712.            jna .touch
  713.  
  714.            popf
  715.            xor eax, eax
  716.            ret
  717. endp
  718.  
  719. proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
  720.            locals
  721.              dst_slot   dd ?
  722.              dst_offset dd ?
  723.              buf_size   dd ?
  724.            endl
  725.  
  726.            pushf
  727.            cli
  728.  
  729.            mov  eax, [PID]
  730.            call pid_to_slot
  731.            test eax,eax
  732.            jz   .no_pid
  733.  
  734.            mov [dst_slot], eax
  735.            shl  eax,8
  736.            mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
  737.            test edi,edi
  738.            jz   .no_ipc_area
  739.  
  740.            mov ebx, edi
  741.            add edi, new_app_base
  742.            and ebx, 0xFFF
  743.            mov [dst_offset], ebx
  744.  
  745.            mov esi, [eax+SLOT_BASE+0xa4]
  746.            mov [buf_size], esi
  747.  
  748.            stdcall map_mem, [ipc_tmp], [SLOT_BASE+eax+0xB8],\
  749.                              edi, esi
  750.  
  751.            mov edi, [dst_offset]
  752.            add edi, [ipc_tmp]
  753.            cmp dword [edi], 0
  754.            jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
  755.  
  756.            mov ebx, dword [edi+4]
  757.            mov edx, ebx
  758.            add ebx, 8
  759.            add ebx, [msg_size]
  760.            cmp ebx, [buf_size]
  761.            ja .buffer_overflow         ;esi<0 - not enough memory in buffer
  762.  
  763.            mov dword [edi+4], ebx
  764.            mov eax,[TASK_BASE]
  765.            mov eax, [eax+0x04]         ;eax - our PID
  766.            mov edi, [dst_offset]
  767.            add edi, [ipc_tmp]
  768.            add edi, edx
  769.            mov [edi], eax
  770.            mov ecx, [msg_size]
  771.  
  772.            mov [edi+4], ecx
  773.            add edi, 8
  774.            mov esi, [msg_addr]
  775.            add esi, new_app_base
  776.            cld
  777.            rep movsb
  778.  
  779.            mov ebx, [ipc_tmp]
  780.            mov edx, ebx
  781.            shr ebx, 12
  782.            xor eax, eax
  783.            mov [page_tabs+ebx*4], eax
  784.            invlpg [edx]
  785.  
  786.            mov ebx, [ipc_pdir]
  787.            mov edx, ebx
  788.            shr ebx, 12
  789.            xor eax, eax
  790.            mov [page_tabs+ebx*4], eax
  791.            invlpg [edx]
  792.  
  793.            mov ebx, [ipc_ptab]
  794.            mov edx, ebx
  795.            shr ebx, 12
  796.            xor eax, eax
  797.            mov [page_tabs+ebx*4], eax
  798.            invlpg [edx]
  799.  
  800.            mov  eax, [dst_slot]
  801.            shl eax, 8
  802.            or   [eax+SLOT_BASE+0xA8],dword 0x40
  803.            cmp  dword [check_idle_semaphore],20
  804.            jge  .ipc_no_cis
  805.  
  806.            mov  dword [check_idle_semaphore],5
  807. .ipc_no_cis:
  808.            popf
  809.            xor eax, eax
  810.            ret
  811. .no_pid:
  812.            popf
  813.            mov  eax, 4
  814.            ret
  815. .no_ipc_area:
  816.            popf
  817.            xor eax, eax
  818.            inc eax
  819.            ret
  820. .ipc_blocked:
  821.            popf
  822.            mov  eax, 2
  823.            ret
  824. .buffer_overflow:
  825.            popf
  826.            mov  eax, 3
  827.            ret
  828. endp
  829.  
  830. align 4
  831. sysfn_meminfo:
  832.  
  833.            add ebx, new_app_base
  834.            cmp ebx, new_app_base
  835.            jb .fail
  836.  
  837.            mov eax, [pg_data.pages_count]
  838.            mov [ebx], eax
  839.            shl eax, 12
  840.            mov [esp+36], eax
  841.            mov ecx, [pg_data.pages_free]
  842.            mov [ebx+4], ecx
  843.            mov edx, [pg_data.pages_faults]
  844.            mov [ebx+8], edx
  845.            mov esi, [heap_size]
  846.            mov [ebx+12], esi
  847.            mov edi, [heap_free]
  848.            mov [ebx+16], edi
  849.            mov eax, [heap_blocks]
  850.            mov [ebx+20], eax
  851.            mov ecx, [free_blocks]
  852.            mov [ebx+24], ecx
  853.            ret
  854. .fail:
  855.            mov dword [esp+36], -1
  856.            ret
  857.  
  858. align 4
  859. new_services:
  860.  
  861.            cmp  eax,4
  862.            jle  sys_sheduler
  863.  
  864.            cmp eax, 11
  865.            jb .fail
  866.            ja @f
  867.  
  868.            call init_heap
  869.            mov [esp+36], eax
  870.            ret
  871. @@:
  872.            cmp eax, 12
  873.            ja @f
  874.  
  875.            stdcall user_alloc, ebx
  876.            mov [esp+36], eax
  877.            ret
  878. @@:
  879.            cmp eax, 13
  880.            ja @f
  881.            add ebx, new_app_base
  882.            stdcall user_free, ebx
  883.            mov [esp+36], eax
  884.            ret
  885. @@:
  886.            cmp eax, 14
  887.            ja @f
  888.            add ebx, new_app_base
  889.            cmp ebx, new_app_base
  890.            jb .fail
  891.            stdcall get_event_ex, ebx, ecx
  892.            mov [esp+36], eax
  893.            ret
  894. @@:
  895.            cmp eax, 15
  896.            ja @f
  897.            mov ecx, [CURRENT_TASK]
  898.            shl ecx, 8
  899.            mov eax, [ecx+SLOT_BASE+APPDATA.fpu_handler]
  900.            mov [ecx+SLOT_BASE+APPDATA.fpu_handler], ebx
  901.            mov [esp+36], eax
  902.            ret
  903. @@:
  904.            cmp eax, 16
  905.            ja @f
  906.  
  907.            test ebx, ebx
  908.            jz .fail
  909.            add ebx, new_app_base
  910.            cmp ebx, new_app_base
  911.            jb .fail
  912.            stdcall get_service, ebx
  913.            mov [esp+36], eax
  914.            ret
  915. @@:
  916.            cmp eax, 17
  917.            ja @f
  918.            call srv_handlerEx   ;ebx
  919.            mov [esp+36], eax
  920.            ret
  921. @@:
  922.            cmp eax, 18
  923.            ja @f
  924.            mov ecx, [CURRENT_TASK]
  925.            shl ecx, 8
  926.            mov eax, [ecx+SLOT_BASE+APPDATA.sse_handler]
  927.            mov [ecx+SLOT_BASE+APPDATA.sse_handler], ebx
  928.            mov [esp+36], eax
  929.            ret
  930. @@:
  931.            cmp eax, 19
  932.            ja .fail
  933.            add ebx, new_app_base
  934.            cmp ebx, new_app_base
  935.            jb .fail
  936.            stdcall load_library, ebx
  937.            mov [esp+36], eax
  938.            ret
  939.  
  940. .fail:
  941.            xor eax, eax
  942.            mov [esp+36], eax
  943.            ret
  944.  
  945. align 4
  946. proc init_mtrr
  947.  
  948.            cmp [BOOT_VAR+0x901c],byte 2
  949.            je  .exit
  950.  
  951.            bt [cpu_caps], CAPS_MTRR
  952.            jnc .exit
  953.  
  954.            mov eax, cr0
  955.            or eax, 0x60000000   ;disable caching
  956.            mov cr0, eax
  957.            wbinvd               ;invalidate cache
  958.  
  959.            mov ecx, 0x2FF
  960.            rdmsr                ;
  961.            push eax
  962.  
  963.            xor edx, edx
  964.            xor eax, eax
  965.            mov ecx, 0x2FF
  966.            wrmsr                ;disable all MTRR
  967.  
  968.            stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB
  969.            stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
  970.            xor edx, edx
  971.            xor eax, eax
  972.            mov ecx, 0x204
  973.            mov ebx, 6
  974. @@:
  975.            wrmsr                ;disable unused MTRR
  976.            inc ecx
  977.            wrmsr
  978.            inc ecx
  979.            dec ebx
  980.            jnz @b
  981.  
  982.            wbinvd               ;again invalidate
  983.  
  984.            pop eax
  985.            or eax, 0x800        ;set default memtype to UC
  986.            and al, 0xF0
  987.            mov ecx, 0x2FF
  988.            wrmsr                ;and enable MTRR
  989.  
  990.            mov eax, cr0
  991.            and eax, not 0x60000000
  992.            mov cr0, eax         ; enable caching
  993. .exit:
  994.            ret
  995. endp
  996.  
  997. align 4
  998. proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
  999.  
  1000.            xor edx, edx
  1001.            mov eax, [base]
  1002.            or eax, [mem_type]
  1003.            mov ecx, [reg]
  1004.            lea ecx, [0x200+ecx*2]
  1005.            wrmsr
  1006.  
  1007.            mov ebx, [size]
  1008.            dec ebx
  1009.            mov eax, 0xFFFFFFFF
  1010.            mov edx, 0x0000000F
  1011.            sub eax, ebx
  1012.            sbb edx, 0
  1013.            or eax, 0x800
  1014.            inc ecx
  1015.            wrmsr
  1016.            ret
  1017. endp
  1018.  
  1019.  
  1020. align 4
  1021. proc strncmp stdcall, str1:dword, str2:dword, count:dword
  1022.  
  1023.           mov ecx,[count]
  1024.           jecxz .end
  1025.  
  1026.           mov ebx,ecx
  1027.  
  1028.           mov edi,[str1]
  1029.           mov esi,edi
  1030.           xor eax,eax
  1031.           repne scasb
  1032.           neg ecx             ; cx = count - strlen
  1033.           add ecx,ebx         ; strlen + count - strlen
  1034.  
  1035. .okay:
  1036.           mov edi,esi
  1037.           mov esi,[str2]
  1038.           repe cmpsb
  1039.           mov al,[esi-1]
  1040.           xor ecx,ecx
  1041.  
  1042.           cmp al,[edi-1]
  1043.           ja .str2_big
  1044.           je .end
  1045.  
  1046. .str1_big:
  1047.           sub ecx,2
  1048.  
  1049. .str2_big:
  1050.           not ecx
  1051. .end:
  1052.           mov eax,ecx
  1053.           ret
  1054. endp
  1055.  
  1056. align 4
  1057. proc stall stdcall, delay:dword
  1058.            push ecx
  1059.            push edx
  1060.            push ebx
  1061.            push eax
  1062.  
  1063.            mov eax, [delay]
  1064.            mul [stall_mcs]
  1065.            mov ebx, eax       ;low
  1066.            mov ecx, edx       ;high
  1067.            rdtsc
  1068.            add ebx, eax
  1069.            adc ecx,edx
  1070. @@:
  1071.            rdtsc
  1072.            sub eax, ebx
  1073.            sbb edx, ecx
  1074.            jb @B
  1075.  
  1076.            pop eax
  1077.            pop ebx
  1078.            pop edx
  1079.            pop ecx
  1080.            ret
  1081. endp
  1082.  
  1083. align 4
  1084. k_strrchr:
  1085.         push eax
  1086.         xor eax,eax
  1087.         or  ecx,-1
  1088.         repne scasb
  1089.         add ecx,1
  1090.         neg ecx
  1091.         sub edi,1
  1092.         pop eax
  1093.         std
  1094.         repne scasb
  1095.         cld
  1096.         add edi,1
  1097.  
  1098.         cmp [edi],al
  1099.         jne @F
  1100.         mov eax,edi
  1101.         ret
  1102. @@:
  1103.         xor eax,eax
  1104.         ret
  1105.  
  1106. align 4
  1107. proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
  1108.         mov eax, [dest]
  1109.         mov esi, [src]
  1110.         mov ecx, [maxlen]
  1111.         test eax, eax
  1112.         jz .L9
  1113.         test esi, esi
  1114.         jz .L9
  1115.         test ecx, ecx
  1116.         jz .L9
  1117.  
  1118.         sub  esi, eax
  1119.         jmp .L1
  1120.  
  1121. align 4
  1122. .L2:
  1123.         mov edx, [esi+eax]
  1124.         mov [eax], dl
  1125.         test dl, dl
  1126.         jz .L7
  1127.  
  1128.         mov [eax+1], dh
  1129.         test dh, dh
  1130.         jz .L6
  1131.  
  1132.         shr edx, 16
  1133.         mov [eax+2],dl
  1134.         test dl, dl
  1135.         jz .L5
  1136.  
  1137.         mov [eax+3], dh
  1138.         test dh, dh
  1139.         jz .L4
  1140.         add eax, 4
  1141. .L1:
  1142.         sub ecx, 4
  1143.         jae .L2
  1144.  
  1145.         add ecx, 4
  1146.         jz .L9
  1147.  
  1148.         mov dl, [eax+esi]
  1149.         mov [eax], dl
  1150.         test dl, dl
  1151.         jz .L3
  1152.  
  1153.         inc eax
  1154.         dec ecx
  1155.         jz .L9
  1156.  
  1157.         mov dl, [eax+esi]
  1158.         mov [eax], dl
  1159.         test dl, dl
  1160.         jz .L3
  1161.  
  1162.         inc eax
  1163.         dec ecx
  1164.         jz .L9
  1165.  
  1166.         mov dl, [eax+esi]
  1167.         mov [eax], dl
  1168.         test dl, dl
  1169.         jz .L3
  1170.  
  1171.         inc eax
  1172.         jmp .L9
  1173.  
  1174. .L4:    dec ecx
  1175.         inc eax
  1176.  
  1177. .L5:    dec ecx
  1178.         inc eax
  1179.  
  1180. .L6:    dec ecx
  1181.         inc eax
  1182. .L7:
  1183.         add ecx,3
  1184.         jz .L9
  1185. .L8:
  1186.         mov byte [ecx+eax], 0
  1187. .L3:
  1188.         dec ecx
  1189.         jnz .L8
  1190. .L9:
  1191.         ret
  1192. endp
  1193.  
  1194. if 0
  1195.  
  1196. magic equ 0xfefefeff
  1197.  
  1198. k_strlen:
  1199.         mov eax,[esp+4]
  1200.         mov edx, 3
  1201.  
  1202.         and edx, eax
  1203.         jz .L1
  1204.         jp .L0
  1205.  
  1206.         cmp dh, byte [eax]
  1207.         je .L2
  1208.  
  1209.         inc eax
  1210.         cmp dh, byte [eax]
  1211.  
  1212.         je .L2
  1213.  
  1214.         inc eax
  1215.         xor edx, 2
  1216.  
  1217.         jz .L1
  1218. .L0:
  1219.         cmp dh, [eax]
  1220.         je .L2
  1221.  
  1222.         inc eax
  1223.         xor edx, edx
  1224.  
  1225. .L1:
  1226.         mov ecx, [eax]
  1227.         add eax, 4
  1228.  
  1229.         sub edx, ecx
  1230.         add ecx, magic
  1231.  
  1232.         dec edx
  1233.         jnc .L3
  1234.  
  1235.         xor edx, ecx
  1236.         and edx, not magic
  1237.         jne .L3
  1238.  
  1239.         mov ecx, [eax]
  1240.         add eax, 4
  1241.  
  1242.         sub edx, ecx
  1243.         add ecx, magic
  1244.         dec edx
  1245.         jnc .L3
  1246.  
  1247.         xor edx, ecx
  1248.         and edx, not magic
  1249.         jne .L3
  1250.  
  1251.         mov ecx, [eax]
  1252.         add eax, 4
  1253.  
  1254.         sub edx, ecx
  1255.         add ecx, magic
  1256.  
  1257.         dec edx
  1258.         jnc .L3
  1259.  
  1260.         xor edx, ecx
  1261.  
  1262.         and edx, not magic
  1263.         jne .L3
  1264.  
  1265.         mov ecx, [eax]
  1266.         add eax, 4
  1267.  
  1268.         sub edx, ecx
  1269.         add ecx, magic
  1270.  
  1271.         dec edx
  1272.         jnc .L3
  1273.  
  1274.         xor edx, ecx
  1275.  
  1276.         and edx, not magic
  1277.         je .L1
  1278.  
  1279. .L3:    sub eax ,4
  1280.         sub ecx, magic
  1281.  
  1282.         cmp cl, 0
  1283.         jz .L2
  1284.  
  1285.         inc eax
  1286.         test ch, ch
  1287.         jz .L2
  1288.  
  1289.         shr ecx, 16
  1290.         inc eax
  1291.  
  1292.         cmp cl,0
  1293.         jz .L2
  1294.  
  1295.         inc eax
  1296.  
  1297. .L2:
  1298.         sub eax, [esp+4]
  1299.         ret
  1300.  
  1301. end if
  1302.  
  1303. if 0
  1304.      push eax
  1305.      push edx
  1306.      mov edx, 0x400   ;bocsh
  1307.      mov al,0xff      ;bocsh
  1308.      out dx, al       ;bocsh
  1309.      pop edx
  1310.      pop eax
  1311. end if
  1312.  
  1313.  
  1314.