Subversion Repositories Kolibri OS

Rev

Rev 861 | Go to most recent revision | Details | 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(&md->adj, &new_md->adj);
113
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
 
147
   {
148
     idx0 = _bsf(mask);
149
150
 
151
152
 
153
154
 
155
     if(list_empty(&sheap.list[idx0]))
156
       _reset_smask(idx0);
157
   }
158
   else
159
   {
160
     md_t *lmd;
161
     lmd = find_large_md((size+0x3FFFFF)&~0x3FFFFF);
162
     if( !lmd)
163
     {
164
       safe_sti(efl);
165
       return NULL;
166
     };
167
168
 
169
     link_initialize(&md->link);
170
     list_initialize(&md->adj);
171
     md->base = lmd->base;
172
     md->size = lmd->size;
173
     md->parent  = lmd;
174
     md->reserved = 0;
175
   };
176
177
 
178
   {
179
     count_t idx1;
180
     md_t *new_md = (md_t*)slab_alloc(md_slab,0);
181
182
 
183
     list_insert(&md->adj, &new_md->adj);
184
185
 
186
     new_md->size = size;
187
     new_md->parent = md->parent;
188
     new_md->reserved = 0;
189
190
 
191
     md->size-= size;
192
193
 
194
195
 
196
     _set_smask(idx1);
197
198
 
199
200
 
201
   }
202
   safe_sti(efl);
203
   return md;
204
}
205
206
 
207
{
208
   phismem_t *phm;
209
   count_t tmp;
210
   phm = (phismem_t*)slab_alloc(phm_slab, 0);
211
212
 
213
   tmp = count;
214
   while(tmp)
215
   {
216
      u32_t order;
217
218
 
219
      asm volatile ("btr %0, %1" :"=r"(tmp):"r"(order):"cc");
220
221
 
222
223
 
224
225
 
226
}
227
228
 
229
230
 
231
{
232
   count_t count;
233
   addr_t  *pte;
234
235
 
236
   pte = &((addr_t*)page_tabs)[base>>12];
237
238
 
239
   {
240
     u32_t order;
241
     addr_t frame;
242
     count_t size;
243
244
 
245
     asm volatile ("btr %0, %1" :"=r"(count):"r"(order):"cc");
246
247
 
248
     size = (1 << order);
249
     while(size--)
250
     {
251
       *pte++ = frame;
252
       frame+= 4096;
253
     }
254
   }
255
};
256
257
 
258
{
259
   md_t *md;
260
   phismem_t *phm;
261
262
 
263
264
 
265
   if( md )
266
   {
267
     phm = phis_alloc(size>>12);
268
     map_phm(md->base, phm, flags);
269
     return (void*)md->base;
270
   }
271
   return NULL;
272
};
273
274
 
275
276
 
277
 
278
{
279
   md_t *md;
280
281
 
282
283
 
284
   if( md )
285
     return (void*)md->base;
286
   return NULL;
287
}
288
289
 
290
//{
291
//
292
//   return NULL;
293
//}
294
//*/
295