Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. HEAP_BASE equ 0x01000000
  3. ;HEAP_SIZE equ 0x01000000
  4.  
  5. struc MEM_BLOCK
  6. {  .next_block  dd ?
  7.    .prev_block  dd ? ;+4
  8.    .list_next   dd ? ;+8
  9.    .list_prev   dd ? ;+12
  10.    .base        dd ? ;+16
  11.    .size        dd ? ;+20
  12.    .flags       dd ? ;+24
  13.    .handle      dd ? ;+28
  14. }
  15.  
  16. FREE_BLOCK      equ  4
  17. USED_BLOCK      equ  8
  18.  
  19. virtual at 0
  20.   MEM_BLOCK MEM_BLOCK
  21. end virtual
  22.  
  23. MEM_BLOCK_SIZE equ 8*4
  24.  
  25. block_next   equ MEM_BLOCK.next_block
  26. block_prev   equ MEM_BLOCK.prev_block
  27. list_next    equ MEM_BLOCK.list_next
  28. list_prev    equ MEM_BLOCK.list_prev
  29. block_base   equ MEM_BLOCK.base
  30. block_size   equ MEM_BLOCK.size
  31. block_flags  equ MEM_BLOCK.flags
  32.  
  33. macro calc_index op
  34. {          shr op, 12
  35.            dec op
  36.            cmp op, 63
  37.            jna @f
  38.            mov op, 63
  39. @@:
  40. }
  41.  
  42. macro remove_from_list op
  43. {          mov edx, [op+list_next]
  44.            mov ecx, [op+list_prev]
  45.            test edx, edx
  46.            jz @f
  47.            mov [edx+list_prev], ecx
  48. @@:
  49.            test ecx, ecx
  50.            jz @f
  51.            mov [ecx+list_next], edx
  52. @@:
  53.            mov [op+list_next],0
  54.            mov [op+list_prev],0
  55. }
  56.  
  57. macro remove_from_free op
  58. {
  59.            remove_from_list op
  60.  
  61.            mov eax, [op+block_size]
  62.            calc_index eax
  63.            cmp [mem_block_list+eax*4], op
  64.            jne @f
  65.            mov [mem_block_list+eax*4], edx
  66. @@:
  67.            cmp [mem_block_list+eax*4], 0
  68.            jne @f
  69.            btr [mem_block_mask], eax
  70. @@:
  71. }
  72.  
  73. macro remove_from_used op
  74. {
  75.            remove_from_list op
  76.            cmp [mem_used_list], op
  77.            jne @f
  78.            mov [mem_used_list], edx
  79. @@:
  80. }
  81.  
  82. align 4
  83. proc init_kernel_heap
  84.  
  85.            mov ecx, 64/4
  86.            mov edi, mem_block_list
  87.            xor eax, eax
  88.            cld
  89.            rep stosd
  90.  
  91.            mov ecx, 512/4
  92.            mov edi, mem_block_map
  93.            not eax
  94.            rep stosd
  95.  
  96.            mov [mem_block_start], mem_block_map
  97.            mov [mem_block_end], mem_block_map+512
  98.            mov [mem_block_arr], HEAP_BASE
  99.  
  100.            stdcall alloc_pages, dword 32
  101.            mov ecx, 32
  102.            mov edx, eax
  103.            mov edi, HEAP_BASE
  104.  
  105. .l1:
  106.            stdcall map_page,edi,edx,PG_SW
  107.            add edi, 0x1000
  108.            add edx, 0x1000
  109.            dec ecx
  110.            jnz .l1
  111.  
  112.            mov edi, HEAP_BASE
  113.            mov ebx, edi
  114.            add ebx, MEM_BLOCK_SIZE
  115.            xor eax, eax
  116.            mov [edi+block_next], ebx
  117.            mov [edi+block_prev], eax
  118.            mov [edi+list_next], eax
  119.            mov [edi+list_prev], eax
  120.            mov [edi+block_base], HEAP_BASE
  121.            mov [edi+block_size], 4096*MEM_BLOCK_SIZE
  122.            mov [edi+block_flags], USED_BLOCK
  123.  
  124.            mov [ebx+block_next], eax
  125.            mov [ebx+block_prev], eax
  126.            mov [ebx+list_next], eax
  127.            mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
  128.  
  129.            mov ecx, [MEM_AMOUNT]
  130.            sub ecx, 0x00C00000 + 4096*MEM_BLOCK_SIZE
  131.            mov [ebx+block_size], ecx
  132.            mov [ebx+block_flags], FREE_BLOCK
  133.  
  134.            mov [mem_block_mask], eax
  135.            mov [mem_block_mask+4],0x80000000
  136.  
  137.            mov [mem_used_list], eax
  138.            mov [mem_block_list+63*4], ebx
  139.            mov byte [mem_block_map], 0xFC
  140.            ret
  141. endp
  142.  
  143. align 4
  144. proc get_block stdcall, index:dword
  145.  
  146.            mov eax, 63
  147.            mov ecx, [index]
  148.            cmp ecx, eax
  149.            jna @f
  150.            ;cmova ecx, eax
  151.            mov ecx, eax
  152. @@:
  153.            xor esi, esi
  154.            xor ebx, ebx
  155.            xor edx, edx
  156.            not edx
  157.  
  158.            cmp ecx, 32
  159.            jb .bit_test
  160.  
  161.            sub ecx, 32
  162.            add ebx, 32
  163.            add esi, 4
  164.  
  165. .bit_test:
  166.            shl edx, cl
  167.            and edx, [mem_block_mask+esi]
  168.            jz .high_mask
  169.            bsf eax, edx
  170.            add ebx, eax
  171.            mov eax, [mem_block_list+ebx*4]
  172.            ret
  173.  
  174. .high_mask:
  175.  
  176.            add esi, 4
  177.            add ebx, 32
  178.            test esi, 0xFFFFFFF8
  179.            jnz .big_error
  180.            mov edx, [mem_block_mask+esi]
  181.            and edx, edx
  182.            jz .high_mask
  183.            bsf eax, edx
  184.            add ebx, eax
  185.            mov eax, [mem_block_list+ebx*4]
  186.            ret
  187.  
  188. .big_error:
  189.            xor eax, eax
  190.            ret
  191. endp
  192.  
  193.  
  194. align 4
  195. proc alloc_mem_block
  196.  
  197.            pushfd
  198.            cli
  199.            mov ebx, [mem_block_start]
  200.            mov ecx, [mem_block_end]
  201. .l1:
  202.            bsf eax,[ebx];
  203.            jnz found
  204.            add ebx,4
  205.            cmp ebx, ecx
  206.            jb .l1
  207.            popfd
  208.            xor eax,eax
  209.            ret
  210.  
  211. found:
  212.            btr [ebx], eax
  213.            mov [mem_block_start],ebx
  214.            sub ebx, mem_block_map
  215.            shl ebx, 3
  216.            add eax,ebx
  217.            shl eax, 5
  218.            add eax, [mem_block_arr]
  219.            popfd
  220.            ret
  221. endp
  222.  
  223. proc free_mem_block
  224.            pushfd
  225.            cli
  226.            sub eax, [mem_block_arr]
  227.            shr eax, 5
  228.  
  229.            mov ebx, mem_block_map
  230.            bts [ebx], eax
  231.            shr eax, 3
  232.            and eax, not 3
  233.            add eax, ebx
  234.            cmp [mem_block_start], eax
  235.            ja @f
  236.            popfd
  237.            ret
  238. @@:
  239.            mov [mem_block_start], eax
  240.            popfd
  241.            ret
  242. .err:
  243.            xor eax, eax
  244.            popfd
  245.            ret
  246. endp
  247.  
  248. align 4
  249. proc alloc_kernel_space stdcall, size:dword
  250.            local block_ind:DWORD
  251.  
  252.            pushfd
  253.            cli
  254.  
  255.            mov eax, [size]
  256.            add eax, 0xFFF
  257.            and eax, 0xFFFFF000;
  258.            mov [size], eax
  259.  
  260.            shr eax, 12
  261.            sub eax, 1
  262.  
  263.            mov [block_ind], eax
  264.  
  265.            stdcall get_block, eax
  266.            and eax, eax
  267.            jz .error
  268.  
  269.            mov edi, eax           ;edi - pBlock
  270.  
  271.            cmp [edi+block_flags], FREE_BLOCK
  272.            jne .error
  273.  
  274.            mov [block_ind], ebx   ;index of allocated block
  275.  
  276.            mov eax, [edi+block_size]
  277.            cmp eax, [size]
  278.            je .m_eq_size
  279.  
  280.            call alloc_mem_block
  281.            and eax, eax
  282.            jz .error
  283.  
  284.            mov esi, eax           ;esi - splitted block
  285.  
  286.            mov [esi+block_next], edi
  287.            mov eax, [edi+block_prev]
  288.            mov [esi+block_prev], eax
  289.            mov [edi+block_prev], esi
  290.            mov [esi+list_next], 0
  291.            mov [esi+list_prev], 0
  292.            and eax, eax
  293.            jz @f
  294.            mov [eax+block_next], esi
  295. @@:
  296.            mov ebx, [edi+block_base]
  297.            mov [esi+block_base], ebx
  298.            mov edx, [size]
  299.            mov [esi+block_size], edx
  300.            add [edi+block_base], edx
  301.            sub [edi+block_size], edx
  302.  
  303.            mov eax, [edi+block_size]
  304.            shr eax, 12
  305.            sub eax, 1
  306.            cmp eax, 63
  307.            jna @f
  308.            mov eax, 63
  309. @@:
  310.            cmp eax, [block_ind]
  311.            je .m_eq_ind
  312.  
  313.            mov ebx, [edi+list_next]
  314.            test ebx, ebx
  315.            jz @f
  316.  
  317.            mov [ebx+list_prev], edi
  318. @@:
  319.            mov ecx, [block_ind]
  320.            mov [mem_block_list+ecx*4], ebx
  321.  
  322.            and ebx, ebx
  323.            jnz @f
  324.            btr [mem_block_mask], ecx
  325. @@:
  326.            mov edx, [mem_block_list+eax*4]
  327.            mov [edi+list_next], edx
  328.            test edx, edx
  329.            jz @f
  330.            mov [edx+list_prev], edi
  331. @@:
  332.            mov [mem_block_list+eax*4], edi
  333.            bts [mem_block_mask], eax
  334. .m_eq_ind:
  335.            mov ebx, [mem_used_list]
  336.            mov [esi+list_next], ebx
  337.            test ebx, ebx
  338.            jz @f
  339.            mov [ebx+list_prev], esi
  340. @@:
  341.            mov [esi+block_flags], USED_BLOCK
  342.            mov [mem_used_list], esi
  343.            mov eax, [esi+block_base]
  344.            popfd
  345.            ret
  346.  
  347. .m_eq_size:
  348.            remove_from_list edi
  349.            mov [mem_block_list+ecx*4], edx
  350.            and edx, edx
  351.            jnz @f
  352.            mov ecx, [block_ind]
  353.            btr [mem_block_mask], ecx
  354. @@:
  355.            mov ebx, [mem_used_list]
  356.            mov [edi+list_next], ebx
  357.            test ebx, ebx
  358.            jnz @f
  359.            mov [ebx+list_prev], edi
  360. @@:
  361.            mov [mem_used_list], edi
  362.            mov [edi+block_flags], USED_BLOCK
  363.            mov eax, [edi+block_base]
  364.            popfd
  365.            ret
  366. .error:
  367.            xor eax, eax
  368.            popfd
  369.            ret
  370. endp
  371.  
  372. align 4
  373. proc free_kernel_space stdcall, base:dword
  374.  
  375.            mov eax, [base]
  376.            mov esi, [mem_used_list]
  377. @@:
  378.            test esi, esi
  379.            jz .fail
  380.  
  381.            cmp [esi+block_base], eax
  382.            je .found
  383.            mov esi, [esi+list_next]
  384.            jmp @b
  385. .found:
  386.            cmp [esi+block_flags], USED_BLOCK
  387.            jne .fail
  388.  
  389.            mov edi, [esi+block_next]
  390.            test edi, edi
  391.            jz .prev
  392.  
  393.            cmp [edi+block_flags], FREE_BLOCK
  394.            jne .prev
  395.  
  396.            remove_from_free edi
  397.  
  398.            mov edx, [edi+block_next]
  399.            mov [esi+block_next], edx
  400.            test edx, edx
  401.            jz @f
  402.  
  403.            mov [edx+block_prev], esi
  404. @@:
  405.            mov ecx, [edi+block_size]
  406.            add [esi+block_size], ecx
  407.  
  408.            mov eax, edi
  409.            call free_mem_block
  410. .prev:
  411.            mov edi, [esi+block_prev]
  412.            test edi, edi
  413.            jz .insert
  414.  
  415.            cmp [edi+block_flags], FREE_BLOCK
  416.            jne .insert
  417.  
  418.            remove_from_used esi
  419.  
  420.            mov edx, [esi+block_next]
  421.            mov [edi+block_next], edx
  422.            test edx, edx
  423.            jz @f
  424.            mov [edx+block_prev], edi
  425. @@:
  426.            mov eax, esi
  427.            call free_mem_block
  428.  
  429.            mov ecx, [edi+block_size]
  430.            mov eax, [esi+block_size]
  431.            add eax, ecx
  432.            mov [edi+block_size], eax
  433.  
  434.            calc_index eax
  435.            calc_index ecx
  436.            cmp eax, ecx
  437.            je .m_eq
  438.  
  439.            push ecx
  440.            remove_from_list edi
  441.            pop ecx
  442.  
  443.            cmp [mem_block_list+ecx*4], edi
  444.            jne @f
  445.            mov [mem_block_list+ecx*4], edx
  446. @@:
  447.            cmp [mem_block_list+ecx*4], 0
  448.            jne @f
  449.            btr [mem_block_mask], ecx
  450. @@:
  451.            mov esi, [mem_block_list+eax*4]
  452.            mov [mem_block_list+eax*4], edi
  453.            mov [edi+list_next], esi
  454.            test esi, esi
  455.            jz @f
  456.            mov [esi+list_prev], edi
  457. @@:
  458.            bts [mem_block_mask], eax
  459. .m_eq:
  460.            xor eax, eax
  461.            not eax
  462.            ret
  463. .insert:
  464.            remove_from_used esi
  465.  
  466.            mov eax, [esi+block_size]
  467.            calc_index eax
  468.  
  469.            mov edi, [mem_block_list+eax*4]
  470.            mov [mem_block_list+eax*4], esi
  471.            mov [esi+list_next], edi
  472.            test edi, edi
  473.            jz @f
  474.            mov [edi+list_prev], esi
  475. @@:
  476.            bts [mem_block_mask], eax
  477.            mov [esi+block_flags],FREE_BLOCK
  478.            xor eax, eax
  479.            not eax
  480.            ret
  481. .fail:
  482.            xor eax, eax
  483.            ret
  484. endp
  485.  
  486. align 4
  487. proc kernel_alloc stdcall, size:dword
  488.            locals
  489.              lin_addr    dd ?
  490.              pages_count dd ?
  491.            endl
  492.  
  493.            mov eax, [size]
  494.            add eax, 0xFFF
  495.            and eax, 0xFFFFF000;
  496.            mov [size], eax
  497.            and eax, eax
  498.            jz .error
  499.            mov ebx, eax
  500.            shr ebx, 12
  501.            mov [pages_count], ebx
  502.  
  503.            stdcall alloc_kernel_space, eax
  504.            and eax, eax
  505.            jz .error
  506.            mov [lin_addr], eax
  507.  
  508.            mov ecx, [pages_count]
  509.            mov edx, eax
  510.            mov ebx, ecx
  511.  
  512.            shr ecx, 3
  513.            jz .next
  514.  
  515.            and ebx, not 7
  516.            push ebx
  517.            stdcall alloc_pages, ebx
  518.            pop ecx                   ; yes ecx!!!
  519.            and eax, eax
  520.            jz .error
  521.  
  522.            mov edi, eax
  523.            mov edx, [lin_addr]
  524. @@:
  525.            stdcall map_page,edx,edi,dword PG_SW
  526.            add edx, 0x1000
  527.            add edi, 0x1000
  528.            dec ecx
  529.            jnz @B
  530. .next:
  531.            mov ecx, [pages_count]
  532.            and ecx, 7
  533.            jz .end
  534.  
  535. @@:        push ecx
  536.            call alloc_page
  537.            pop ecx
  538.            test eax, eax
  539.            jz .error
  540.  
  541.            stdcall map_page,edx,eax,dword PG_SW
  542.            add edx, 0x1000
  543.            dec ecx
  544.            jnz @B
  545. .end:
  546.            mov eax, [lin_addr]
  547.            ret
  548.  
  549. .error:
  550.            xor eax, eax
  551.            ret
  552. endp
  553.  
  554. align 4
  555. proc kernel_free stdcall, base:dword
  556.            locals
  557.              size  dd ?
  558.            endl
  559.  
  560.            mov eax, [base]
  561.            mov esi, [mem_used_list]
  562. @@:
  563.            test esi, esi
  564.            jz .fail
  565.  
  566.            cmp [esi+block_base], eax
  567.            je .found
  568.            mov esi, [esi+list_next]
  569.            jmp @b
  570. .found:
  571.            cmp [esi+block_flags], USED_BLOCK
  572.            jne .fail
  573.  
  574.            mov ecx, [esi+block_size];
  575.            mov [size], ecx
  576.  
  577.            stdcall free_kernel_space, [base]
  578.            test eax, eax
  579.            jz .fail
  580.  
  581.            mov ecx, [size]
  582.            mov edi, [base]
  583.  
  584.            shr ecx, 12
  585.            mov esi, edi
  586.            shr edi, 10
  587.            add edi, pages_tab
  588.            xor edx, edx
  589. .release:
  590.            mov eax, [edi]
  591.            test eax, 1
  592.            jz .next
  593.  
  594.            call free_page
  595.            mov [edi],edx
  596. .next:
  597.            invlpg [esi]
  598.            add esi, 0x1000
  599.            add edi, 4
  600.            dec ecx
  601.            jnz .release
  602. .fail:
  603.            ret
  604. endp
  605.  
  606. restore block_next
  607. restore block_prev
  608. restore block_list
  609. restore block_base
  610. restore block_size
  611. restore block_flags
  612.  
  613. ;;;;;;;;;;;;;;      USER     ;;;;;;;;;;;;;;;;;
  614.  
  615. align 4
  616. proc init_heap stdcall, heap_size:dword
  617.            locals
  618.              tab_count dd ?
  619.            endl
  620.  
  621.            mov edx, [heap_size]
  622.            and edx, edx
  623.            jz .exit
  624.            add edx, 4095
  625.            and edx, not 4095
  626.            mov [heap_size], edx
  627.            add edx, 0x003FFFFF
  628.            and edx, not 0x003FFFFF
  629.            shr edx, 22
  630.            mov [tab_count], edx
  631.  
  632.            mov ebx,[CURRENT_TASK]
  633.            shl ebx,8
  634.            mov esi, [PROC_BASE+0x8c+ebx]
  635.            add esi, 0x003FFFFF
  636.            and esi, not 0x003FFFFF
  637.            mov edi, esi
  638.            mov [PROC_BASE+0x18+ebx], esi
  639.            add esi, [heap_size]
  640.            mov [PROC_BASE+0x1C+ebx], esi
  641.  
  642.            mov eax, cr3
  643.            and eax, not 0xFFF
  644.            stdcall map_page,[current_pdir],eax,dword PG_SW
  645.  
  646.            add edi, new_app_base
  647. @@:
  648.            call alloc_page
  649.            test eax, eax
  650.            jz .exit
  651.  
  652.            stdcall map_page_table, [current_pdir], edi, eax
  653.            add edi, 0x00400000
  654.            dec edx
  655.            jnz @B
  656.  
  657.            mov ecx, [tab_count]
  658.            shl ecx, 12-2
  659.            mov ebx,[CURRENT_TASK]
  660.            shl ebx,8
  661.            mov edi, [PROC_BASE+0x18+ebx]
  662.            add edi, new_app_base
  663.            shr edi, 10
  664.            mov esi, edi
  665.            add edi, pages_tab
  666.            xor eax, eax
  667.            cld
  668.            rep stosd
  669.  
  670.            stdcall map_page,[current_pdir],dword PG_UNMAP
  671.  
  672.            mov ebx, [heap_size]
  673.            mov eax, ebx
  674.            sub eax, 4096
  675.            or ebx, FREE_BLOCK
  676.            mov [pages_tab+esi], ebx
  677.  
  678.            ret
  679. .exit:
  680.            xor eax, eax
  681.            ret
  682. endp
  683.  
  684. align 4
  685. proc user_alloc stdcall, alloc_size:dword
  686.  
  687.            mov ecx, [alloc_size]
  688.            add ecx, (4095+4096)
  689.            and ecx, not 4095
  690.  
  691.            mov ebx, [CURRENT_TASK]
  692.            shl ebx, 8
  693.            mov esi, dword [ebx+PROC_BASE+0x18]; heap_base
  694.            mov edi, dword [ebx+PROC_BASE+0x1C]; heap_top
  695.            add esi, new_app_base
  696.            add edi, new_app_base
  697.  
  698. l_0:
  699.            cmp esi, edi
  700.            jae m_exit
  701.  
  702.            mov ebx, esi
  703.            shr ebx, 12
  704.            mov eax, [pages_tab+ebx*4]
  705.            test eax, FREE_BLOCK
  706.            jz test_used
  707.            and eax, 0xFFFFF000
  708.            cmp eax, ecx    ;alloc_size
  709.            jb  m_next
  710.  
  711.            mov edx, esi
  712.            add edx, ecx
  713.            sub eax, ecx;
  714.            or eax, FREE_BLOCK
  715.            shr edx, 12
  716.            mov [pages_tab+edx*4], eax
  717.  
  718.            or ecx, USED_BLOCK
  719.            mov [pages_tab+ebx*4], ecx
  720.            shr ecx, 12
  721.            dec ecx
  722.            inc ebx
  723. @@:
  724.            mov dword [pages_tab+ebx*4], 2
  725.            inc ebx
  726.            dec ecx
  727.            jnz @B
  728.  
  729.            mov eax, esi
  730.            add eax, 4096
  731.            sub eax, new_app_base
  732.            ret
  733. m_next:
  734.            add esi, eax
  735.            jmp l_0
  736. test_used:
  737.            test eax, USED_BLOCK
  738.            jz m_exit
  739.  
  740.            and eax, 0xFFFFF000
  741.            add esi, eax
  742.            jmp l_0
  743. m_exit:
  744.            xor eax, eax
  745.            ret
  746. endp
  747.  
  748. align 4
  749. proc user_free stdcall, base:dword
  750.  
  751.            mov esi, [base]
  752.            test esi, esi
  753.            jz .exit
  754.  
  755.            sub esi, 4096
  756.            shr esi, 12
  757.            mov eax, [pages_tab+esi*4]
  758.            test eax, USED_BLOCK
  759.            jz @f
  760.  
  761.            and eax, not 4095
  762.            mov ecx, eax
  763.            or eax, FREE_BLOCK
  764.            mov [pages_tab+esi*4], eax
  765.            inc esi
  766.            sub ecx, 4096
  767.            shr ecx, 12
  768. .release:
  769.            mov eax, [pages_tab+esi*4]
  770.            call free_page
  771.            inc esi
  772.            dec ecx
  773.            jnz .release
  774. @@:
  775.            mov ebx, [CURRENT_TASK]
  776.            shl ebx, 8
  777.            mov esi, dword [ebx+PROC_BASE+0x18]; heap_base
  778.            mov edi, dword [ebx+PROC_BASE+0x1C]; heap_top
  779.            shr esi, 12
  780.            shr edi, 12
  781. @@:
  782.            mov eax, [pages_tab+esi*4]
  783.            test eax, USED_BLOCK
  784.            jz .test_free
  785.            shr eax, 12
  786.            add esi, eax
  787.            jmp @B
  788. .test_free:
  789.            test eax, FREE_BLOCK
  790.            jz .err
  791.            mov edx, eax
  792.            shr edx, 12
  793.            add edx, esi
  794.            cmp edx, edi
  795.            jae .exit
  796.  
  797.            mov ebx, [pages_tab+edx*4]
  798.            test ebx, USED_BLOCK
  799.            jz .next_free
  800.  
  801.            shr ebx, 12
  802.            add edx, ebx
  803.            mov esi, edx
  804.            jmp @B
  805. .next_free:
  806.            test ebx, FREE_BLOCK
  807.            jz .err
  808.            and dword [pages_tab+edx*4], 0
  809.            add eax, ebx
  810.            and eax, not 4095
  811.            or eax, FREE_BLOCK
  812.            mov [pages_tab+esi*4], eax
  813.            jmp @B
  814. .exit:
  815.            xor eax, eax
  816.            inc eax
  817.            ret
  818. .err:
  819.            xor eax, eax
  820.            ret
  821. endp
  822.  
  823.  
  824. ;proc new_mem_resize stdcall, new_size:dword
  825. ;
  826. ;           stdcall wait_mutex, pg_data.pg_mutex
  827. ;
  828. ;           mov edi, [new_size]
  829. ;           add edi,4095
  830. ;           and edi,not 4095
  831. ;           mov [new_size], edi
  832.  
  833. ;           mov    edx,[CURRENT_TASK]
  834. ;           shl    edx,8
  835. ;           mov    esi, [PROC_BASE+0x8c+edx]
  836. ;           add esi, 4095
  837. ;           and esi, not 4095
  838.  
  839. ;           cmp edi, esi
  840. ;           jae .expand
  841.  
  842. ;           shr edi, 12
  843. ;           shr esi, 12
  844. ;
  845. ;@@:        mov eax, [pages_tab+0x4000+edi*4]
  846. ;           test eax, 1
  847. ;           jz .next
  848. ;           mov dword [pages_tab+0x4000+edi*4], 2
  849. ;           mov ebx, edi
  850. ;           shl ebx, 12
  851. ;           invlpg [ebx+std_application_base_address]
  852. ;           call free_page
  853. ;
  854. ;.next:     add edi, 1
  855. ;           cmp edi, esi
  856. ;           jb @B
  857. ;
  858. ;.update_size:
  859.  
  860. ;           mov ebx, [new_size]
  861. ;           mov    [PROC_BASE+0x8c+edx],ebx
  862. ;
  863. ;;search threads and update
  864. ;;application memory size infomation
  865. ;           mov    ecx,[PROC_BASE+0xb8+edx]
  866. ;           mov    eax,2
  867.  
  868. ;.search_threads:
  869. ;;eax = current slot
  870. ;;ebx = new memory size
  871. ;;ecx = page directory
  872. ;           cmp    eax,[TASK_COUNT]
  873. ;           jg     .search_threads_end
  874. ;           mov    edx,eax
  875. ;           shl    edx,5
  876. ;           cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
  877. ;           jz     .search_threads_next
  878. ;           shl    edx,3
  879. ;           cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
  880. ;           jnz    .search_threads_next
  881. ;           mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
  882. ;.search_threads_next:
  883. ;           inc    eax
  884. ;           jmp    .search_threads
  885. ;.search_threads_end:
  886. ;           xor eax, eax
  887. ;           dec [pg_data.pg_mutex]
  888. ;           ret
  889. ;
  890. ;
  891. ;.expand:
  892. ;           add edi, new_app_base
  893. ;           add esi, new_app_base
  894. ;
  895. ;.grow:     call alloc_page
  896. ;           test eax, eax
  897. ;           jz .exit
  898. ;           stdcall map_page,esi,eax,dword PG_UW
  899.  
  900. ;           push edi
  901. ;           mov edi, esi
  902. ;           xor eax, eax
  903. ;           mov ecx, 1024
  904. ;           cld
  905. ;           rep stosd
  906. ;           pop edi
  907.  
  908. ;           add esi, 0x1000
  909. ;           cmp esi, edi
  910. ;           jna .grow
  911. ;           jmp .update_size
  912. ;.exit:
  913. ;           xor eax, eax
  914. ;           inc eax
  915. ;           dec [pg_data.pg_mutex]
  916. ;           ret
  917. ;endp
  918.  
  919.  
  920. align 4
  921. proc alloc_dll
  922.            pushf
  923.            cli
  924.            bsf eax, [dll_map]
  925.            jnz .find
  926.            popf
  927.            xor eax, eax
  928.            ret
  929. .find:
  930.            btr [dll_map], eax
  931.            popf
  932.            shl eax, 5
  933.            add eax, dll_tab
  934.            ret
  935. endp
  936.  
  937. align 4
  938. proc alloc_service
  939.            pushf
  940.            cli
  941.            bsf eax, [srv_map]
  942.            jnz .find
  943.            popf
  944.            xor eax, eax
  945.            ret
  946.  
  947. .find:     btr [srv_map], eax
  948.            popf
  949.            shl eax,5
  950.            add eax, srv_tab
  951.            ret
  952. endp
  953.  
  954. if NEW
  955.  
  956. align 16
  957. new_services:
  958.          cmp eax, 10
  959.          jb .fail
  960.          ja @f
  961.  
  962.          push dword [ebp+8+new_app_base]
  963.          call get_mem_info
  964.          mov [esp+36], eax
  965.          ret
  966. @@:
  967.          cmp eax, 11
  968.          ja @f
  969.  
  970.          push dword [ebp+8+new_app_base]
  971.          call init_heap
  972.          mov [esp+36], eax
  973.          ret
  974. @@:
  975.          cmp eax, 12
  976.          ja @f
  977.  
  978.          push dword [ebp+8+new_app_base]
  979.          call user_alloc
  980.          mov [esp+36], eax
  981.          ret
  982. @@:
  983.          cmp eax, 13
  984.          ja @f
  985.  
  986.          push dword [ebp+8+new_app_base]
  987.          call user_free
  988.          mov [esp+36], eax
  989.          ret
  990.  
  991. @@:
  992.          cmp eax, 14
  993.          ja @f
  994.          mov eax, [ebp+8+new_app_base]
  995.          add eax,new_app_base
  996.          stdcall get_notify, eax
  997.          ret
  998. ;@@:
  999. ;         cmp eax, 15
  1000. ;         ja @f
  1001. ;         call set_notify
  1002. ;         ret
  1003. @@:
  1004.          cmp eax, 16
  1005.          ja @f
  1006.  
  1007.          mov eax, [ebp+8+new_app_base]
  1008.          add eax, new_app_base
  1009.          stdcall get_service, eax
  1010.          mov [esp+36], eax
  1011.          ret
  1012. @@:
  1013.          cmp eax, 17
  1014.          ja @f
  1015.          stdcall srv_handler,[ebp+8+new_app_base],\
  1016.                           [ebp+12+new_app_base],\
  1017.                           [ebp+16+new_app_base]
  1018.          mov [esp+36], eax
  1019.          ret
  1020. ;@@:
  1021. ;         cmp eax, 20
  1022. ;         ja @f
  1023. ;         call CreateSound
  1024. ;         mov [esp+36], eax
  1025. ;         ret
  1026.  
  1027. @@:
  1028. .fail:
  1029.          xor eax, eax
  1030.          mov [esp+36], eax
  1031.          ret
  1032.  
  1033. proc strncmp stdcall, str1:dword, str2:dword, count:dword
  1034.  
  1035.         mov ecx,[count]
  1036.         jecxz .end
  1037.  
  1038.         mov ebx,ecx
  1039.  
  1040.         mov edi,[str1]
  1041.         mov esi,edi
  1042.         xor eax,eax
  1043.         repne scasb
  1044.         neg ecx             ; cx = count - strlen
  1045.         add ecx,ebx         ; strlen + count - strlen
  1046.  
  1047. .okay:
  1048.         mov edi,esi
  1049.         mov esi,[str2]
  1050.         repe cmpsb
  1051.         mov al,[esi-1]
  1052.         xor ecx,ecx
  1053.  
  1054.         cmp al,[edi-1]
  1055.         ja .str2_big
  1056.         je .end
  1057.  
  1058. .str1_big:
  1059.         sub ecx,2
  1060.  
  1061. .str2_big:
  1062.         not ecx
  1063. .end:
  1064.         mov eax,ecx
  1065.         ret
  1066. endp
  1067.  
  1068.  
  1069. proc get_proc stdcall, exp:dword, sz_name:dword
  1070.  
  1071.            mov edx, [exp]
  1072. .next:
  1073.            mov eax, [edx]
  1074.            test eax, eax
  1075.            jz .end
  1076.  
  1077.            push edx
  1078.            stdcall strncmp, eax, [sz_name], 16
  1079.            pop edx
  1080.            test eax, eax
  1081.            jz .ok
  1082.  
  1083.            add edx,8
  1084.            jmp .next
  1085. .ok:
  1086.            mov eax, [edx+4]
  1087. .end:
  1088.            ret
  1089. endp
  1090.  
  1091. proc link_dll stdcall, exp:dword, imp:dword
  1092.          mov esi, [imp]
  1093.  
  1094. .next:
  1095.          mov eax, [esi]
  1096.          test eax, eax
  1097.          jz .end
  1098.  
  1099.          push esi
  1100.          stdcall get_proc, [exp], eax
  1101.          pop esi
  1102.  
  1103.          test eax, eax
  1104.          jz @F
  1105.  
  1106.          mov [esi], eax
  1107. @@:
  1108.          add esi, 4
  1109.          jmp .next
  1110. .end:
  1111.          ret
  1112. endp
  1113.  
  1114. end if
  1115.  
  1116.  
  1117.  
  1118.