Subversion Repositories Kolibri OS

Rev

Rev 427 | Blame | Last modification | View Log | Download | RSS feed

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