Subversion Repositories Kolibri OS

Rev

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