Subversion Repositories Kolibri OS

Rev

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