Rev 380 | Rev 431 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 380 | Rev 425 | ||
---|---|---|---|
- | 1 | $Revision: 425 $ |
|
1 | struc MEM_BLOCK |
2 | |
2 | { .next_block dd ? |
3 | struc MEM_BLOCK |
3 | .prev_block dd ? ;+4 |
4 | { .next_block dd ? |
4 | .list_fd dd ? ;+8 |
5 | .prev_block dd ? ;+4 |
5 | .list_bk dd ? ;+12 |
6 | .list_fd dd ? ;+8 |
6 | .base dd ? ;+16 |
7 | .list_bk dd ? ;+12 |
7 | .size dd ? ;+20 |
8 | .base dd ? ;+16 |
8 | .flags dd ? ;+24 |
9 | .size dd ? ;+20 |
9 | .handle dd ? ;+28 |
10 | .flags dd ? ;+24 |
10 | } |
11 | .handle dd ? ;+28 |
11 | 12 | } |
|
12 | MEM_LIST_OFFSET equ 8 |
13 | |
13 | FREE_BLOCK equ 4 |
14 | MEM_LIST_OFFSET equ 8 |
14 | USED_BLOCK equ 8 |
15 | FREE_BLOCK equ 4 |
15 | 16 | USED_BLOCK equ 8 |
|
16 | virtual at 0 |
17 | |
17 | MEM_BLOCK MEM_BLOCK |
18 | virtual at 0 |
18 | end virtual |
19 | MEM_BLOCK MEM_BLOCK |
19 | 20 | end virtual |
|
20 | MEM_BLOCK_SIZE equ 8*4 |
21 | |
21 | 22 | MEM_BLOCK_SIZE equ 8*4 |
|
22 | block_next equ MEM_BLOCK.next_block |
23 | |
23 | block_prev equ MEM_BLOCK.prev_block |
24 | block_next equ MEM_BLOCK.next_block |
24 | list_fd equ MEM_BLOCK.list_fd |
25 | block_prev equ MEM_BLOCK.prev_block |
25 | list_bk equ MEM_BLOCK.list_bk |
26 | list_fd equ MEM_BLOCK.list_fd |
26 | block_base equ MEM_BLOCK.base |
27 | list_bk equ MEM_BLOCK.list_bk |
27 | block_size equ MEM_BLOCK.size |
28 | block_base equ MEM_BLOCK.base |
28 | block_flags equ MEM_BLOCK.flags |
29 | block_size equ MEM_BLOCK.size |
29 | 30 | block_flags equ MEM_BLOCK.flags |
|
30 | macro calc_index op |
31 | |
31 | { shr op, 12 |
32 | macro calc_index op |
32 | dec op |
33 | { shr op, 12 |
33 | cmp op, 63 |
34 | dec op |
34 | jna @f |
35 | cmp op, 63 |
35 | mov op, 63 |
36 | jna @f |
36 | @@: |
37 | mov op, 63 |
37 | } |
38 | @@: |
38 | 39 | } |
|
39 | macro remove_from_list op |
40 | |
40 | { mov edx, [op+list_fd] |
41 | macro remove_from_list op |
41 | mov ecx, [op+list_bk] |
42 | { mov edx, [op+list_fd] |
42 | test edx, edx |
43 | mov ecx, [op+list_bk] |
43 | jz @f |
44 | test edx, edx |
44 | mov [edx+list_bk], ecx |
45 | jz @f |
45 | @@: |
46 | mov [edx+list_bk], ecx |
46 | test ecx, ecx |
47 | @@: |
47 | jz @f |
48 | test ecx, ecx |
48 | mov [ecx+list_fd], edx |
49 | jz @f |
49 | @@: |
50 | mov [ecx+list_fd], edx |
50 | mov [op+list_fd],0 |
51 | @@: |
51 | mov [op+list_bk],0 |
52 | mov [op+list_fd],0 |
52 | } |
53 | mov [op+list_bk],0 |
53 | 54 | } |
|
54 | macro remove_from_free op |
55 | |
55 | { |
56 | macro remove_from_free op |
56 | remove_from_list op |
57 | { |
57 | 58 | remove_from_list op |
|
58 | mov eax, [op+block_size] |
59 | |
59 | calc_index eax |
60 | mov eax, [op+block_size] |
60 | cmp [mem_block_list+eax*4], op |
61 | calc_index eax |
61 | jne @f |
62 | cmp [mem_block_list+eax*4], op |
62 | mov [mem_block_list+eax*4], edx |
63 | jne @f |
63 | @@: |
64 | mov [mem_block_list+eax*4], edx |
64 | cmp [mem_block_list+eax*4], 0 |
65 | @@: |
65 | jne @f |
66 | cmp [mem_block_list+eax*4], 0 |
66 | btr [mem_block_mask], eax |
67 | jne @f |
67 | @@: |
68 | btr [mem_block_mask], eax |
68 | } |
69 | @@: |
69 | 70 | } |
|
70 | macro remove_from_used op |
71 | |
71 | { |
72 | macro remove_from_used op |
72 | mov edx, [op+list_fd] |
73 | { |
73 | mov ecx, [op+list_bk] |
74 | mov edx, [op+list_fd] |
74 | mov [edx+list_bk], ecx |
75 | mov ecx, [op+list_bk] |
75 | mov [ecx+list_fd], edx |
76 | mov [edx+list_bk], ecx |
76 | mov [op+list_fd], 0 |
77 | mov [ecx+list_fd], edx |
77 | mov [op+list_bk], 0 |
78 | mov [op+list_fd], 0 |
78 | } |
79 | mov [op+list_bk], 0 |
79 | 80 | } |
|
80 | align 4 |
81 | |
81 | proc init_kernel_heap |
82 | align 4 |
82 | 83 | proc init_kernel_heap |
|
83 | mov ecx, 64/4 |
84 | |
84 | mov edi, mem_block_list |
85 | mov ecx, 64/4 |
85 | xor eax, eax |
86 | mov edi, mem_block_list |
86 | cld |
87 | xor eax, eax |
87 | rep stosd |
88 | cld |
88 | 89 | rep stosd |
|
89 | mov ecx, 512/4 |
90 | |
90 | mov edi, mem_block_map |
91 | mov ecx, 512/4 |
91 | not eax |
92 | mov edi, mem_block_map |
92 | rep stosd |
93 | not eax |
93 | 94 | rep stosd |
|
94 | mov [mem_block_start], mem_block_map |
95 | |
95 | mov [mem_block_end], mem_block_map+512 |
96 | mov [mem_block_start], mem_block_map |
96 | mov [mem_block_arr], HEAP_BASE |
97 | mov [mem_block_end], mem_block_map+512 |
97 | 98 | mov [mem_block_arr], HEAP_BASE |
|
98 | mov eax, mem_used.fd-MEM_LIST_OFFSET |
99 | |
99 | mov [mem_used.fd], eax |
100 | mov eax, mem_used.fd-MEM_LIST_OFFSET |
100 | mov [mem_used.bk], eax |
101 | mov [mem_used.fd], eax |
101 | 102 | mov [mem_used.bk], eax |
|
102 | stdcall alloc_pages, dword 32 |
103 | |
103 | mov ecx, 32 |
104 | stdcall alloc_pages, dword 32 |
104 | mov edx, eax |
105 | mov ecx, 32 |
105 | mov edi, HEAP_BASE |
106 | mov edx, eax |
106 | .l1: |
107 | mov edi, HEAP_BASE |
107 | stdcall map_page,edi,edx,PG_SW |
108 | .l1: |
108 | add edi, 0x1000 |
109 | stdcall map_page,edi,edx,PG_SW |
109 | add edx, 0x1000 |
110 | add edi, 0x1000 |
110 | dec ecx |
111 | add edx, 0x1000 |
111 | jnz .l1 |
112 | dec ecx |
112 | 113 | jnz .l1 |
|
113 | mov edi, HEAP_BASE |
114 | |
114 | mov ebx, HEAP_BASE+MEM_BLOCK_SIZE |
115 | mov edi, HEAP_BASE |
115 | xor eax, eax |
116 | mov ebx, HEAP_BASE+MEM_BLOCK_SIZE |
116 | mov [edi+block_next], ebx |
117 | xor eax, eax |
117 | mov [edi+block_prev], eax |
118 | mov [edi+block_next], ebx |
118 | mov [edi+list_fd], eax |
119 | mov [edi+block_prev], eax |
119 | mov [edi+list_bk], eax |
120 | mov [edi+list_fd], eax |
120 | mov [edi+block_base], HEAP_BASE |
121 | mov [edi+list_bk], eax |
121 | mov [edi+block_size], 4096*MEM_BLOCK_SIZE |
122 | mov [edi+block_base], HEAP_BASE |
122 | mov [edi+block_flags], USED_BLOCK |
123 | mov [edi+block_size], 4096*MEM_BLOCK_SIZE |
123 | 124 | mov [edi+block_flags], USED_BLOCK |
|
124 | mov [ebx+block_next], eax |
125 | |
125 | mov [ebx+block_prev], eax |
126 | mov [ebx+block_next], eax |
126 | mov [ebx+list_fd], eax |
127 | mov [ebx+block_prev], eax |
127 | mov [ebx+list_bk], eax |
128 | mov [ebx+list_fd], eax |
128 | mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE |
129 | mov [ebx+list_bk], eax |
129 | 130 | mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE |
|
130 | mov ecx, [MEM_AMOUNT] |
131 | |
131 | sub ecx, HEAP_BASE + 4096*MEM_BLOCK_SIZE |
132 | mov ecx, [MEM_AMOUNT] |
132 | mov [heap_size], ecx |
133 | sub ecx, HEAP_BASE + 4096*MEM_BLOCK_SIZE |
133 | mov [heap_free], ecx |
134 | mov [heap_size], ecx |
134 | mov [ebx+block_size], ecx |
135 | mov [heap_free], ecx |
135 | mov [ebx+block_flags], FREE_BLOCK |
136 | mov [ebx+block_size], ecx |
136 | 137 | mov [ebx+block_flags], FREE_BLOCK |
|
137 | mov [mem_block_mask], eax |
138 | |
138 | mov [mem_block_mask+4],0x80000000 |
139 | mov [mem_block_mask], eax |
139 | 140 | mov [mem_block_mask+4],0x80000000 |
|
140 | mov [mem_block_list+63*4], ebx |
141 | |
141 | mov byte [mem_block_map], 0xFC |
142 | mov [mem_block_list+63*4], ebx |
142 | and [heap_mutex], 0 |
143 | mov byte [mem_block_map], 0xFC |
143 | mov [heap_blocks], 4095 |
144 | and [heap_mutex], 0 |
144 | mov [free_blocks], 4095 |
145 | mov [heap_blocks], 4095 |
145 | ret |
146 | mov [free_blocks], 4095 |
146 | endp |
147 | ret |
147 | 148 | endp |
|
148 | ; param |
149 | |
149 | ; eax= required size |
150 | ; param |
150 | ; |
151 | ; eax= required size |
151 | ; retval |
152 | ; |
152 | ; edi= memory block descriptor |
153 | ; retval |
153 | ; ebx= descriptor index |
154 | ; edi= memory block descriptor |
154 | 155 | ; ebx= descriptor index |
|
155 | align 4 |
156 | |
156 | get_block: |
157 | align 4 |
157 | mov ecx, eax |
158 | get_block: |
158 | shr ecx, 12 |
159 | mov ecx, eax |
159 | dec ecx |
160 | shr ecx, 12 |
160 | cmp ecx, 63 |
161 | dec ecx |
161 | jle .get_index |
162 | cmp ecx, 63 |
162 | mov ecx, 63 |
163 | jle .get_index |
163 | .get_index: |
164 | mov ecx, 63 |
164 | lea esi, [mem_block_mask] |
165 | .get_index: |
165 | xor ebx, ebx |
166 | lea esi, [mem_block_mask] |
166 | or edx, -1 |
167 | xor ebx, ebx |
167 | 168 | or edx, -1 |
|
168 | cmp ecx, 32 |
169 | |
169 | jb .bit_test |
170 | cmp ecx, 32 |
170 | 171 | jb .bit_test |
|
171 | sub ecx, 32 |
172 | |
172 | add ebx, 32 |
173 | sub ecx, 32 |
173 | add esi, 4 |
174 | add ebx, 32 |
174 | .bit_test: |
175 | add esi, 4 |
175 | shl edx, cl |
176 | .bit_test: |
176 | and edx, [esi] |
177 | shl edx, cl |
177 | .find: |
178 | and edx, [esi] |
178 | bsf edi, edx |
179 | .find: |
179 | jz .high_mask |
180 | bsf edi, edx |
180 | add ebx, edi |
181 | jz .high_mask |
181 | mov edi, [mem_block_list+ebx*4] |
182 | add ebx, edi |
182 | .check_size: |
183 | mov edi, [mem_block_list+ebx*4] |
183 | cmp eax, [edi+block_size] |
184 | .check_size: |
184 | ja .next |
185 | cmp eax, [edi+block_size] |
185 | ret |
186 | ja .next |
186 | 187 | ret |
|
187 | .high_mask: |
188 | |
188 | add esi, 4 |
189 | .high_mask: |
189 | cmp esi, mem_block_mask+8 |
190 | add esi, 4 |
190 | jae .err |
191 | cmp esi, mem_block_mask+8 |
191 | add ebx, 32 |
192 | jae .err |
192 | mov edx, [esi] |
193 | add ebx, 32 |
193 | jmp .find |
194 | mov edx, [esi] |
194 | .next: |
195 | jmp .find |
195 | mov edi, [edi+list_fd] |
196 | .next: |
196 | test edi, edi |
197 | mov edi, [edi+list_fd] |
197 | jnz .check_size |
198 | test edi, edi |
198 | .err: |
199 | jnz .check_size |
199 | xor edi, edi |
200 | .err: |
200 | ret |
201 | xor edi, edi |
201 | 202 | ret |
|
202 | align 4 |
203 | |
203 | proc alloc_mem_block |
204 | align 4 |
204 | 205 | proc alloc_mem_block |
|
205 | mov ebx, [mem_block_start] |
206 | |
206 | mov ecx, [mem_block_end] |
207 | mov ebx, [mem_block_start] |
207 | .l1: |
208 | mov ecx, [mem_block_end] |
208 | bsf eax,[ebx]; |
209 | .l1: |
209 | jnz found |
210 | bsf eax,[ebx]; |
210 | add ebx,4 |
211 | jnz found |
211 | cmp ebx, ecx |
212 | add ebx,4 |
212 | jb .l1 |
213 | cmp ebx, ecx |
213 | xor eax,eax |
214 | jb .l1 |
214 | ret |
215 | xor eax,eax |
215 | 216 | ret |
|
216 | found: |
217 | |
217 | btr [ebx], eax |
218 | found: |
218 | mov [mem_block_start],ebx |
219 | btr [ebx], eax |
219 | sub ebx, mem_block_map |
220 | mov [mem_block_start],ebx |
220 | lea eax,[eax+ebx*8] |
221 | sub ebx, mem_block_map |
221 | shl eax, 5 |
222 | lea eax,[eax+ebx*8] |
222 | add eax, [mem_block_arr] |
223 | shl eax, 5 |
223 | dec [free_blocks] |
224 | add eax, [mem_block_arr] |
224 | ret |
225 | dec [free_blocks] |
225 | endp |
226 | ret |
226 | 227 | endp |
|
227 | proc free_mem_block |
228 | |
228 | mov dword [eax], 0 |
229 | proc free_mem_block |
229 | mov dword [eax+4], 0 |
230 | mov dword [eax], 0 |
230 | mov dword [eax+8], 0 |
231 | mov dword [eax+4], 0 |
231 | mov dword [eax+12], 0 |
232 | mov dword [eax+8], 0 |
232 | mov dword [eax+16], 0 |
233 | mov dword [eax+12], 0 |
233 | ; mov dword [eax+20], 0 |
234 | mov dword [eax+16], 0 |
234 | mov dword [eax+24], 0 |
235 | ; mov dword [eax+20], 0 |
235 | mov dword [eax+28], 0 |
236 | mov dword [eax+24], 0 |
236 | 237 | mov dword [eax+28], 0 |
|
237 | sub eax, [mem_block_arr] |
238 | |
238 | shr eax, 5 |
239 | sub eax, [mem_block_arr] |
239 | 240 | shr eax, 5 |
|
240 | mov ebx, mem_block_map |
241 | |
241 | bts [ebx], eax |
242 | mov ebx, mem_block_map |
242 | inc [free_blocks] |
243 | bts [ebx], eax |
243 | shr eax, 3 |
244 | inc [free_blocks] |
244 | and eax, not 3 |
245 | shr eax, 3 |
245 | add eax, ebx |
246 | and eax, not 3 |
246 | cmp [mem_block_start], eax |
247 | add eax, ebx |
247 | ja @f |
248 | cmp [mem_block_start], eax |
248 | ret |
249 | ja @f |
249 | @@: |
250 | ret |
250 | mov [mem_block_start], eax |
251 | @@: |
251 | ret |
252 | mov [mem_block_start], eax |
252 | .err: |
253 | ret |
253 | xor eax, eax |
254 | .err: |
254 | ret |
255 | xor eax, eax |
255 | endp |
256 | ret |
256 | 257 | endp |
|
257 | align 4 |
258 | |
258 | proc alloc_kernel_space stdcall, size:dword |
259 | align 4 |
259 | local block_ind:DWORD |
260 | proc alloc_kernel_space stdcall, size:dword |
260 | 261 | local block_ind:DWORD |
|
261 | mov eax, [size] |
262 | |
262 | add eax, 4095 |
263 | mov eax, [size] |
263 | and eax, not 4095 |
264 | add eax, 4095 |
264 | mov [size], eax |
265 | and eax, not 4095 |
265 | 266 | mov [size], eax |
|
266 | mov ebx, heap_mutex |
267 | |
267 | call wait_mutex ;ebx |
268 | mov ebx, heap_mutex |
268 | 269 | call wait_mutex ;ebx |
|
269 | cmp eax, [heap_free] |
270 | |
270 | ja .error |
271 | cmp eax, [heap_free] |
271 | 272 | ja .error |
|
272 | call get_block ; eax |
273 | |
273 | test edi, edi |
274 | call get_block ; eax |
274 | jz .error |
275 | test edi, edi |
275 | 276 | jz .error |
|
276 | cmp [edi+block_flags], FREE_BLOCK |
277 | |
277 | jne .error |
278 | cmp [edi+block_flags], FREE_BLOCK |
278 | 279 | jne .error |
|
279 | mov [block_ind], ebx ;index of allocated block |
280 | |
280 | 281 | mov [block_ind], ebx ;index of allocated block |
|
281 | mov eax, [edi+block_size] |
282 | |
282 | cmp eax, [size] |
283 | mov eax, [edi+block_size] |
283 | je .m_eq_size |
284 | cmp eax, [size] |
284 | 285 | je .m_eq_size |
|
285 | call alloc_mem_block |
286 | |
286 | and eax, eax |
287 | call alloc_mem_block |
287 | jz .error |
288 | and eax, eax |
288 | 289 | jz .error |
|
289 | mov esi, eax ;esi - splitted block |
290 | |
290 | 291 | mov esi, eax ;esi - splitted block |
|
291 | mov [esi+block_next], edi |
292 | |
292 | mov eax, [edi+block_prev] |
293 | mov [esi+block_next], edi |
293 | mov [esi+block_prev], eax |
294 | mov eax, [edi+block_prev] |
294 | mov [edi+block_prev], esi |
295 | mov [esi+block_prev], eax |
295 | mov [esi+list_fd], 0 |
296 | mov [edi+block_prev], esi |
296 | mov [esi+list_bk], 0 |
297 | mov [esi+list_fd], 0 |
297 | and eax, eax |
298 | mov [esi+list_bk], 0 |
298 | jz @f |
299 | and eax, eax |
299 | mov [eax+block_next], esi |
300 | jz @f |
300 | @@: |
301 | mov [eax+block_next], esi |
301 | mov ebx, [edi+block_base] |
302 | @@: |
302 | mov [esi+block_base], ebx |
303 | mov ebx, [edi+block_base] |
303 | mov edx, [size] |
304 | mov [esi+block_base], ebx |
304 | mov [esi+block_size], edx |
305 | mov edx, [size] |
305 | add [edi+block_base], edx |
306 | mov [esi+block_size], edx |
306 | sub [edi+block_size], edx |
307 | add [edi+block_base], edx |
307 | 308 | sub [edi+block_size], edx |
|
308 | mov eax, [edi+block_size] |
309 | |
309 | shr eax, 12 |
310 | mov eax, [edi+block_size] |
310 | sub eax, 1 |
311 | shr eax, 12 |
311 | cmp eax, 63 |
312 | sub eax, 1 |
312 | jna @f |
313 | cmp eax, 63 |
313 | mov eax, 63 |
314 | jna @f |
314 | @@: |
315 | mov eax, 63 |
315 | cmp eax, [block_ind] |
316 | @@: |
316 | je .m_eq_ind |
317 | cmp eax, [block_ind] |
317 | 318 | je .m_eq_ind |
|
318 | remove_from_list edi |
319 | |
319 | 320 | remove_from_list edi |
|
320 | mov ecx, [block_ind] |
321 | |
321 | mov [mem_block_list+ecx*4], edx |
322 | mov ecx, [block_ind] |
322 | 323 | mov [mem_block_list+ecx*4], edx |
|
323 | test edx, edx |
324 | |
324 | jnz @f |
325 | test edx, edx |
325 | btr [mem_block_mask], ecx |
326 | jnz @f |
326 | @@: |
327 | btr [mem_block_mask], ecx |
327 | mov edx, [mem_block_list+eax*4] |
328 | @@: |
328 | mov [edi+list_fd], edx |
329 | mov edx, [mem_block_list+eax*4] |
329 | test edx, edx |
330 | mov [edi+list_fd], edx |
330 | jz @f |
331 | test edx, edx |
331 | mov [edx+list_bk], edi |
332 | jz @f |
332 | @@: |
333 | mov [edx+list_bk], edi |
333 | mov [mem_block_list+eax*4], edi |
334 | @@: |
334 | bts [mem_block_mask], eax |
335 | mov [mem_block_list+eax*4], edi |
335 | .m_eq_ind: |
336 | bts [mem_block_mask], eax |
336 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
337 | .m_eq_ind: |
337 | mov edx, [ecx+list_fd] |
338 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
338 | mov [esi+list_fd], edx |
339 | mov edx, [ecx+list_fd] |
339 | mov [esi+list_bk], ecx |
340 | mov [esi+list_fd], edx |
340 | mov [ecx+list_fd], esi |
341 | mov [esi+list_bk], ecx |
341 | mov [edx+list_bk], esi |
342 | mov [ecx+list_fd], esi |
342 | 343 | mov [edx+list_bk], esi |
|
343 | mov [esi+block_flags], USED_BLOCK |
344 | |
344 | mov eax, [esi+block_base] |
345 | mov [esi+block_flags], USED_BLOCK |
345 | mov ebx, [size] |
346 | mov eax, [esi+block_base] |
346 | sub [heap_free], ebx |
347 | mov ebx, [size] |
347 | and [heap_mutex], 0 |
348 | sub [heap_free], ebx |
348 | ret |
349 | and [heap_mutex], 0 |
349 | .m_eq_size: |
350 | ret |
350 | remove_from_list edi |
351 | .m_eq_size: |
351 | mov [mem_block_list+ebx*4], edx |
352 | remove_from_list edi |
352 | and edx, edx |
353 | mov [mem_block_list+ebx*4], edx |
353 | jnz @f |
354 | and edx, edx |
354 | btr [mem_block_mask], ebx |
355 | jnz @f |
355 | @@: |
356 | btr [mem_block_mask], ebx |
356 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
357 | @@: |
357 | mov edx, [ecx+list_fd] |
358 | mov ecx, mem_used.fd-MEM_LIST_OFFSET |
358 | mov [edi+list_fd], edx |
359 | mov edx, [ecx+list_fd] |
359 | mov [edi+list_bk], ecx |
360 | mov [edi+list_fd], edx |
360 | mov [ecx+list_fd], edi |
361 | mov [edi+list_bk], ecx |
361 | mov [edx+list_bk], edi |
362 | mov [ecx+list_fd], edi |
362 | 363 | mov [edx+list_bk], edi |
|
363 | mov [edi+block_flags], USED_BLOCK |
364 | |
364 | mov eax, [edi+block_base] |
365 | mov [edi+block_flags], USED_BLOCK |
365 | mov ebx, [size] |
366 | mov eax, [edi+block_base] |
366 | sub [heap_free], ebx |
367 | mov ebx, [size] |
367 | and [heap_mutex], 0 |
368 | sub [heap_free], ebx |
368 | ret |
369 | and [heap_mutex], 0 |
369 | .error: |
370 | ret |
370 | xor eax, eax |
371 | .error: |
371 | mov [heap_mutex], eax |
372 | xor eax, eax |
372 | ret |
373 | mov [heap_mutex], eax |
373 | endp |
374 | ret |
374 | 375 | endp |
|
375 | align 4 |
376 | |
376 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
377 | align 4 |
377 | 378 | proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword |
|
378 | mov ebx, heap_mutex |
379 | |
379 | call wait_mutex ;ebx |
380 | mov ebx, heap_mutex |
380 | 381 | call wait_mutex ;ebx |
|
381 | mov eax, [base] |
382 | |
382 | mov esi, [mem_used.fd] |
383 | mov eax, [base] |
383 | @@: |
384 | mov esi, [mem_used.fd] |
384 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
385 | @@: |
385 | je .fail |
386 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
386 | 387 | je .fail |
|
387 | cmp [esi+block_base], eax |
388 | |
388 | je .found |
389 | cmp [esi+block_base], eax |
389 | mov esi, [esi+list_fd] |
390 | je .found |
390 | jmp @b |
391 | mov esi, [esi+list_fd] |
391 | .found: |
392 | jmp @b |
392 | cmp [esi+block_flags], USED_BLOCK |
393 | .found: |
393 | jne .fail |
394 | cmp [esi+block_flags], USED_BLOCK |
394 | 395 | jne .fail |
|
395 | mov eax, [esi+block_size] |
396 | |
396 | add [heap_free], eax |
397 | mov eax, [esi+block_size] |
397 | 398 | add [heap_free], eax |
|
398 | mov edi, [esi+block_next] |
399 | |
399 | test edi, edi |
400 | mov edi, [esi+block_next] |
400 | jz .prev |
401 | test edi, edi |
401 | 402 | jz .prev |
|
402 | cmp [edi+block_flags], FREE_BLOCK |
403 | |
403 | jne .prev |
404 | cmp [edi+block_flags], FREE_BLOCK |
404 | 405 | jne .prev |
|
405 | remove_from_free edi |
406 | |
406 | 407 | remove_from_free edi |
|
407 | mov edx, [edi+block_next] |
408 | |
408 | mov [esi+block_next], edx |
409 | mov edx, [edi+block_next] |
409 | test edx, edx |
410 | mov [esi+block_next], edx |
410 | jz @f |
411 | test edx, edx |
411 | 412 | jz @f |
|
412 | mov [edx+block_prev], esi |
413 | |
413 | @@: |
414 | mov [edx+block_prev], esi |
414 | mov ecx, [edi+block_size] |
415 | @@: |
415 | add [esi+block_size], ecx |
416 | mov ecx, [edi+block_size] |
416 | 417 | add [esi+block_size], ecx |
|
417 | mov eax, edi |
418 | |
418 | call free_mem_block |
419 | mov eax, edi |
419 | .prev: |
420 | call free_mem_block |
420 | mov edi, [esi+block_prev] |
421 | .prev: |
421 | test edi, edi |
422 | mov edi, [esi+block_prev] |
422 | jz .insert |
423 | test edi, edi |
423 | 424 | jz .insert |
|
424 | cmp [edi+block_flags], FREE_BLOCK |
425 | |
425 | jne .insert |
426 | cmp [edi+block_flags], FREE_BLOCK |
426 | 427 | jne .insert |
|
427 | remove_from_used esi |
428 | |
428 | 429 | remove_from_used esi |
|
429 | mov edx, [esi+block_next] |
430 | |
430 | mov [edi+block_next], edx |
431 | mov edx, [esi+block_next] |
431 | test edx, edx |
432 | mov [edi+block_next], edx |
432 | jz @f |
433 | test edx, edx |
433 | mov [edx+block_prev], edi |
434 | jz @f |
434 | @@: |
435 | mov [edx+block_prev], edi |
435 | mov eax, esi |
436 | @@: |
436 | call free_mem_block |
437 | mov eax, esi |
437 | 438 | call free_mem_block |
|
438 | mov ecx, [edi+block_size] |
439 | |
439 | mov eax, [esi+block_size] |
440 | mov ecx, [edi+block_size] |
440 | add eax, ecx |
441 | mov eax, [esi+block_size] |
441 | mov [edi+block_size], eax |
442 | add eax, ecx |
442 | 443 | mov [edi+block_size], eax |
|
443 | calc_index eax |
444 | |
444 | calc_index ecx |
445 | calc_index eax |
445 | cmp eax, ecx |
446 | calc_index ecx |
446 | je .m_eq |
447 | cmp eax, ecx |
447 | 448 | je .m_eq |
|
448 | push ecx |
449 | |
449 | remove_from_list edi |
450 | push ecx |
450 | pop ecx |
451 | remove_from_list edi |
451 | 452 | pop ecx |
|
452 | cmp [mem_block_list+ecx*4], edi |
453 | |
453 | jne @f |
454 | cmp [mem_block_list+ecx*4], edi |
454 | mov [mem_block_list+ecx*4], edx |
455 | jne @f |
455 | @@: |
456 | mov [mem_block_list+ecx*4], edx |
456 | cmp [mem_block_list+ecx*4], 0 |
457 | @@: |
457 | jne @f |
458 | cmp [mem_block_list+ecx*4], 0 |
458 | btr [mem_block_mask], ecx |
459 | jne @f |
459 | @@: |
460 | btr [mem_block_mask], ecx |
460 | mov esi, [mem_block_list+eax*4] |
461 | @@: |
461 | mov [mem_block_list+eax*4], edi |
462 | mov esi, [mem_block_list+eax*4] |
462 | mov [edi+list_fd], esi |
463 | mov [mem_block_list+eax*4], edi |
463 | test esi, esi |
464 | mov [edi+list_fd], esi |
464 | jz @f |
465 | test esi, esi |
465 | mov [esi+list_bk], edi |
466 | jz @f |
466 | @@: |
467 | mov [esi+list_bk], edi |
467 | bts [mem_block_mask], eax |
468 | @@: |
468 | .m_eq: |
469 | bts [mem_block_mask], eax |
469 | xor eax, eax |
470 | .m_eq: |
470 | mov [heap_mutex], eax |
471 | xor eax, eax |
471 | dec eax |
472 | mov [heap_mutex], eax |
472 | ret |
473 | dec eax |
473 | .insert: |
474 | ret |
474 | remove_from_used esi |
475 | .insert: |
475 | 476 | remove_from_used esi |
|
476 | mov eax, [esi+block_size] |
477 | |
477 | calc_index eax |
478 | mov eax, [esi+block_size] |
478 | 479 | calc_index eax |
|
479 | mov edi, [mem_block_list+eax*4] |
480 | |
480 | mov [mem_block_list+eax*4], esi |
481 | mov edi, [mem_block_list+eax*4] |
481 | mov [esi+list_fd], edi |
482 | mov [mem_block_list+eax*4], esi |
482 | test edi, edi |
483 | mov [esi+list_fd], edi |
483 | jz @f |
484 | test edi, edi |
484 | mov [edi+list_bk], esi |
485 | jz @f |
485 | @@: |
486 | mov [edi+list_bk], esi |
486 | bts [mem_block_mask], eax |
487 | @@: |
487 | mov [esi+block_flags],FREE_BLOCK |
488 | bts [mem_block_mask], eax |
488 | xor eax, eax |
489 | mov [esi+block_flags],FREE_BLOCK |
489 | mov [heap_mutex], eax |
490 | xor eax, eax |
490 | dec eax |
491 | mov [heap_mutex], eax |
491 | ret |
492 | dec eax |
492 | .fail: |
493 | ret |
493 | xor eax, eax |
494 | .fail: |
494 | mov [heap_mutex], eax |
495 | xor eax, eax |
495 | ret |
496 | mov [heap_mutex], eax |
496 | endp |
497 | ret |
497 | 498 | endp |
|
498 | align 4 |
499 | |
499 | proc kernel_alloc stdcall, size:dword |
500 | align 4 |
500 | locals |
501 | proc kernel_alloc stdcall, size:dword |
501 | lin_addr dd ? |
502 | locals |
502 | pages_count dd ? |
503 | lin_addr dd ? |
503 | endl |
504 | pages_count dd ? |
504 | 505 | endl |
|
505 | mov eax, [size] |
506 | |
506 | add eax, 4095 |
507 | mov eax, [size] |
507 | and eax, not 4095; |
508 | add eax, 4095 |
508 | mov [size], eax |
509 | and eax, not 4095; |
509 | and eax, eax |
510 | mov [size], eax |
510 | jz .err |
511 | and eax, eax |
511 | mov ebx, eax |
512 | jz .err |
512 | shr ebx, 12 |
513 | mov ebx, eax |
513 | mov [pages_count], ebx |
514 | shr ebx, 12 |
514 | 515 | mov [pages_count], ebx |
|
515 | stdcall alloc_kernel_space, eax |
516 | |
516 | test eax, eax |
517 | stdcall alloc_kernel_space, eax |
517 | jz .err |
518 | test eax, eax |
518 | mov [lin_addr], eax |
519 | jz .err |
519 | 520 | mov [lin_addr], eax |
|
520 | mov ecx, [pages_count] |
521 | |
521 | mov edx, eax |
522 | mov ecx, [pages_count] |
522 | mov ebx, ecx |
523 | mov edx, eax |
523 | 524 | mov ebx, ecx |
|
524 | shr ecx, 3 |
525 | |
525 | jz .next |
526 | shr ecx, 3 |
526 | 527 | jz .next |
|
527 | and ebx, not 7 |
528 | |
528 | push ebx |
529 | and ebx, not 7 |
529 | stdcall alloc_pages, ebx |
530 | push ebx |
530 | pop ecx ; yes ecx!!! |
531 | stdcall alloc_pages, ebx |
531 | and eax, eax |
532 | pop ecx ; yes ecx!!! |
532 | jz .err |
533 | and eax, eax |
533 | 534 | jz .err |
|
534 | mov edi, eax |
535 | |
535 | mov edx, [lin_addr] |
536 | mov edi, eax |
536 | @@: |
537 | mov edx, [lin_addr] |
537 | stdcall map_page,edx,edi,dword PG_SW |
538 | @@: |
538 | add edx, 0x1000 |
539 | stdcall map_page,edx,edi,dword PG_SW |
539 | add edi, 0x1000 |
540 | add edx, 0x1000 |
540 | dec ecx |
541 | add edi, 0x1000 |
541 | jnz @B |
542 | dec ecx |
542 | .next: |
543 | jnz @B |
543 | mov ecx, [pages_count] |
544 | .next: |
544 | and ecx, 7 |
545 | mov ecx, [pages_count] |
545 | jz .end |
546 | and ecx, 7 |
546 | @@: |
547 | jz .end |
547 | push ecx |
548 | @@: |
548 | call alloc_page |
549 | push ecx |
549 | pop ecx |
550 | call alloc_page |
550 | test eax, eax |
551 | pop ecx |
551 | jz .err |
552 | test eax, eax |
552 | 553 | jz .err |
|
553 | stdcall map_page,edx,eax,dword PG_SW |
554 | |
554 | add edx, 0x1000 |
555 | stdcall map_page,edx,eax,dword PG_SW |
555 | dec ecx |
556 | add edx, 0x1000 |
556 | jnz @B |
557 | dec ecx |
557 | .end: |
558 | jnz @B |
558 | mov eax, [lin_addr] |
559 | .end: |
559 | ret |
560 | mov eax, [lin_addr] |
560 | .err: |
561 | ret |
561 | xor eax, eax |
562 | .err: |
562 | ret |
563 | xor eax, eax |
563 | endp |
564 | ret |
564 | 565 | endp |
|
565 | align 4 |
566 | |
566 | proc kernel_free stdcall, base:dword |
567 | align 4 |
567 | push ebx esi |
568 | proc kernel_free stdcall, base:dword |
568 | 569 | push ebx esi |
|
569 | mov ebx, heap_mutex |
570 | |
570 | call wait_mutex ;ebx |
571 | mov ebx, heap_mutex |
571 | 572 | call wait_mutex ;ebx |
|
572 | mov eax, [base] |
573 | |
573 | mov esi, [mem_used.fd] |
574 | mov eax, [base] |
574 | @@: |
575 | mov esi, [mem_used.fd] |
575 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
576 | @@: |
576 | je .fail |
577 | cmp esi, mem_used.fd-MEM_LIST_OFFSET |
577 | 578 | je .fail |
|
578 | cmp [esi+block_base], eax |
579 | |
579 | je .found |
580 | cmp [esi+block_base], eax |
580 | mov esi, [esi+list_fd] |
581 | je .found |
581 | jmp @b |
582 | mov esi, [esi+list_fd] |
582 | .found: |
583 | jmp @b |
583 | cmp [esi+block_flags], USED_BLOCK |
584 | .found: |
584 | jne .fail |
585 | cmp [esi+block_flags], USED_BLOCK |
585 | 586 | jne .fail |
|
586 | and [heap_mutex], 0 |
587 | |
587 | 588 | and [heap_mutex], 0 |
|
588 | push ecx |
589 | |
589 | mov ecx, [esi+block_size]; |
590 | push ecx |
590 | shr ecx, 12 |
591 | mov ecx, [esi+block_size]; |
591 | call release_pages ;eax, ecx |
592 | shr ecx, 12 |
592 | pop ecx |
593 | call release_pages ;eax, ecx |
593 | stdcall free_kernel_space, [base] |
594 | pop ecx |
594 | pop esi ebx |
595 | stdcall free_kernel_space, [base] |
595 | ret |
596 | pop esi ebx |
596 | .fail: |
597 | ret |
597 | and [heap_mutex], 0 |
598 | .fail: |
598 | pop esi ebx |
599 | and [heap_mutex], 0 |
599 | ret |
600 | pop esi ebx |
600 | endp |
601 | ret |
601 | 602 | endp |
|
602 | restore block_next |
603 | |
603 | restore block_prev |
604 | restore block_next |
604 | restore block_list |
605 | restore block_prev |
605 | restore block_base |
606 | restore block_list |
606 | restore block_size |
607 | restore block_base |
607 | restore block_flags |
608 | restore block_size |
608 | 609 | restore block_flags |
|
609 | ;;;;;;;;;;;;;; USER ;;;;;;;;;;;;;;;;; |
610 | |
610 | 611 | ;;;;;;;;;;;;;; USER ;;;;;;;;;;;;;;;;; |
|
611 | HEAP_TOP equ 0x5FC00000 |
612 | |
612 | 613 | HEAP_TOP equ 0x5FC00000 |
|
613 | align 4 |
614 | |
614 | proc init_heap |
615 | align 4 |
615 | 616 | proc init_heap |
|
616 | mov ebx,[CURRENT_TASK] |
617 | |
617 | shl ebx,8 |
618 | mov ebx,[CURRENT_TASK] |
618 | mov eax, [SLOT_BASE+APPDATA.heap_top+ebx] |
619 | shl ebx,8 |
619 | test eax, eax |
620 | mov eax, [SLOT_BASE+APPDATA.heap_top+ebx] |
620 | jz @F |
621 | test eax, eax |
621 | sub eax,[SLOT_BASE+APPDATA.heap_base+ebx] |
622 | jz @F |
622 | sub eax, 4096 |
623 | sub eax,[SLOT_BASE+APPDATA.heap_base+ebx] |
623 | ret |
624 | sub eax, 4096 |
624 | @@: |
625 | ret |
625 | mov esi, [SLOT_BASE+APPDATA.mem_size+ebx] |
626 | @@: |
626 | add esi, 4095 |
627 | mov esi, [SLOT_BASE+APPDATA.mem_size+ebx] |
627 | and esi, not 4095 |
628 | add esi, 4095 |
628 | mov [SLOT_BASE+APPDATA.mem_size+ebx], esi |
629 | and esi, not 4095 |
629 | mov eax, HEAP_TOP |
630 | mov [SLOT_BASE+APPDATA.mem_size+ebx], esi |
630 | mov [SLOT_BASE+APPDATA.heap_base+ebx], esi |
631 | mov eax, HEAP_TOP |
631 | mov [SLOT_BASE+APPDATA.heap_top+ebx], eax |
632 | mov [SLOT_BASE+APPDATA.heap_base+ebx], esi |
632 | 633 | mov [SLOT_BASE+APPDATA.heap_top+ebx], eax |
|
633 | sub eax, esi |
634 | |
634 | add esi, new_app_base |
635 | sub eax, esi |
635 | shr esi, 10 |
636 | add esi, new_app_base |
636 | mov ecx, eax |
637 | shr esi, 10 |
637 | sub eax, 4096 |
638 | mov ecx, eax |
638 | or ecx, FREE_BLOCK |
639 | sub eax, 4096 |
639 | mov [page_tabs+esi], ecx |
640 | or ecx, FREE_BLOCK |
640 | ret |
641 | mov [page_tabs+esi], ecx |
641 | .exit: |
642 | ret |
642 | xor eax, eax |
643 | .exit: |
643 | ret |
644 | xor eax, eax |
644 | endp |
645 | ret |
645 | 646 | endp |
|
646 | align 4 |
647 | |
647 | proc user_alloc stdcall, alloc_size:dword |
648 | align 4 |
648 | 649 | proc user_alloc stdcall, alloc_size:dword |
|
649 | mov ecx, [alloc_size] |
650 | |
650 | add ecx, (4095+4096) |
651 | mov ecx, [alloc_size] |
651 | and ecx, not 4095 |
652 | add ecx, (4095+4096) |
652 | 653 | and ecx, not 4095 |
|
653 | mov ebx, [CURRENT_TASK] |
654 | |
654 | shl ebx, 8 |
655 | mov ebx, [CURRENT_TASK] |
655 | mov esi, dword [ebx+SLOT_BASE+APPDATA.heap_base]; heap_base |
656 | shl ebx, 8 |
656 | mov edi, dword [ebx+SLOT_BASE+APPDATA.heap_top]; heap_top |
657 | mov esi, dword [ebx+SLOT_BASE+APPDATA.heap_base]; heap_base |
657 | add esi, new_app_base |
658 | mov edi, dword [ebx+SLOT_BASE+APPDATA.heap_top]; heap_top |
658 | add edi, new_app_base |
659 | add esi, new_app_base |
659 | l_0: |
660 | add edi, new_app_base |
660 | cmp esi, edi |
661 | l_0: |
661 | jae m_exit |
662 | cmp esi, edi |
662 | 663 | jae m_exit |
|
663 | mov ebx, esi |
664 | |
664 | shr ebx, 12 |
665 | mov ebx, esi |
665 | mov eax, [page_tabs+ebx*4] |
666 | shr ebx, 12 |
666 | test eax, FREE_BLOCK |
667 | mov eax, [page_tabs+ebx*4] |
667 | jz test_used |
668 | test eax, FREE_BLOCK |
668 | and eax, 0xFFFFF000 |
669 | jz test_used |
669 | cmp eax, ecx ;alloc_size |
670 | and eax, 0xFFFFF000 |
670 | jb m_next |
671 | cmp eax, ecx ;alloc_size |
671 | jz @f |
672 | jb m_next |
672 | 673 | jz @f |
|
673 | mov edx, esi |
674 | |
674 | add edx, ecx |
675 | mov edx, esi |
675 | sub eax, ecx; |
676 | add edx, ecx |
676 | or eax, FREE_BLOCK |
677 | sub eax, ecx; |
677 | shr edx, 12 |
678 | or eax, FREE_BLOCK |
678 | mov [page_tabs+edx*4], eax |
679 | shr edx, 12 |
679 | 680 | mov [page_tabs+edx*4], eax |
|
680 | @@: |
681 | |
681 | or ecx, USED_BLOCK |
682 | @@: |
682 | mov [page_tabs+ebx*4], ecx |
683 | or ecx, USED_BLOCK |
683 | shr ecx, 12 |
684 | mov [page_tabs+ebx*4], ecx |
684 | dec ecx |
685 | shr ecx, 12 |
685 | inc ebx |
686 | dec ecx |
686 | @@: |
687 | inc ebx |
687 | mov dword [page_tabs+ebx*4], 2 |
688 | @@: |
688 | inc ebx |
689 | mov dword [page_tabs+ebx*4], 2 |
689 | dec ecx |
690 | inc ebx |
690 | jnz @B |
691 | dec ecx |
691 | 692 | jnz @B |
|
692 | mov edx, [CURRENT_TASK] |
693 | |
693 | shl edx, 8 |
694 | mov edx, [CURRENT_TASK] |
694 | mov ebx, [alloc_size] |
695 | shl edx, 8 |
695 | add ebx, 0xFFF |
696 | mov ebx, [alloc_size] |
696 | and ebx, not 0xFFF |
697 | add ebx, 0xFFF |
697 | add ebx, [SLOT_BASE+APPDATA.mem_size+edx] |
698 | and ebx, not 0xFFF |
698 | call update_mem_size |
699 | add ebx, [SLOT_BASE+APPDATA.mem_size+edx] |
699 | 700 | call update_mem_size |
|
700 | mov eax, esi |
701 | |
701 | add eax, 4096 |
702 | mov eax, esi |
702 | sub eax, new_app_base |
703 | add eax, 4096 |
703 | ret |
704 | sub eax, new_app_base |
704 | m_next: |
705 | ret |
705 | add esi, eax |
706 | m_next: |
706 | jmp l_0 |
707 | add esi, eax |
707 | test_used: |
708 | jmp l_0 |
708 | test eax, USED_BLOCK |
709 | test_used: |
709 | jz m_exit |
710 | test eax, USED_BLOCK |
710 | 711 | jz m_exit |
|
711 | and eax, 0xFFFFF000 |
712 | |
712 | add esi, eax |
713 | and eax, 0xFFFFF000 |
713 | jmp l_0 |
714 | add esi, eax |
714 | m_exit: |
715 | jmp l_0 |
715 | xor eax, eax |
716 | m_exit: |
716 | ret |
717 | xor eax, eax |
717 | endp |
718 | ret |
718 | 719 | endp |
|
719 | align 4 |
720 | |
720 | proc user_free stdcall, base:dword |
721 | align 4 |
721 | 722 | proc user_free stdcall, base:dword |
|
722 | mov esi, [base] |
723 | |
723 | test esi, esi |
724 | mov esi, [base] |
724 | jz .exit |
725 | test esi, esi |
725 | 726 | jz .exit |
|
726 | xor ebx, ebx |
727 | |
727 | sub esi, 4096 |
728 | xor ebx, ebx |
728 | shr esi, 12 |
729 | sub esi, 4096 |
729 | mov eax, [page_tabs+esi*4] |
730 | shr esi, 12 |
730 | test eax, USED_BLOCK |
731 | mov eax, [page_tabs+esi*4] |
731 | jz .not_used |
732 | test eax, USED_BLOCK |
732 | 733 | jz .not_used |
|
733 | and eax, not 4095 |
734 | |
734 | mov ecx, eax |
735 | and eax, not 4095 |
735 | or eax, FREE_BLOCK |
736 | mov ecx, eax |
736 | mov [page_tabs+esi*4], eax |
737 | or eax, FREE_BLOCK |
737 | inc esi |
738 | mov [page_tabs+esi*4], eax |
738 | sub ecx, 4096 |
739 | inc esi |
739 | shr ecx, 12 |
740 | sub ecx, 4096 |
740 | mov ebx, ecx |
741 | shr ecx, 12 |
741 | .release: |
742 | mov ebx, ecx |
742 | xor eax, eax |
743 | .release: |
743 | xchg eax, [page_tabs+esi*4] |
744 | xor eax, eax |
744 | test eax, 1 |
745 | xchg eax, [page_tabs+esi*4] |
745 | jz @F |
746 | test eax, 1 |
746 | call free_page |
747 | jz @F |
747 | @@: |
748 | call free_page |
748 | inc esi |
749 | @@: |
749 | dec ecx |
750 | inc esi |
750 | jnz .release |
751 | dec ecx |
751 | .not_used: |
752 | jnz .release |
752 | mov edx, [CURRENT_TASK] |
753 | .not_used: |
753 | shl edx, 8 |
754 | mov edx, [CURRENT_TASK] |
754 | mov esi, dword [edx+SLOT_BASE+APPDATA.heap_base]; heap_base |
755 | shl edx, 8 |
755 | mov edi, dword [edx+SLOT_BASE+APPDATA.heap_top]; heap_top |
756 | mov esi, dword [edx+SLOT_BASE+APPDATA.heap_base]; heap_base |
756 | sub ebx, [edx+SLOT_BASE+APPDATA.mem_size] |
757 | mov edi, dword [edx+SLOT_BASE+APPDATA.heap_top]; heap_top |
757 | neg ebx |
758 | sub ebx, [edx+SLOT_BASE+APPDATA.mem_size] |
758 | call update_mem_size |
759 | neg ebx |
759 | add esi, new_app_base |
760 | call update_mem_size |
760 | add edi, new_app_base |
761 | add esi, new_app_base |
761 | shr esi, 12 |
762 | add edi, new_app_base |
762 | shr edi, 12 |
763 | shr esi, 12 |
763 | @@: |
764 | shr edi, 12 |
764 | mov eax, [page_tabs+esi*4] |
765 | @@: |
765 | test eax, USED_BLOCK |
766 | mov eax, [page_tabs+esi*4] |
766 | jz .test_free |
767 | test eax, USED_BLOCK |
767 | shr eax, 12 |
768 | jz .test_free |
768 | add esi, eax |
769 | shr eax, 12 |
769 | jmp @B |
770 | add esi, eax |
770 | .test_free: |
771 | jmp @B |
771 | test eax, FREE_BLOCK |
772 | .test_free: |
772 | jz .err |
773 | test eax, FREE_BLOCK |
773 | mov edx, eax |
774 | jz .err |
774 | shr edx, 12 |
775 | mov edx, eax |
775 | add edx, esi |
776 | shr edx, 12 |
776 | cmp edx, edi |
777 | add edx, esi |
777 | jae .exit |
778 | cmp edx, edi |
778 | 779 | jae .exit |
|
779 | mov ebx, [page_tabs+edx*4] |
780 | |
780 | test ebx, USED_BLOCK |
781 | mov ebx, [page_tabs+edx*4] |
781 | jz .next_free |
782 | test ebx, USED_BLOCK |
782 | 783 | jz .next_free |
|
783 | shr ebx, 12 |
784 | |
784 | add edx, ebx |
785 | shr ebx, 12 |
785 | mov esi, edx |
786 | add edx, ebx |
786 | jmp @B |
787 | mov esi, edx |
787 | .next_free: |
788 | jmp @B |
788 | test ebx, FREE_BLOCK |
789 | .next_free: |
789 | jz .err |
790 | test ebx, FREE_BLOCK |
790 | and dword [page_tabs+edx*4], 0 |
791 | jz .err |
791 | add eax, ebx |
792 | and dword [page_tabs+edx*4], 0 |
792 | and eax, not 4095 |
793 | add eax, ebx |
793 | or eax, FREE_BLOCK |
794 | and eax, not 4095 |
794 | mov [page_tabs+esi*4], eax |
795 | or eax, FREE_BLOCK |
795 | jmp @B |
796 | mov [page_tabs+esi*4], eax |
796 | .exit: |
797 | jmp @B |
797 | xor eax, eax |
798 | .exit: |
798 | inc eax |
799 | xor eax, eax |
799 | ret |
800 | inc eax |
800 | .err: |
801 | ret |
801 | xor eax, eax |
802 | .err: |
802 | ret |
803 | xor eax, eax |
803 | endp |
804 | ret |
804 | 805 | endp |
|
805 | if 0 |
806 | |
806 | align 4 |
807 | if 0 |
807 | proc alloc_dll |
808 | align 4 |
808 | pushf |
809 | proc alloc_dll |
809 | cli |
810 | pushf |
810 | bsf eax, [dll_map] |
811 | cli |
811 | jnz .find |
812 | bsf eax, [dll_map] |
812 | popf |
813 | jnz .find |
813 | xor eax, eax |
814 | popf |
814 | ret |
815 | xor eax, eax |
815 | .find: |
816 | ret |
816 | btr [dll_map], eax |
817 | .find: |
817 | popf |
818 | btr [dll_map], eax |
818 | shl eax, 5 |
819 | popf |
819 | add eax, dll_tab |
820 | shl eax, 5 |
820 | ret |
821 | add eax, dll_tab |
821 | endp |
822 | ret |
822 | 823 | endp |
|
823 | align 4 |
824 | |
824 | proc alloc_service |
825 | align 4 |
825 | pushf |
826 | proc alloc_service |
826 | cli |
827 | pushf |
827 | bsf eax, [srv_map] |
828 | cli |
828 | jnz .find |
829 | bsf eax, [srv_map] |
829 | popf |
830 | jnz .find |
830 | xor eax, eax |
831 | popf |
831 | ret |
832 | xor eax, eax |
832 | .find: |
833 | ret |
833 | btr [srv_map], eax |
834 | .find: |
834 | popf |
835 | btr [srv_map], eax |
835 | shl eax,0x02 |
836 | popf |
836 | lea eax,[srv_tab+eax+eax*8] ;srv_tab+eax*36 |
837 | shl eax,0x02 |
837 | ret |
838 | lea eax,[srv_tab+eax+eax*8] ;srv_tab+eax*36 |
838 | endp |
839 | ret |
839 | 840 | endp |
|
840 | end if |
841 | |
- | 842 | end if |