Rev 886 | Rev 889 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 886 | Rev 888 | ||
---|---|---|---|
Line 4... | Line 4... | ||
4 | #include |
4 | #include |
5 | #include |
5 | #include |
6 | #include |
6 | #include |
7 | 7 | ||
Line -... | Line 8... | ||
- | 8 | #define page_tabs 0xDF800000 |
|
- | 9 | ||
8 | typedef struct |
10 | typedef struct |
9 | { |
11 | { |
10 | link_t link; |
12 | link_t link; |
11 | link_t adj; |
13 | link_t adj; |
12 | addr_t base; |
14 | addr_t base; |
Line 18... | Line 20... | ||
18 | #define MD_FREE 1 |
20 | #define MD_FREE 1 |
19 | #define MD_USED 2 |
21 | #define MD_USED 2 |
Line 20... | Line 22... | ||
20 | 22 | ||
- | 23 | typedef struct { |
|
21 | typedef struct { |
24 | u32_t av_mapped; |
Line 22... | Line 25... | ||
22 | SPINLOCK_DECLARE(lock); /**< this lock protects everything below */ |
25 | u32_t av_unmapped; |
23 | 26 | ||
Line 24... | Line 27... | ||
24 | u32_t availmask; |
27 | link_t mapped[32]; |
- | 28 | link_t unmapped[32]; |
|
- | 29 | ||
25 | link_t free[32]; |
30 | link_t used; |
Line 26... | Line 31... | ||
26 | 31 | ||
27 | link_t used; |
32 | SPINLOCK_DECLARE(lock); /**< this lock protects everything below */ |
Line 35... | Line 40... | ||
35 | heap_t lheap; |
40 | heap_t lheap; |
36 | heap_t sheap; |
41 | heap_t sheap; |
Line -... | Line 42... | ||
- | 42 | ||
- | 43 | ||
Line 37... | Line -... | ||
37 | - | ||
38 | - | ||
39 | - | ||
40 | static inline void _set_lmask(count_t idx) |
44 | static inline void _set_lavu(count_t idx) |
41 | { asm volatile ("bts %0, _lheap"::"r"(idx):"cc"); } |
45 | { asm volatile ("bts %0, _lheap+4"::"r"(idx):"cc"); } |
Line 42... | Line 46... | ||
42 | 46 | ||
43 | static inline void _reset_lmask(count_t idx) |
47 | static inline void _reset_lavu(count_t idx) |
Line 44... | Line 48... | ||
44 | { asm volatile ("btr %0, _lheap"::"r"(idx):"cc"); } |
48 | { asm volatile ("btr %0, _lheap+4"::"r"(idx):"cc"); } |
45 | 49 | ||
Line -... | Line 50... | ||
- | 50 | static inline void _set_savm(count_t idx) |
|
- | 51 | { asm volatile ("bts %0, _sheap"::"r"(idx):"cc"); } |
|
- | 52 | ||
- | 53 | static inline void _reset_savm(count_t idx) |
|
- | 54 | { asm volatile ("btr %0, _sheap"::"r"(idx):"cc"); } |
|
- | 55 | ||
Line 46... | Line 56... | ||
46 | static inline void _set_smask(count_t idx) |
56 | static inline void _set_savu(count_t idx) |
47 | { asm volatile ("bts %0, _sheap"::"r"(idx):"cc"); } |
57 | { asm volatile ("bts %0, _sheap+4"::"r"(idx):"cc"); } |
48 | 58 | ||
49 | static inline void _reset_smask(count_t idx) |
59 | static inline void _reset_savu(count_t idx) |
Line 61... | Line 71... | ||
61 | ASSERT((size & 0x3FFFFF) == 0); |
71 | ASSERT((size & 0x3FFFFF) == 0); |
62 | 72 | ||
Line 63... | Line 73... | ||
63 | for (i = 0; i < 32; i++) |
73 | for (i = 0; i < 32; i++) |
64 | { |
74 | { |
65 | list_initialize(&lheap.free[i]); |
75 | list_initialize(&lheap.mapped[i]); |
- | 76 | list_initialize(&lheap.unmapped[i]); |
|
- | 77 | ||
66 | list_initialize(&sheap.free[i]); |
78 | list_initialize(&sheap.mapped[i]); |
- | 79 | list_initialize(&sheap.unmapped[i]); |
|
67 | }; |
80 | }; |
Line 68... | Line 81... | ||
68 | 81 | ||
69 | list_initialize(&lheap.used); |
82 | list_initialize(&lheap.used); |
Line 79... | Line 92... | ||
79 | md->size = size; |
92 | md->size = size; |
80 | md->parent = NULL; |
93 | md->parent = NULL; |
81 | md->state = MD_FREE; |
94 | md->state = MD_FREE; |
82 | 95 | ||
Line 83... | Line 96... | ||
83 | list_prepend(&md->link, &lheap.free[31]); |
96 | list_prepend(&md->link, &lheap.unmapped[31]); |
- | 97 | lheap.av_mapped = 0x00000000; |
|
84 | lheap.availmask = 0x80000000; |
98 | lheap.av_unmapped = 0x80000000; |
85 | sheap.availmask = 0x00000000; |
99 | sheap.av_mapped = 0x00000000; |
86 | - | ||
87 | // phm_slab = slab_cache_create(sizeof(phismem_t), 32,NULL,NULL,SLAB_CACHE_MAGDEFERRED); |
100 | sheap.av_unmapped = 0x00000000; |
Line 88... | Line 101... | ||
88 | 101 | ||
89 | return 1; |
102 | return 1; |
Line 90... | Line 103... | ||
90 | }; |
103 | }; |
Line 98... | Line 111... | ||
98 | 111 | ||
Line 99... | Line 112... | ||
99 | ASSERT((size & 0x3FFFFF) == 0); |
112 | ASSERT((size & 0x3FFFFF) == 0); |
Line 100... | Line 113... | ||
100 | 113 | ||
101 | idx0 = (size>>22) - 1 < 32 ? (size>>22) - 1 : 31; |
114 | idx0 = (size>>22) - 1 < 32 ? (size>>22) - 1 : 31; |
Line 102... | Line 115... | ||
102 | mask = lheap.availmask & ( -1< |
115 | mask = lheap.av_unmapped & ( -1< |
103 | 116 | ||
104 | if(mask) |
117 | if(mask) |
105 | { |
118 | { |
106 | if(idx0 == 31) |
119 | if(idx0 == 31) |
107 | { |
120 | { |
108 | md_t *tmp = (md_t*)lheap.free[31].next; |
121 | md_t *tmp = (md_t*)lheap.unmapped[31].next; |
109 | while((link_t*)tmp != &lheap.free[31]) |
122 | while((link_t*)tmp != &lheap.unmapped[31]) |
110 | { |
123 | { |
111 | if(tmp->size >= size) |
124 | if(tmp->size >= size) |
Line 121... | Line 134... | ||
121 | else |
134 | else |
122 | { |
135 | { |
123 | idx0 = _bsf(mask); |
136 | idx0 = _bsf(mask); |
124 | 137 | ||
Line 125... | Line 138... | ||
125 | ASSERT( !list_empty(&lheap.free[idx0])) |
138 | ASSERT( !list_empty(&lheap.unmapped[idx0])) |
Line 126... | Line 139... | ||
126 | 139 | ||
127 | md = (md_t*)lheap.free[idx0].next; |
140 | md = (md_t*)lheap.unmapped[idx0].next; |
128 | }; |
141 | }; |
129 | } |
142 | } |
130 | else |
143 | else |
Line 131... | Line 144... | ||
131 | return NULL; |
144 | return NULL; |
Line 132... | Line 145... | ||
132 | 145 | ||
133 | ASSERT(md->state == MD_FREE); |
146 | ASSERT(md->state == MD_FREE); |
134 | 147 | ||
Line 135... | Line 148... | ||
135 | list_remove((link_t*)md); |
148 | list_remove((link_t*)md); |
136 | if(list_empty(&lheap.free[idx0])) |
149 | if(list_empty(&lheap.unmapped[idx0])) |
137 | _reset_lmask(idx0); |
150 | _reset_lavu(idx0); |
138 | 151 | ||
Line 145... | Line 158... | ||
145 | list_insert(&new_md->adj, &md->adj); |
158 | list_insert(&new_md->adj, &md->adj); |
146 | 159 | ||
Line 147... | Line 160... | ||
147 | new_md->base = md->base; |
160 | new_md->base = md->base; |
148 | new_md->size = size; |
161 | new_md->size = size; |
- | 162 | new_md->parent = NULL; |
|
149 | new_md->state = MD_USED; |
163 | new_md->state = MD_USED; |
Line 150... | Line 164... | ||
150 | 164 | ||
151 | md->base+= size; |
165 | md->base+= size; |
Line 152... | Line 166... | ||
152 | md->size-= size; |
166 | md->size-= size; |
Line 153... | Line 167... | ||
153 | 167 | ||
154 | idx1 = (md->size>>22) - 1 < 32 ? (md->size>>22) - 1 : 31; |
168 | idx1 = (md->size>>22) - 1 < 32 ? (md->size>>22) - 1 : 31; |
Line 155... | Line 169... | ||
155 | 169 | ||
156 | list_prepend(&md->link, &lheap.free[idx1]); |
170 | list_prepend(&md->link, &lheap.unmapped[idx1]); |
157 | _set_lmask(idx1); |
171 | _set_lavu(idx1); |
Line 158... | Line 172... | ||
158 | 172 | ||
159 | return new_md; |
173 | return new_md; |
Line 160... | Line 174... | ||
160 | }; |
174 | }; |
161 | md->state = MD_USED; |
175 | md->state = MD_USED; |
162 | 176 | ||
Line 163... | Line 177... | ||
163 | return md; |
177 | return md; |
Line 176... | Line 190... | ||
176 | 190 | ||
Line 177... | Line 191... | ||
177 | efl = safe_cli(); |
191 | efl = safe_cli(); |
Line 178... | Line 192... | ||
178 | 192 | ||
179 | idx0 = (size>>12) - 1 < 32 ? (size>>12) - 1 : 31; |
193 | idx0 = (size>>12) - 1 < 32 ? (size>>12) - 1 : 31; |
Line 180... | Line 194... | ||
180 | mask = sheap.availmask & ( -1< |
194 | mask = sheap.av_unmapped & ( -1< |
Line 181... | Line 195... | ||
181 | 195 | ||
182 | DBG("smask %x size %x idx0 %x mask %x\n",sheap.availmask, size, idx0, mask); |
196 | DBG("smask %x size %x idx0 %x mask %x\n",sheap.av_unmapped, size, idx0, mask); |
183 | 197 | ||
184 | if(mask) |
198 | if(mask) |
185 | { |
199 | { |
Line 186... | Line 200... | ||
186 | if(idx0 == 31) |
200 | if(idx0 == 31) |
187 | { |
201 | { |
188 | ASSERT( !list_empty(&sheap.free[31])); |
202 | ASSERT( !list_empty(&sheap.unmapped[31])); |
189 | 203 | ||
190 | md_t *tmp = (md_t*)sheap.free[31].next; |
204 | md_t *tmp = (md_t*)sheap.unmapped[31].next; |
191 | while((link_t*)tmp != &sheap.free[31]) |
205 | while((link_t*)tmp != &sheap.unmapped[31]) |
192 | { |
206 | { |
Line 201... | Line 215... | ||
201 | else |
215 | else |
202 | { |
216 | { |
203 | idx0 = _bsf(mask); |
217 | idx0 = _bsf(mask); |
204 | 218 | ||
Line 205... | Line 219... | ||
205 | ASSERT( !list_empty(&sheap.free[idx0])); |
219 | ASSERT( !list_empty(&sheap.unmapped[idx0])); |
Line 206... | Line 220... | ||
206 | 220 | ||
207 | md = (md_t*)sheap.free[idx0].next; |
221 | md = (md_t*)sheap.unmapped[idx0].next; |
208 | } |
222 | } |
Line 209... | Line 223... | ||
209 | }; |
223 | }; |
210 | 224 | ||
211 | if(md) |
225 | if(md) |
Line 212... | Line 226... | ||
212 | { |
226 | { |
- | 227 | DBG("remove md %x\n", md); |
|
Line 213... | Line 228... | ||
213 | DBG("remove md %x\n", md); |
228 | |
214 | 229 | ASSERT(md->state==MD_FREE); |
|
215 | ASSERT(md->state==MD_FREE); |
230 | ASSERT(md->parent != NULL); |
216 | 231 | ||
217 | list_remove((link_t*)md); |
232 | list_remove((link_t*)md); |
218 | if(list_empty(&sheap.free[idx0])) |
233 | if(list_empty(&sheap.unmapped[idx0])) |
219 | _reset_smask(idx0); |
234 | _reset_savu(idx0); |
220 | } |
235 | } |
Line 230... | Line 245... | ||
230 | safe_sti(efl); |
245 | safe_sti(efl); |
231 | return NULL; |
246 | return NULL; |
232 | }; |
247 | }; |
233 | 248 | ||
Line -... | Line 249... | ||
- | 249 | ASSERT(lmd->size != 0); |
|
- | 250 | ASSERT(lmd->base != 0); |
|
- | 251 | ASSERT((lmd->base & 0x3FFFFF) == 0); |
|
- | 252 | ASSERT(lmd->parent == NULL); |
|
- | 253 | ||
234 | md = (md_t*)slab_alloc(md_slab,0); /* FIXME check */ |
254 | md = (md_t*)slab_alloc(md_slab,0); /* FIXME check */ |
Line 235... | Line 255... | ||
235 | 255 | ||
236 | link_initialize(&md->link); |
256 | link_initialize(&md->link); |
237 | list_initialize(&md->adj); |
257 | list_initialize(&md->adj); |
Line 262... | Line 282... | ||
262 | 282 | ||
Line 263... | Line 283... | ||
263 | DBG("insert md %x, base %x size %x idx %x\n", md,md->base, md->size,idx1); |
283 | DBG("insert md %x, base %x size %x idx %x\n", md,md->base, md->size,idx1); |
Line 264... | Line 284... | ||
264 | 284 | ||
265 | if( idx1 < 31) |
285 | if( idx1 < 31) |
266 | list_prepend(&md->link, &sheap.free[idx1]); |
286 | list_prepend(&md->link, &sheap.unmapped[idx1]); |
267 | else |
287 | else |
268 | { |
288 | { |
269 | if( list_empty(&sheap.free[31])) |
289 | if( list_empty(&sheap.unmapped[31])) |
270 | list_prepend(&md->link, &sheap.free[31]); |
290 | list_prepend(&md->link, &sheap.unmapped[31]); |
271 | else |
291 | else |
272 | { |
292 | { |
Line 273... | Line 293... | ||
273 | md_t *tmp = (md_t*)sheap.free[31].next; |
293 | md_t *tmp = (md_t*)sheap.unmapped[31].next; |
274 | 294 | ||
275 | while((link_t*)tmp != &sheap.free[31]) |
295 | while((link_t*)tmp != &sheap.unmapped[31]) |
276 | { |
296 | { |
277 | if(md->base < tmp->base) |
297 | if(md->base < tmp->base) |
278 | break; |
298 | break; |
279 | tmp = (md_t*)tmp->link.next; |
299 | tmp = (md_t*)tmp->link.next; |
280 | } |
300 | } |
281 | list_insert(&md->link, &tmp->link); |
301 | list_insert(&md->link, &tmp->link); |
Line 282... | Line 302... | ||
282 | }; |
302 | }; |
Line 283... | Line 303... | ||
283 | }; |
303 | }; |
Line 284... | Line 304... | ||
284 | 304 | ||
285 | _set_smask(idx1); |
305 | _set_savu(idx1); |
Line 295... | Line 315... | ||
295 | 315 | ||
Line 296... | Line 316... | ||
296 | return md; |
316 | return md; |
297 | } |
317 | } |
Line -... | Line 318... | ||
- | 318 | ||
- | 319 | md_t* __fastcall find_mapped_md(size_t size) |
|
- | 320 | { |
|
- | 321 | eflags_t efl; |
|
- | 322 | ||
- | 323 | md_t *md = NULL; |
|
- | 324 | ||
- | 325 | count_t idx0; |
|
- | 326 | u32_t mask; |
|
- | 327 | ||
- | 328 | ASSERT((size & 0xFFF) == 0); |
|
- | 329 | ||
- | 330 | efl = safe_cli(); |
|
- | 331 | ||
- | 332 | idx0 = (size>>12) - 1 < 32 ? (size>>12) - 1 : 31; |
|
- | 333 | mask = sheap.av_mapped & ( -1< |
|
- | 334 | ||
- | 335 | DBG("small av_mapped %x size %x idx0 %x mask %x\n",sheap.av_mapped, size, |
|
- | 336 | idx0, mask); |
|
- | 337 | ||
- | 338 | if(mask) |
|
- | 339 | { |
|
- | 340 | if(idx0 == 31) |
|
- | 341 | { |
|
- | 342 | ASSERT( !list_empty(&sheap.mapped[31])); |
|
- | 343 | ||
- | 344 | md_t *tmp = (md_t*)sheap.mapped[31].next; |
|
- | 345 | while((link_t*)tmp != &sheap.mapped[31]) |
|
- | 346 | { |
|
- | 347 | if(tmp->size >= size) |
|
- | 348 | { |
|
- | 349 | md = tmp; |
|
- | 350 | break; |
|
- | 351 | }; |
|
- | 352 | tmp = (md_t*)tmp->link.next; |
|
- | 353 | }; |
|
- | 354 | } |
|
- | 355 | else |
|
- | 356 | { |
|
- | 357 | idx0 = _bsf(mask); |
|
- | 358 | ||
- | 359 | ASSERT( !list_empty(&sheap.mapped[idx0])); |
|
- | 360 | ||
- | 361 | md = (md_t*)sheap.mapped[idx0].next; |
|
- | 362 | } |
|
- | 363 | }; |
|
- | 364 | ||
- | 365 | if(md) |
|
- | 366 | { |
|
- | 367 | DBG("remove md %x\n", md); |
|
- | 368 | ||
- | 369 | ASSERT(md->state==MD_FREE); |
|
- | 370 | ||
- | 371 | list_remove((link_t*)md); |
|
- | 372 | if(list_empty(&sheap.mapped[idx0])) |
|
- | 373 | _reset_savm(idx0); |
|
- | 374 | } |
|
- | 375 | else |
|
- | 376 | { |
|
- | 377 | md_t *lmd; |
|
- | 378 | addr_t frame; |
|
- | 379 | addr_t *pte; |
|
- | 380 | int i; |
|
- | 381 | ||
- | 382 | lmd = find_large_md((size+0x3FFFFF)&~0x3FFFFF); |
|
- | 383 | ||
- | 384 | DBG("get large md %x\n", lmd); |
|
- | 385 | ||
- | 386 | if( !lmd) |
|
- | 387 | { |
|
- | 388 | safe_sti(efl); |
|
- | 389 | return NULL; |
|
- | 390 | }; |
|
- | 391 | ||
- | 392 | ASSERT(lmd->size != 0); |
|
- | 393 | ASSERT(lmd->base != 0); |
|
- | 394 | ASSERT((lmd->base & 0x3FFFFF) == 0); |
|
- | 395 | ASSERT(lmd->parent == NULL); |
|
- | 396 | ||
- | 397 | frame = core_alloc(10); /* FIXME check */ |
|
- | 398 | ||
- | 399 | lmd->parent = (void*)frame; |
|
- | 400 | ||
- | 401 | pte = &((addr_t*)page_tabs)[lmd->base>>12]; /* FIXME remove */ |
|
- | 402 | ||
- | 403 | for(i = 0; i<1024; i++) |
|
- | 404 | { |
|
- | 405 | *pte++ = frame; |
|
- | 406 | frame+= 4096; |
|
- | 407 | } |
|
- | 408 | ||
- | 409 | md = (md_t*)slab_alloc(md_slab,0); /* FIXME check */ |
|
- | 410 | ||
- | 411 | link_initialize(&md->link); |
|
- | 412 | list_initialize(&md->adj); |
|
- | 413 | md->base = lmd->base; |
|
- | 414 | md->size = lmd->size; |
|
- | 415 | md->parent = lmd; |
|
- | 416 | md->state = MD_USED; |
|
- | 417 | }; |
|
- | 418 | ||
- | 419 | if(md->size > size) |
|
- | 420 | { |
|
- | 421 | count_t idx1; |
|
- | 422 | md_t *new_md = (md_t*)slab_alloc(md_slab,0); /* FIXME check */ |
|
- | 423 | ||
- | 424 | link_initialize(&new_md->link); |
|
- | 425 | list_insert(&new_md->adj, &md->adj); |
|
- | 426 | ||
- | 427 | new_md->base = md->base; |
|
- | 428 | new_md->size = size; |
|
- | 429 | new_md->parent = md->parent; |
|
- | 430 | ||
- | 431 | md->base+= size; |
|
- | 432 | md->size-= size; |
|
- | 433 | md->state = MD_FREE; |
|
- | 434 | ||
- | 435 | idx1 = (md->size>>12) - 1 < 32 ? (md->size>>12) - 1 : 31; |
|
- | 436 | ||
- | 437 | DBG("insert md %x, base %x size %x idx %x\n", md,md->base, md->size,idx1); |
|
- | 438 | ||
- | 439 | if( idx1 < 31) |
|
- | 440 | list_prepend(&md->link, &sheap.mapped[idx1]); |
|
- | 441 | else |
|
- | 442 | { |
|
- | 443 | if( list_empty(&sheap.mapped[31])) |
|
- | 444 | list_prepend(&md->link, &sheap.mapped[31]); |
|
- | 445 | else |
|
- | 446 | { |
|
- | 447 | md_t *tmp = (md_t*)sheap.mapped[31].next; |
|
- | 448 | ||
- | 449 | while((link_t*)tmp != &sheap.mapped[31]) |
|
- | 450 | { |
|
- | 451 | if(md->base < tmp->base) |
|
- | 452 | break; |
|
- | 453 | tmp = (md_t*)tmp->link.next; |
|
- | 454 | } |
|
- | 455 | list_insert(&md->link, &tmp->link); |
|
- | 456 | }; |
|
- | 457 | }; |
|
- | 458 | ||
- | 459 | _set_savm(idx1); |
|
- | 460 | ||
- | 461 | md = new_md; |
|
- | 462 | }; |
|
- | 463 | ||
- | 464 | md->state = MD_USED; |
|
- | 465 | ||
- | 466 | safe_sti(efl); |
|
- | 467 | ||
- | 468 | return md; |
|
- | 469 | } |
|
298 | 470 | ||
299 | void __fastcall free_small_md(md_t *md) |
471 | void __fastcall free_unmapped_md(md_t *md) |
300 | { |
472 | { |
301 | eflags_t efl ; |
473 | eflags_t efl ; |
302 | md_t *fd; |
474 | md_t *fd; |
303 | md_t *bk; |
475 | md_t *bk; |
Line -... | Line 476... | ||
- | 476 | count_t idx; |
|
- | 477 | ||
304 | count_t idx; |
478 | ASSERT(md->parent != NULL); |
305 | 479 | ||
Line 306... | Line 480... | ||
306 | efl = safe_cli(); |
480 | efl = safe_cli(); |
307 | spinlock_lock(&sheap.lock); |
481 | spinlock_lock(&sheap.lock); |
Line 315... | Line 489... | ||
315 | { |
489 | { |
316 | idx = (fd->size>>12) - 1 < 32 ? (fd->size>>12) - 1 : 31; |
490 | idx = (fd->size>>12) - 1 < 32 ? (fd->size>>12) - 1 : 31; |
317 | 491 | ||
Line 318... | Line 492... | ||
318 | list_remove((link_t*)fd); |
492 | list_remove((link_t*)fd); |
319 | if(list_empty(&sheap.free[idx])) |
493 | if(list_empty(&sheap.unmapped[idx])) |
320 | _reset_smask(idx); |
494 | _reset_savu(idx); |
Line 321... | Line 495... | ||
321 | 495 | ||
322 | md->size+= fd->size; |
496 | md->size+= fd->size; |
323 | md->adj.next = fd->adj.next; |
497 | md->adj.next = fd->adj.next; |
324 | md->adj.next->prev = (link_t*)md; |
498 | md->adj.next->prev = (link_t*)md; |
Line 328... | Line 502... | ||
328 | { |
502 | { |
329 | idx = (bk->size>>12) - 1 < 32 ? (bk->size>>12) - 1 : 31; |
503 | idx = (bk->size>>12) - 1 < 32 ? (bk->size>>12) - 1 : 31; |
330 | 504 | ||
Line 331... | Line 505... | ||
331 | list_remove((link_t*)bk); |
505 | list_remove((link_t*)bk); |
332 | if(list_empty(&sheap.free[idx])) |
506 | if(list_empty(&sheap.unmapped[idx])) |
333 | _reset_smask(idx); |
507 | _reset_savu(idx); |
Line 334... | Line 508... | ||
334 | 508 | ||
335 | bk->size+= md->size; |
509 | bk->size+= md->size; |
336 | bk->adj.next = md->adj.next; |
510 | bk->adj.next = md->adj.next; |
337 | bk->adj.next->prev = (link_t*)bk; |
511 | bk->adj.next->prev = (link_t*)bk; |
Line 343... | Line 517... | ||
343 | md->state = MD_FREE; |
517 | md->state = MD_FREE; |
Line 344... | Line 518... | ||
344 | 518 | ||
Line 345... | Line 519... | ||
345 | idx = (md->size>>12) - 1 < 32 ? (md->size>>12) - 1 : 31; |
519 | idx = (md->size>>12) - 1 < 32 ? (md->size>>12) - 1 : 31; |
Line 346... | Line 520... | ||
346 | 520 | ||
347 | _set_smask(idx); |
521 | _set_savu(idx); |
348 | 522 | ||
349 | if( idx < 31) |
523 | if( idx < 31) |
350 | list_prepend(&md->link, &sheap.free[idx]); |
524 | list_prepend(&md->link, &sheap.unmapped[idx]); |
351 | else |
525 | else |
352 | { |
526 | { |
353 | if( list_empty(&sheap.free[31])) |
527 | if( list_empty(&sheap.unmapped[31])) |
354 | list_prepend(&md->link, &sheap.free[31]); |
528 | list_prepend(&md->link, &sheap.unmapped[31]); |
Line 355... | Line 529... | ||
355 | else |
529 | else |
356 | { |
530 | { |
357 | md_t *tmp = (md_t*)sheap.free[31].next; |
531 | md_t *tmp = (md_t*)sheap.unmapped[31].next; |
358 | 532 | ||
359 | while((link_t*)tmp != &sheap.free[31]) |
533 | while((link_t*)tmp != &sheap.unmapped[31]) |
360 | { |
534 | { |
Line 369... | Line 543... | ||
369 | safe_sti(efl); |
543 | safe_sti(efl); |
370 | 544 | ||
Line 371... | Line 545... | ||
371 | }; |
545 | }; |
Line -... | Line 546... | ||
- | 546 | ||
- | 547 | void __fastcall free_mapped_md(md_t *md) |
|
- | 548 | { |
|
- | 549 | eflags_t efl ; |
|
- | 550 | md_t *fd; |
|
- | 551 | md_t *bk; |
|
- | 552 | count_t idx; |
|
- | 553 | ||
- | 554 | ASSERT(md->parent != NULL); |
|
Line -... | Line 555... | ||
- | 555 | ASSERT( ((md_t*)(md->parent))->parent != NULL); |
|
372 | 556 | ||
Line 373... | Line -... | ||
373 | - | ||
374 | #define page_tabs 0xDF800000 |
557 | efl = safe_cli(); |
375 | 558 | spinlock_lock(&sheap.lock); |
|
376 | /* |
559 | |
377 | phismem_t* __fastcall phis_alloc(count_t count) |
- | |
378 | { |
560 | if( !list_empty(&md->adj)) |
Line 379... | Line 561... | ||
379 | phismem_t *phm; |
561 | { |
380 | count_t tmp; |
- | |
381 | phm = (phismem_t*)slab_alloc(phm_slab, 0); |
- | |
382 | 562 | bk = (md_t*)md->adj.prev; |
|
383 | phm->count = count; |
563 | fd = (md_t*)md->adj.next; |
Line 384... | Line 564... | ||
384 | tmp = count; |
564 | |
385 | while(tmp) |
565 | if(fd->state == MD_FREE) |
- | 566 | { |
|
Line -... | Line 567... | ||
- | 567 | idx = (fd->size>>12) - 1 < 32 ? (fd->size>>12) - 1 : 31; |
|
386 | { |
568 | |
- | 569 | list_remove((link_t*)fd); |
|
- | 570 | if(list_empty(&sheap.mapped[idx])) |
|
- | 571 | _reset_savm(idx); |
|
- | 572 | ||
- | 573 | md->size+= fd->size; |
|
- | 574 | md->adj.next = fd->adj.next; |
|
Line -... | Line 575... | ||
- | 575 | md->adj.next->prev = (link_t*)md; |
|
- | 576 | slab_free(md_slab, fd); |
|
- | 577 | }; |
|
- | 578 | if(bk->state == MD_FREE) |
|
- | 579 | { |
|
- | 580 | idx = (bk->size>>12) - 1 < 32 ? (bk->size>>12) - 1 : 31; |
|
- | 581 | ||
- | 582 | list_remove((link_t*)bk); |
|
- | 583 | if(list_empty(&sheap.mapped[idx])) |
|
- | 584 | _reset_savm(idx); |
|
387 | u32_t order; |
585 | |
Line 388... | Line 586... | ||
388 | 586 | bk->size+= md->size; |
|
389 | asm volatile ("bsr %0, %1":"=&r"(order):"r"(tmp):"cc"); |
- | |
Line 390... | Line 587... | ||
390 | asm volatile ("btr %0, %1" :"=r"(tmp):"r"(order):"cc"); |
587 | bk->adj.next = md->adj.next; |
391 | - | ||
392 | phm->frames[order] = core_alloc(order); |
- | |
393 | - | ||
Line 394... | Line 588... | ||
394 | }; |
588 | bk->adj.next->prev = (link_t*)bk; |
395 | - | ||
Line 396... | Line 589... | ||
396 | return phm; |
589 | slab_free(md_slab, md); |
- | 590 | md = fd; |
|
- | 591 | }; |
|
397 | } |
592 | }; |
398 | 593 | ||
399 | void map_phm(addr_t base, phismem_t *phm, u32_t mapflags) |
594 | md->state = MD_FREE; |
400 | { |
595 | |
401 | count_t count; |
596 | idx = (md->size>>12) - 1 < 32 ? (md->size>>12) - 1 : 31; |
402 | addr_t *pte; |
- | |
403 | 597 | ||
Line 404... | Line 598... | ||
404 | count = phm->count; |
598 | _set_savm(idx); |
405 | pte = &((addr_t*)page_tabs)[base>>12]; |
- | |
406 | - | ||
407 | while(count) |
599 | |
408 | { |
600 | if( idx < 31) |
409 | u32_t order; |
601 | list_prepend(&md->link, &sheap.mapped[idx]); |
410 | addr_t frame; |
602 | else |
411 | count_t size; |
603 | { |
- | 604 | if( list_empty(&sheap.mapped[31])) |
|
412 | 605 | list_prepend(&md->link, &sheap.mapped[31]); |
|
- | 606 | else |
|
- | 607 | { |
|
- | 608 | md_t *tmp = (md_t*)sheap.mapped[31].next; |
|
413 | asm volatile ("bsr %0, %1":"=&r"(order):"r"(count):"cc"); |
609 | |
- | 610 | while((link_t*)tmp != &sheap.mapped[31]) |
|
Line 414... | Line 611... | ||
414 | asm volatile ("btr %0, %1" :"=r"(count):"r"(order):"cc"); |
611 | { |
415 | 612 | if(md->base < tmp->base) |
|
416 | frame = phm->frames[order] | mapflags; |
613 | break; |
Line 435... | Line 632... | ||
435 | ASSERT(size != 0); |
632 | ASSERT(size != 0); |
Line 436... | Line 633... | ||
436 | 633 | ||
Line 437... | Line -... | ||
437 | size = (size+4095)&~4095; |
- | |
438 | - | ||
439 | md = find_small_md(size); |
- | |
440 | - | ||
441 | if( md ) |
- | |
442 | { |
- | |
443 | ASSERT(md->state == MD_USED); |
634 | size = (size+4095)&~4095; |
444 | 635 | ||
445 | if( flags & PG_MAP ) |
636 | if( flags & PG_MAP ) |
446 | { |
- | |
Line 447... | Line -... | ||
447 | count_t tmp = size >> 12; |
- | |
448 | addr_t *pte = &((addr_t*)page_tabs)[md->base>>12]; |
637 | { |
449 | 638 | md = find_mapped_md(size); |
|
- | 639 | ||
450 | while(tmp) |
640 | if( !md ) |
451 | { |
- | |
Line 452... | Line 641... | ||
452 | u32_t order; |
641 | return NULL; |
453 | addr_t frame; |
642 | |
Line 454... | Line 643... | ||
454 | size_t size; |
643 | md_t *lmd = (md_t*)md->parent; |
- | 644 | ||
- | 645 | ASSERT( lmd != NULL); |
|
- | 646 | ASSERT( lmd->parent != NULL); |
|
Line 455... | Line 647... | ||
455 | 647 | ||
- | 648 | addr_t frame = (md->base - lmd->base + (addr_t)lmd->parent)| |
|
- | 649 | (flags & 0xFFF); |
|
456 | asm volatile ("bsr %1, %0":"=&r"(order):"r"(tmp):"cc"); |
650 | DBG("frame %x\n", frame); |
457 | asm volatile ("btr %1, %0" :"=r"(tmp):"r"(order):"cc"); |
651 | ASSERT(frame != 0); |
458 | 652 | ||
459 | frame = core_alloc(order) | flags; /* FIXME check */ |
653 | count_t tmp = size >> 12; |
460 | 654 | addr_t *pte = &((addr_t*)page_tabs)[md->base>>12]; |
|
- | 655 | ||
- | 656 | while(tmp--) |
|
- | 657 | { |
|
- | 658 | *pte++ = frame; |
|
461 | size = (1 << order); |
659 | frame+= 4096; |
462 | while(size--) |
660 | }; |
- | 661 | } |
|
- | 662 | else |
|
- | 663 | md = find_unmapped_md(size); |
|
- | 664 | ||
Line 463... | Line 665... | ||
463 | { |
665 | if( !md ) |
464 | *pte++ = frame; |
666 | return NULL; |
Line 465... | Line 667... | ||
465 | frame+= 4096; |
667 | |
Line 490... | Line 692... | ||
490 | 692 | ||
Line 491... | Line 693... | ||
491 | DBG("allocate: %x size %x\n\n",md->base, size); |
693 | DBG("allocate: %x size %x\n\n",md->base, size); |
492 | return (void*)md->base; |
694 | return (void*)md->base; |
493 | }; |
695 | }; |
494 | return NULL; |
- | |
495 | }; |
- | |
Line 496... | Line 696... | ||
496 | 696 | ||
497 | void __fastcall mem_free(void *mem) |
697 | void __fastcall mem_free(void *mem) |
498 | { |
698 | { |
Line 522... | Line 722... | ||
522 | } |
722 | } |
523 | 723 | ||
Line 524... | Line 724... | ||
524 | if( md ) |
724 | if( md ) |
525 | { |
725 | { |
- | 726 | md_t *lmd; |
|
- | 727 | ||
526 | DBG("\tmd: %x base: %x size: %x\n",md, md->base, md->size); |
728 | DBG("\tmd: %x base: %x size: %x\n",md, md->base, md->size); |
Line 527... | Line 729... | ||
527 | 729 | ||
Line -... | Line 730... | ||
- | 730 | ASSERT(md->state == MD_USED); |
|
- | 731 | ||
- | 732 | list_remove((link_t*)md); |
|
- | 733 | ||
- | 734 | lmd = (md_t*)md->parent; |
|
- | 735 | ||
- | 736 | ASSERT(lmd != 0); |
|
- | 737 | ||
528 | ASSERT(md->state == MD_USED); |
738 | if(lmd->parent != 0) |
529 | 739 | { |
|
Line 530... | Line 740... | ||
530 | count_t tmp = md->size >> 12; |
740 | count_t tmp = md->size >> 12; |
531 | addr_t *pte = &((addr_t*)page_tabs)[md->base>>12]; |
741 | addr_t *pte = &((addr_t*)page_tabs)[md->base>>12]; |
532 | 742 | ||
533 | while(tmp--) |
743 | while(tmp--) |
534 | { |
744 | { |
535 | *pte++ = 0; |
- | |
536 | asm volatile ( |
745 | *pte++ = 0; |
537 | "invlpg (%0)" |
746 | asm volatile ( |
538 | : |
747 | "invlpg (%0)" |
- | 748 | ::"r" (mem) ); |
|
539 | :"r" (mem) ); |
749 | mem+= 4096; |
- | 750 | }; |
|
- | 751 | ||
540 | mem+= 4096; |
752 | free_mapped_md( md ); |
541 | }; |
753 | } |
542 | list_remove((link_t*)md); |
754 | else |
543 | free_small_md( md ); |
- | |
544 | } |
755 | free_unmapped_md( md ); |
545 | else |
- | |
Line 546... | Line 756... | ||
546 | { |
756 | } |
547 | DBG("\tERROR: invalid base address: %x\n", mem); |
757 | else |