Subversion Repositories Kolibri OS

Rev

Rev 859 | Rev 862 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
859 serge 1
 
2
#include 
3
#include 
4
#include 
5
#include 
6
#include 
7
8
 
9
{
10
   link_t link;
11
   link_t adj;
12
   addr_t base;
13
   size_t size;
14
   void*  parent;
15
   u32_t  reserved;
16
}md_t;
17
18
 
19
   SPINLOCK_DECLARE(lock);   /**< this lock protects everything below */
20
21
 
22
   link_t list[32];
23
}heap_t;
24
25
 
26
slab_cache_t *phm_slab;
27
28
 
29
heap_t sheap;
30
31
 
32
{ asm volatile ("bts DWORD PTR [_lheap], %0"::"r"(idx):"cc"); }
33
34
 
35
{ asm volatile ("btr DWORD PTR [_lheap], %0"::"r"(idx):"cc"); }
36
37
 
38
{ asm volatile ("bts DWORD PTR [_sheap], %0"::"r"(idx):"cc"); }
39
40
 
41
{ asm volatile ("btr DWORD PTR [_sheap], %0"::"r"(idx):"cc"); }
42
43
 
44
 
45
{
46
   md_t *md;
47
   u32_t i;
48
49
 
50
   ASSERT(size != 0)
51
   ASSERT(base & 0x3FFFFF == 0);
52
   ASSERT(size & 0x3FFFFF == 0);
53
54
 
55
   {
56
     list_initialize(&lheap.list[i]);
57
     list_initialize(&sheap.list[i]);
58
   };
59
60
 
61
62
 
63
64
 
65
   md->base = base;
66
   md->size = size;
67
   md->parent = NULL;
68
   md->reserved = 0;
69
70
 
71
   lheap.availmask = 0x80000000;
72
   sheap.availmask = 0x00000000;
73
74
 
75
76
 
77
};
78
79
 
80
{
81
   md_t *md = NULL;
82
83
 
84
   u32_t mask;
85
86
 
87
88
 
89
   mask = lheap.availmask & ( -1<
90
91
 
92
   {
93
     idx0 = _bsf(mask);
94
95
 
96
97
 
98
   }
99
   else
100
     return NULL;
101
102
 
103
   if(list_empty(&lheap.list[idx0]))
104
     _reset_lmask(idx0);
105
106
 
107
   {
108
     count_t idx1;
109
     md_t *new_md = (md_t*)slab_alloc(md_slab,0);
110
111
 
112
     list_insert(&new_md->adj, &md->adj);
861 serge 113
859 serge 114
 
115
     new_md->size = size;
116
117
 
118
     md->size-= size;
119
120
 
121
122
 
123
     _set_lmask(idx1);
124
125
 
126
   }
127
   return md;
128
}
129
130
 
131
{
132
   eflags_t efl;
133
134
 
135
136
 
137
   u32_t mask;
138
139
 
140
141
 
142
143
 
144
   mask = sheap.availmask & ( -1<
145
146
 
861 serge 147
148
 
859 serge 149
   {
150
     md_t *tmp;
861 serge 151
152
 
859 serge 153
154
 
155
156
 
861 serge 157
859 serge 158
 
861 serge 159
     {
160
       if(tmp->size >= size)
161
       {
162
         //printf("remove tmp %x\n", tmp);
163
         list_remove((link_t*)tmp);
164
         if(list_empty(&sheap.list[idx0]))
165
           _reset_smask(idx0);
166
         md = tmp;
167
         break;
168
       };
169
       tmp = (md_t*)tmp->link.next;
170
     };
171
   };
172
173
 
174
   {
859 serge 175
     md_t *lmd;
176
     lmd = find_large_md((size+0x3FFFFF)&~0x3FFFFF);
177
     if( !lmd)
178
     {
179
       safe_sti(efl);
180
       return NULL;
181
     };
182
183
 
184
     link_initialize(&md->link);
185
     list_initialize(&md->adj);
186
     md->base = lmd->base;
187
     md->size = lmd->size;
188
     md->parent  = lmd;
189
     md->reserved = 0;
190
   };
191
192
 
193
   {
194
     count_t idx1;
195
     md_t *new_md = (md_t*)slab_alloc(md_slab,0);
196
197
 
198
     list_insert(&new_md->adj, &md->adj);
861 serge 199
859 serge 200
 
201
     new_md->size = size;
202
     new_md->parent = md->parent;
203
     new_md->reserved = 0;
204
205
 
206
     md->size-= size;
207
208
 
861 serge 209
859 serge 210
 
861 serge 211
212
 
213
       list_prepend(&md->link, &sheap.list[idx1]);
214
     else
215
     {
216
       if( list_empty(&sheap.list[31]))
217
         list_prepend(&md->link, &sheap.list[31]);
218
       else
219
       {
220
         md_t *tmp = (md_t*)sheap.list[31].next;
221
222
 
223
         {
224
           if(md->base < tmp->base)
225
             break;
226
           tmp = (md_t*)tmp->link.next;
227
         }
228
         list_insert(&md->link, &tmp->link);
229
       };
230
     };
231
232
 
859 serge 233
234
 
235
236
 
237
   }
238
   safe_sti(efl);
239
   return md;
240
}
241
242
 
243
{
244
   phismem_t *phm;
245
   count_t tmp;
246
   phm = (phismem_t*)slab_alloc(phm_slab, 0);
247
248
 
249
   tmp = count;
250
   while(tmp)
251
   {
252
      u32_t order;
253
254
 
255
      asm volatile ("btr %0, %1" :"=r"(tmp):"r"(order):"cc");
256
257
 
258
259
 
260
261
 
262
}
263
264
 
265
266
 
267
{
268
   count_t count;
269
   addr_t  *pte;
270
271
 
272
   pte = &((addr_t*)page_tabs)[base>>12];
273
274
 
275
   {
276
     u32_t order;
277
     addr_t frame;
278
     count_t size;
279
280
 
281
     asm volatile ("btr %0, %1" :"=r"(count):"r"(order):"cc");
282
283
 
284
     size = (1 << order);
285
     while(size--)
286
     {
287
       *pte++ = frame;
288
       frame+= 4096;
289
     }
290
   }
291
};
292
293
 
294
{
295
   md_t *md;
296
   phismem_t *phm;
297
298
 
299
300
 
301
   if( md )
302
   {
303
     phm = phis_alloc(size>>12);
304
     map_phm(md->base, phm, flags);
305
     return (void*)md->base;
306
   }
307
   return NULL;
308
};
309
310
 
311
312
 
313
 
314
{
315
   md_t *md;
316
317
 
318
319
 
320
861 serge 321
 
322
   if( md )
859 serge 323
     return (void*)md->base;
324
   return NULL;
325
}
326
327
 
328
//{
329
//
330
//   return NULL;
331
//}
332
//*/
333