Subversion Repositories Kolibri OS

Rev

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