Rev 2259 | Rev 2465 | Go to most recent revision | 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: 2434 $ |
9 | |||
10 | |||
2434 | Serge | 11 | struct MEM_BLOCK |
12 | list LHEAD |
||
13 | next_block dd ? ;+8 |
||
14 | prev_block dd ? ;+4 |
||
15 | base dd ? ;+16 |
||
16 | size dd ? ;+20 |
||
17 | flags dd ? ;+24 |
||
18 | handle dd ? ;+28 |
||
19 | ends |
||
164 | serge | 20 | |
21 | FREE_BLOCK equ 4 |
||
22 | USED_BLOCK equ 8 |
||
546 | diamond | 23 | DONT_FREE_BLOCK equ 10h |
164 | serge | 24 | |
25 | |||
26 | block_next equ MEM_BLOCK.next_block |
||
27 | block_prev equ MEM_BLOCK.prev_block |
||
2138 | serge | 28 | list_fd equ MEM_BLOCK.list.next |
29 | list_bk equ MEM_BLOCK.list.prev |
||
164 | serge | 30 | block_base equ MEM_BLOCK.base |
31 | block_size equ MEM_BLOCK.size |
||
32 | block_flags equ MEM_BLOCK.flags |
||
33 | |||
34 | macro calc_index op |
||
35 | { shr op, 12 |
||
36 | dec op |
||
37 | cmp op, 63 |
||
38 | jna @f |
||
39 | mov op, 63 |
||
40 | @@: |
||
41 | } |
||
42 | |||
2156 | serge | 43 | align 4 |
44 | md: |
||
45 | .add_to_used: |
||
46 | mov eax, [esi+block_base] |
||
47 | mov ebx, [esi+block_base] |
||
48 | shr ebx, 6 |
||
49 | add eax, ebx |
||
50 | shr ebx, 6 |
||
51 | add eax, ebx |
||
52 | shr eax, 12 |
||
53 | and eax, 63 |
||
54 | inc [mem_hash_cnt+eax*4] |
||
164 | serge | 55 | |
2156 | serge | 56 | lea ecx, [mem_used_list+eax*8] |
57 | list_add esi, ecx |
||
58 | mov [esi+block_flags], USED_BLOCK |
||
59 | mov eax, [esi+block_size] |
||
60 | sub [heap_free], eax |
||
61 | ret |
||
62 | align 4 |
||
63 | .find_used: |
||
64 | mov ecx, eax |
||
65 | mov ebx, eax |
||
66 | shr ebx, 6 |
||
67 | add ecx, ebx |
||
68 | shr ebx, 6 |
||
69 | add ecx, ebx |
||
70 | shr ecx, 12 |
||
71 | and ecx, 63 |
||
72 | |||
73 | lea ebx, [mem_used_list+ecx*8] |
||
74 | mov esi, ebx |
||
75 | .next: |
||
76 | mov esi, [esi+list_fd] |
||
77 | cmp esi, ebx |
||
78 | je .fail |
||
79 | |||
80 | cmp eax, [esi+block_base] |
||
81 | jne .next |
||
82 | |||
83 | ret |
||
84 | .fail: |
||
85 | xor esi, esi |
||
86 | ret |
||
87 | |||
88 | align 4 |
||
89 | .del_from_used: |
||
90 | call .find_used |
||
91 | test esi, esi |
||
92 | jz .done |
||
93 | |||
94 | cmp [esi+block_flags], USED_BLOCK |
||
95 | jne .fatal |
||
96 | |||
97 | dec [mem_hash_cnt+ecx*4] |
||
98 | list_del esi |
||
99 | .done: |
||
100 | ret |
||
101 | .fatal: ;FIXME panic here |
||
102 | xor esi, esi |
||
103 | ret |
||
104 | |||
2138 | serge | 105 | ;Initial heap state |
106 | ; |
||
2143 | serge | 107 | ;+heap_size terminator USED_BLOCK |
2151 | serge | 108 | ;+4096*MEM_BLOCK.sizeof free space FREE_BLOCK |
2143 | serge | 109 | ;HEAP_BASE heap_descriptors USED_BLOCK |
2138 | serge | 110 | ; |
111 | |||
164 | serge | 112 | align 4 |
113 | proc init_kernel_heap |
||
114 | |||
2138 | serge | 115 | mov ecx, 64 |
116 | mov edi, mem_block_list |
||
117 | @@: |
||
118 | mov eax, edi |
||
119 | stosd |
||
120 | stosd |
||
121 | loop @B |
||
164 | serge | 122 | |
2156 | serge | 123 | mov ecx, 64 |
124 | mov edi, mem_used_list |
||
125 | @@: |
||
126 | mov eax, edi |
||
127 | stosd |
||
128 | stosd |
||
129 | loop @B |
||
357 | serge | 130 | |
2138 | serge | 131 | stdcall alloc_pages, dword 32 |
132 | mov ecx, 32 |
||
133 | mov edx, eax |
||
134 | mov edi, HEAP_BASE |
||
164 | serge | 135 | .l1: |
2434 | Serge | 136 | stdcall map_page, edi, edx, PG_SW |
2138 | serge | 137 | add edi, 0x1000 |
138 | add edx, 0x1000 |
||
139 | dec ecx |
||
140 | jnz .l1 |
||
164 | serge | 141 | |
2138 | serge | 142 | mov edi, HEAP_BASE ;descriptors |
2434 | Serge | 143 | mov ebx, HEAP_BASE+sizeof.MEM_BLOCK ;free space |
144 | mov ecx, HEAP_BASE+sizeof.MEM_BLOCK*2 ;terminator |
||
164 | serge | 145 | |
2138 | serge | 146 | xor eax, eax |
147 | mov [edi+block_next], ebx |
||
148 | mov [edi+block_prev], eax |
||
149 | mov [edi+list_fd], eax |
||
150 | mov [edi+list_bk], eax |
||
151 | mov [edi+block_base], HEAP_BASE |
||
2434 | Serge | 152 | mov [edi+block_size], 4096*sizeof.MEM_BLOCK |
2138 | serge | 153 | mov [edi+block_flags], USED_BLOCK |
164 | serge | 154 | |
2138 | serge | 155 | mov [ecx+block_next], eax |
156 | mov [ecx+block_prev], ebx |
||
157 | mov [edi+list_fd], eax |
||
158 | mov [edi+list_bk], eax |
||
2151 | serge | 159 | mov [edi+block_base], eax |
160 | mov [edi+block_size], eax |
||
2138 | serge | 161 | mov [edi+block_flags], USED_BLOCK |
164 | serge | 162 | |
2138 | serge | 163 | mov [ebx+block_next], ecx |
164 | mov [ebx+block_prev], edi |
||
2434 | Serge | 165 | mov [ebx+block_base], HEAP_BASE+4096*sizeof.MEM_BLOCK |
164 | serge | 166 | |
2138 | serge | 167 | mov ecx, [pg_data.kernel_pages] |
168 | shl ecx, 12 |
||
2434 | Serge | 169 | sub ecx, HEAP_BASE-OS_BASE+4096*sizeof.MEM_BLOCK |
2138 | serge | 170 | mov [heap_size], ecx |
171 | mov [heap_free], ecx |
||
172 | mov [ebx+block_size], ecx |
||
173 | mov [ebx+block_flags], FREE_BLOCK |
||
174 | |||
175 | mov [mem_block_mask], eax |
||
2434 | Serge | 176 | mov [mem_block_mask+4], 0x80000000 |
2138 | serge | 177 | |
178 | mov ecx, mem_block_list+63*8 |
||
179 | list_add ebx, ecx |
||
180 | |||
2151 | serge | 181 | mov ecx, 4096-3-1 |
2434 | Serge | 182 | mov eax, HEAP_BASE+sizeof.MEM_BLOCK*4 |
2151 | serge | 183 | |
2434 | Serge | 184 | mov [next_memblock], HEAP_BASE+sizeof.MEM_BLOCK *3 |
2151 | serge | 185 | @@: |
2434 | Serge | 186 | mov [eax-sizeof.MEM_BLOCK], eax |
187 | add eax, sizeof.MEM_BLOCK |
||
2151 | serge | 188 | loop @B |
189 | |||
2434 | Serge | 190 | mov [eax-sizeof.MEM_BLOCK], dword 0 |
2151 | serge | 191 | |
2138 | serge | 192 | mov ecx, heap_mutex |
193 | call mutex_init |
||
2151 | serge | 194 | mov [heap_blocks], 4094 |
195 | mov [free_blocks], 4093 |
||
2138 | serge | 196 | ret |
164 | serge | 197 | endp |
198 | |||
369 | serge | 199 | ; param |
200 | ; eax= required size |
||
201 | ; |
||
202 | ; retval |
||
203 | ; edi= memory block descriptor |
||
204 | ; ebx= descriptor index |
||
205 | |||
164 | serge | 206 | align 4 |
819 | serge | 207 | get_small_block: |
164 | serge | 208 | mov ecx, eax |
369 | serge | 209 | shr ecx, 12 |
210 | dec ecx |
||
211 | cmp ecx, 63 |
||
212 | jle .get_index |
||
213 | mov ecx, 63 |
||
214 | .get_index: |
||