Subversion Repositories Kolibri OS

Rev

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

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