Rev 270 | Rev 279 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
164 | serge | 1 | |
212 | serge | 2 | ;HEAP_SIZE equ 0x01000000 |
164 | serge | 3 | |
4 | |||
5 | { .next_block dd ? |
||
6 | .prev_block dd ? ;+4 |
||
7 | .list_next dd ? ;+8 |
||
8 | .list_prev dd ? ;+12 |
||
9 | .base dd ? ;+16 |
||
10 | .size dd ? ;+20 |
||
11 | .flags dd ? ;+24 |
||
12 | .handle dd ? ;+28 |
||
13 | } |
||
14 | |||
15 | |||
16 | USED_BLOCK equ 8 |
||
17 | |||
18 | |||
19 | MEM_BLOCK MEM_BLOCK |
||
20 | end virtual |
||
21 | |||
22 | |||
23 | |||
24 | |||
25 | block_prev equ MEM_BLOCK.prev_block |
||
26 | list_next equ MEM_BLOCK.list_next |
||
27 | list_prev equ MEM_BLOCK.list_prev |
||
28 | block_base equ MEM_BLOCK.base |
||
29 | block_size equ MEM_BLOCK.size |
||
30 | block_flags equ MEM_BLOCK.flags |
||
31 | |||
32 | |||
33 | { shr op, 12 |
||
34 | dec op |
||
35 | cmp op, 63 |
||
36 | jna @f |
||
37 | mov op, 63 |
||
38 | @@: |
||
39 | } |
||
40 | |||
41 | |||
42 | { mov edx, [op+list_next] |
||
43 | mov ecx, [op+list_prev] |
||
44 | test edx, edx |
||
45 | jz @f |
||
46 | mov [edx+list_prev], ecx |
||
47 | @@: |
||
48 | test ecx, ecx |
||
49 | jz @f |
||
50 | mov [ecx+list_next], edx |
||
51 | @@: |
||
52 | mov [op+list_next],0 |
||
53 | mov [op+list_prev],0 |
||
54 | } |
||
55 | |||
56 | |||
57 | { |
||
58 | remove_from_list op |
||
59 | |||
60 | |||
61 | calc_index eax |
||
62 | cmp [mem_block_list+eax*4], op |
||
63 | jne @f |
||
64 | mov [mem_block_list+eax*4], edx |
||
65 | @@: |
||
66 | cmp [mem_block_list+eax*4], 0 |
||
67 | jne @f |
||
68 | btr [mem_block_mask], eax |
||
69 | @@: |
||
70 | } |
||
71 | |||
72 | |||
73 | { |
||
74 | remove_from_list op |
||
75 | cmp [mem_used_list], op |
||
76 | jne @f |
||
77 | mov [mem_used_list], edx |
||
78 | @@: |
||
79 | } |
||
80 | |||
81 | |||
82 | proc init_kernel_heap |
||
83 | |||
84 | |||
85 | mov edi, mem_block_list |
||
86 | xor eax, eax |
||
87 | cld |
||
88 | rep stosd |
||
89 | |||
90 | |||
91 | mov edi, mem_block_map |
||
92 | not eax |
||
93 | rep stosd |
||
94 | |||
95 | |||
96 | mov [mem_block_end], mem_block_map+512 |
||
97 | mov [mem_block_arr], HEAP_BASE |
||
98 | |||
99 | |||
100 | mov ecx, 32 |
||
101 | mov edx, eax |
||
102 | mov edi, HEAP_BASE |
||
103 | .l1: |
||
104 | stdcall map_page,edi,edx,PG_SW |
||
105 | add edi, 0x1000 |
||
106 | add edx, 0x1000 |
||
107 | dec ecx |
||
108 | jnz .l1 |
||
109 | |||
110 | |||
111 | mov ebx, edi |
||
112 | add ebx, MEM_BLOCK_SIZE |
||
113 | xor eax, eax |
||
114 | mov [edi+block_next], ebx |
||
115 | mov [edi+block_prev], eax |
||
116 | mov [edi+list_next], eax |
||
117 | mov [edi+list_prev], eax |
||
118 | mov [edi+block_base], HEAP_BASE |
||
119 | mov [edi+block_size], 4096*MEM_BLOCK_SIZE |
||
120 | mov [edi+block_flags], USED_BLOCK |
||
121 | |||
122 | |||
123 | mov [ebx+block_prev], eax |
||
124 | mov [ebx+list_next], eax |
||
125 | mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE |
||
126 | |||
127 | |||
128 | sub ecx, HEAP_BASE + 4096*MEM_BLOCK_SIZE |
||
212 | serge | 129 | mov [heap_size], ecx |
170 | serge | 130 | mov [heap_free], ecx |
131 | mov [ebx+block_size], ecx |
||
164 | serge | 132 | mov [ebx+block_flags], FREE_BLOCK |
133 | |||
134 | |||
135 | mov [mem_block_mask+4],0x80000000 |
||
136 | |||
137 | |||
138 | mov [mem_block_list+63*4], ebx |
||
139 | mov byte [mem_block_map], 0xFC |
||
140 | mov [heap_blocks], 4095 |
||
170 | serge | 141 | mov [free_blocks], 4095 |
142 | ret |
||
164 | serge | 143 | endp |
144 | |||
145 | |||
146 | proc get_block stdcall, index:dword |
||
147 | |||
148 | |||
149 | mov ecx, [index] |
||
150 | cmp ecx, eax |
||
151 | jna @f |
||
152 | ;cmova ecx, eax |
||
153 | mov ecx, eax |
||
154 | @@: |
||
155 | xor esi, esi |
||
156 | xor ebx, ebx |
||
157 | xor edx, edx |
||
158 | not edx |
||
159 | |||
160 | |||
161 | jb .bit_test |
||
162 | |||
163 | |||
164 | add ebx, 32 |
||
165 | add esi, 4 |
||
166 | |||
167 | |||
168 | shl edx, cl |
||
169 | and edx, [mem_block_mask+esi] |
||
170 | jz .high_mask |
||
171 | bsf eax, edx |
||
172 | add ebx, eax |
||
173 | mov eax, [mem_block_list+ebx*4] |
||
174 | ret |
||
175 | |||
176 | |||
177 | |||
178 | |||
179 | add ebx, 32 |
||
180 | test esi, 0xFFFFFFF8 |
||
181 | jnz .big_error |
||
182 | mov edx, [mem_block_mask+esi] |
||
183 | and edx, edx |
||
184 | jz .high_mask |
||
185 | bsf eax, edx |
||
186 | add ebx, eax |
||
187 | mov eax, [mem_block_list+ebx*4] |
||
188 | ret |
||
189 | |||
190 | |||
191 | xor eax, eax |
||
192 | ret |
||
193 | endp |
||
194 | |||
195 | |||
196 | proc alloc_mem_block |
||
197 | |||
198 | |||
199 | cli |
||
200 | mov ebx, [mem_block_start] |
||
201 | mov ecx, [mem_block_end] |
||
202 | .l1: |
||
203 | bsf eax,[ebx]; |
||
204 | jnz found |
||
205 | add ebx,4 |
||
206 | cmp ebx, ecx |
||
207 | jb .l1 |
||
208 | popfd |
||
209 | xor eax,eax |
||
210 | ret |
||
211 | |||
212 | |||
213 | btr [ebx], eax |
||
214 | mov [mem_block_start],ebx |
||
215 | sub ebx, mem_block_map |
||
216 | lea eax,[eax+ebx*8] |
||
254 | serge | 217 | shl eax, 5 |
164 | serge | 218 | add eax, [mem_block_arr] |
219 | dec [free_blocks] |
||
170 | serge | 220 | popfd |
164 | serge | 221 | ret |
222 | endp |
||
223 | |||
224 | |||
225 | pushfd |
||
226 | cli |
||
227 | sub eax, [mem_block_arr] |
||
228 | shr eax, 5 |
||
229 | |||
230 | |||
231 | bts [ebx], eax |
||
232 | inc [free_blocks] |
||
170 | serge | 233 | shr eax, 3 |
164 | serge | 234 | and eax, not 3 |
235 | add eax, ebx |
||
236 | cmp [mem_block_start], eax |
||
237 | ja @f |
||
238 | popfd |
||
239 | ret |
||
240 | @@: |
||
241 | mov [mem_block_start], eax |
||
242 | popfd |
||
243 | ret |
||
244 | .err: |
||
245 | xor eax, eax |
||
246 | popfd |
||
247 | ret |
||
248 | endp |
||
249 | |||
250 | |||
251 | proc alloc_kernel_space stdcall, size:dword |
||
252 | local block_ind:DWORD |
||
253 | |||
254 | |||
255 | cli |
||
256 | |||
257 | |||
258 | add eax, 4095 |
||
206 | serge | 259 | and eax, not 4095 |
260 | mov [size], eax |
||
164 | serge | 261 | cmp eax, [heap_free] |
170 | serge | 262 | ja .error |
263 | |||
164 | serge | 264 | |
< |