Subversion Repositories Kolibri OS

Rev

Rev 897 | Rev 1066 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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