Subversion Repositories Kolibri OS

Rev

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

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