Subversion Repositories Kolibri OS

Rev

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