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