Subversion Repositories Kolibri OS

Rev

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