Rev 1710 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
431 | serge | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
1289 | diamond | 3 | ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; |
431 | serge | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
164 | serge | 7 | |
593 | mikedld | 8 | $Revision: 2014 $ |
9 | |||
10 | |||
164 | serge | 11 | struc MEM_BLOCK |
2014 | art_zh | 12 | { .next_block dd ? |
13 | .prev_block dd ? ;+4 |
||
14 | .list_fd dd ? ;+8 |
||
15 | .list_bk dd ? ;+12 |
||
16 | .base dd ? ;+16 |
||
17 | .size dd ? ;+20 |
||
18 | .flags dd ? ;+24 |
||
19 | .handle dd ? ;+28 |
||
164 | serge | 20 | } |
21 | |||
357 | serge | 22 | MEM_LIST_OFFSET equ 8 |
2014 | art_zh | 23 | FREE_BLOCK equ 4 |
24 | USED_BLOCK equ 8 |
||
546 | diamond | 25 | DONT_FREE_BLOCK equ 10h |
164 | serge | 26 | |
27 | virtual at 0 |
||
28 | MEM_BLOCK MEM_BLOCK |
||
29 | end virtual |
||
30 | |||
31 | MEM_BLOCK_SIZE equ 8*4 |
||
32 | |||
33 | block_next equ MEM_BLOCK.next_block |
||
34 | block_prev equ MEM_BLOCK.prev_block |
||
357 | serge | 35 | list_fd equ MEM_BLOCK.list_fd |
36 | list_bk equ MEM_BLOCK.list_bk |
||
164 | serge | 37 | block_base equ MEM_BLOCK.base |
38 | block_size equ MEM_BLOCK.size |
||
39 | block_flags equ MEM_BLOCK.flags |
||
40 | |||
41 | macro calc_index op |
||
2014 | art_zh | 42 | { shr op, 12 |
43 | dec op |
||
44 | cmp op, 63 |
||
45 | jna @f |
||
46 | mov op, 63 |
||
164 | serge | 47 | @@: |
48 | } |
||
49 | |||
50 | macro remove_from_list op |
||
2014 | art_zh | 51 | { mov edx, [op+list_fd] |
52 | mov ecx, [op+list_bk] |
||
53 | test edx, edx |
||
54 | jz @f |
||
55 | mov [edx+list_bk], ecx |
||
164 | serge | 56 | @@: |
2014 | art_zh | 57 | test ecx, ecx |
58 | jz @f |
||
59 | mov [ecx+list_fd], edx |
||
164 | serge | 60 | @@: |
2014 | art_zh | 61 | mov [op+list_fd],0 |
62 | mov [op+list_bk],0 |
||
164 | serge | 63 | } |
64 | |||
65 | macro remove_from_free op |
||
66 | { |
||
2014 | art_zh | 67 | remove_from_list op |
164 | serge | 68 | |
2014 | art_zh | 69 | mov eax, [op+block_size] |
70 | calc_index eax |
||
71 | cmp [mem_block_list+eax*4], op |
||
72 | jne @f |
||
73 | mov [mem_block_list+eax*4], edx |
||
164 | serge | 74 | @@: |
2014 | art_zh | 75 | cmp [mem_block_list+eax*4], 0 |
76 | jne @f |
||
77 | btr [mem_block_mask], eax |
||
164 | serge | 78 | @@: |
79 | } |
||
80 | |||
81 | macro remove_from_used op |
||
82 | { |
||
2014 | art_zh | 83 | mov edx, [op+list_fd] |
84 | mov ecx, [op+list_bk] |
||
85 | mov [edx+list_bk], ecx |
||
86 | mov [ecx+list_fd], edx |
||
87 | mov [op+list_fd], 0 |
||
88 | mov [op+list_bk], 0 |
||
164 | serge | 89 | } |
90 | |||
91 | align 4 |
||
92 | proc init_kernel_heap |
||
93 | |||
2014 | art_zh | 94 | mov ecx, 64 |
95 | mov edi, mem_block_list |
||
96 | xor eax, eax |
||
97 | cld |
||
98 | rep stosd |
||
164 | serge | 99 | |
2014 | art_zh | 100 | mov ecx, 512/4 |
101 | mov edi, mem_block_map |
||
102 | not eax |
||
103 | rep stosd |
||
164 | serge | 104 | |
2014 | art_zh | 105 | mov [mem_block_start], mem_block_map |
106 | mov [mem_block_end], mem_block_map+512 |
||
107 | mov [mem_block_arr], HEAP_BASE |
||
164 | serge | 108 | |
2014 | art_zh | 109 | mov eax, mem_used.fd-MEM_LIST_OFFSET |
110 | mov [mem_used.fd], eax |
||
111 | mov [mem_used.bk], eax |
||
357 | serge | 112 | |
1710 | art_zh | 113 | mov [KERNEL_ALLOC_FLAG], dword PG_SW |
2014 | art_zh | 114 | stdcall alloc_pages, dword 32 |
115 | mov ecx, 32 |
||
116 | mov edx, eax |
||
117 | mov edi, HEAP_BASE |
||
164 | serge | 118 | .l1: |
2014 | art_zh | 119 | stdcall map_page,edi,edx,PG_SW |
120 | add edi, 0x1000 |
||
121 | add edx, 0x1000 |
||
122 | dec ecx |
||
123 | jnz .l1 |
||
164 | serge | 124 | |
2014 | art_zh | 125 | mov edi, HEAP_BASE |
126 | mov ebx, HEAP_BASE+MEM_BLOCK_SIZE |
||
127 | xor eax, eax |
||
128 | mov [edi+block_next], ebx |
||
129 | mov [edi+block_prev], eax |
||
130 | mov [edi+list_fd], eax |
||
131 | mov [edi+list_bk], eax |
||
132 | mov [edi+block_base], HEAP_BASE |
||
133 | mov [edi+block_size], 4096*MEM_BLOCK_SIZE |
||
134 | mov [edi+block_flags], USED_BLOCK |
||
164 | serge | 135 | |
2014 | art_zh | 136 | mov [ebx+block_next], eax |
137 | mov [ebx+block_prev], eax |
||
138 | mov [ebx+list_fd], eax |
||
139 | mov [ebx+list_bk], eax |
||
140 | mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE |
||
164 | serge | 141 | |
2014 | art_zh | 142 | mov ecx, [pg_data.kernel_pages] |
143 | shl ecx, 12 |
||
144 | sub ecx, HEAP_BASE-OS_BASE+4096*MEM_BLOCK_SIZE |
||
145 | mov [heap_size], ecx |
||
146 | mov [heap_free], ecx |
||
147 | mov [ebx+block_size], ecx |
||
148 | mov [ebx+block_flags], FREE_BLOCK |
||
164 | serge | 149 | |
2014 | art_zh | 150 | mov [mem_block_mask], eax |
151 | mov [mem_block_mask+4],0x80000000 |
||
164 | serge | 152 | |
2014 | art_zh | 153 | mov [mem_block_list+63*4], ebx |
154 | mov byte [mem_block_map], 0xFC |
||
155 | and [heap_mutex], 0 |
||
156 | mov [heap_blocks], 4095 |
||
157 | mov [free_blocks], 4094 |
||
158 | ret |
||
164 | serge | 159 | endp |
160 | |||
369 | serge | 161 | ; param |
162 | ; eax= required size |
||
163 | ; |
||
164 | ; retval |
||
165 | ; edi= memory block descriptor |
||
166 | ; ebx= descriptor index |
||
167 | |||
164 | serge | 168 | align 4 |
819 | serge | 169 | get_small_block: |
2014 | art_zh | 170 | mov ecx, eax |
171 | shr ecx, 12 |
||
172 | dec ecx |
||
173 | cmp ecx, 63 |
||
174 | jle .get_index |
||
175 | mov ecx, 63 |
||
369 | serge | 176 | .get_index: |
2014 | art_zh | 177 | lea esi, [mem_block_mask] |
178 | xor ebx, ebx |
||
179 | or edx, -1 |
||
164 | serge | 180 | |
2014 | art_zh | 181 | cmp ecx, 32 |
182 | jb .bit_test |
||
164 | serge | 183 | |
2014 | art_zh | 184 | sub ecx, 32 |
185 | add ebx, 32 |
||
186 | add esi, 4 |
||
164 | serge | 187 | .bit_test: |
2014 | art_zh | 188 | shl edx, cl |
189 | and edx, [esi] |
||
369 | serge | 190 | .find: |
2014 | art_zh | 191 | bsf edi, edx |
192 | jz .high_mask |
||
193 | add ebx, edi |
||
194 | mov edi, [mem_block_list+ebx*4] |
||
369 | serge | 195 | .check_size: |
2014 | art_zh | 196 | cmp eax, [edi+block_size] |
197 | ja .next |
||
198 | ret |
||
164 | serge | 199 | |
200 | .high_mask: |
||
2014 | art_zh | 201 | add esi, 4 |
202 | cmp esi, mem_block_mask+8 |
||
203 | jae .err |
||
204 | add ebx, 32 |
||
205 | mov edx, [esi] |
||
206 | jmp .find |
||
369 | serge | 207 | .next: |
2014 | art_zh | 208 | mov edi, [edi+list_fd] |
209 | test edi, edi |
||
210 | jnz .check_size |
||
369 | serge | 211 | .err: |