Rev 861 | Rev 864 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 861 | Rev 862 | ||
---|---|---|---|
Line 47... | Line 47... | ||
47 | u32_t i; |
47 | u32_t i; |
48 | 48 | ||
Line 49... | Line 49... | ||
49 | ASSERT(base != 0); |
49 | ASSERT(base != 0); |
50 | ASSERT(size != 0) |
50 | ASSERT(size != 0) |
51 | ASSERT(base & 0x3FFFFF == 0); |
51 | ASSERT((base & 0x3FFFFF) == 0); |
52 | ASSERT(size & 0x3FFFFF == 0); |
52 | ASSERT((size & 0x3FFFFF) == 0); |
Line 53... | Line 53... | ||
53 | 53 | ||
54 | for (i = 0; i < 32; i++) |
54 | for (i = 0; i < 32; i++) |
55 | { |
55 | { |
56 | list_initialize(&lheap.list[i]); |
56 | list_initialize(&lheap.list[i]); |
Line 82... | Line 82... | ||
82 | 82 | ||
Line 83... | Line 83... | ||
83 | count_t idx0; |
83 | count_t idx0; |
84 | u32_t mask; |
84 | u32_t mask; |
Line 85... | Line 85... | ||
85 | 85 | ||
Line 86... | Line 86... | ||
86 | ASSERT(size & 0x3FFFFF == 0); |
86 | ASSERT((size & 0x3FFFFF) == 0); |
87 | 87 | ||
Line 88... | Line 88... | ||
88 | idx0 = (size>>22) - 1 < 32 ? (size>>22) - 1 : 31; |
88 | idx0 = (size>>22) - 1 < 32 ? (size>>22) - 1 : 31; |
89 | mask = lheap.availmask & ( -1< |
89 | mask = lheap.availmask & ( -1< |
- | 90 | ||
- | 91 | if(mask) |
|
- | 92 | { |
|
- | 93 | if(idx0 == 31) |
|
- | 94 | { |
|
- | 95 | md_t *tmp = (md_t*)lheap.list[31].next; |
|
- | 96 | while((link_t*)tmp != &lheap.list[31]) |
|
- | 97 | { |
|
- | 98 | if(tmp->size >= size) |
|
- | 99 | { |
|
- | 100 | DBG("remove large tmp %x\n", tmp); |
|
- | 101 | ||
- | 102 | md = tmp; |
|
- | 103 | break; |
|
- | 104 | }; |
|
- | 105 | }; |
|
- | 106 | tmp = (md_t*)tmp->link.next; |
|
90 | 107 | } |
|
Line 91... | Line 108... | ||
91 | if(mask) |
108 | else |
Line 92... | Line 109... | ||
92 | { |
109 | { |
- | 110 | idx0 = _bsf(mask); |
|
93 | idx0 = _bsf(mask); |
111 | |
94 | 112 | ASSERT( !list_empty(&lheap.list[idx0])) |
|
95 | ASSERT( !list_empty(&lheap.list[idx0])) |
113 | |
Line 96... | Line 114... | ||
96 | 114 | md = (md_t*)lheap.list[idx0].next; |
|
Line 135... | Line 153... | ||
135 | 153 | ||
Line 136... | Line 154... | ||
136 | count_t idx0; |
154 | count_t idx0; |
137 | u32_t mask; |
155 | u32_t mask; |
Line 138... | Line 156... | ||
138 | 156 | ||
Line 139... | Line 157... | ||
139 | ASSERT(size & 0xFFF == 0); |
157 | ASSERT((size & 0xFFF) == 0); |
Line 140... | Line 158... | ||
140 | 158 | ||
141 | efl = safe_cli(); |
159 | efl = safe_cli(); |
Line 142... | Line 160... | ||
142 | 160 | ||
Line 143... | Line 161... | ||
143 | idx0 = (size>>12) - 1 < 32 ? (size>>12) - 1 : 31; |
161 | idx0 = (size>>12) - 1 < 32 ? (size>>12) - 1 : 31; |
144 | mask = sheap.availmask & ( -1< |
162 | mask = sheap.availmask & ( -1< |
145 | 163 | ||
146 | //printf("smask %x size %x idx0 %x mask %x\n",sheap.availmask, size, idx0, mask); |
- | |
147 | 164 | DBG("smask %x size %x idx0 %x mask %x\n",sheap.availmask, size, idx0, mask); |
|
148 | if(mask) |
- | |
149 | { |
- | |
150 | md_t *tmp; |
- | |
151 | 165 | ||
152 | idx0 = _bsf(mask); |
- | |
153 | 166 | if(mask) |
|
154 | ASSERT( !list_empty(&sheap.list[idx0])) |
167 | { |
155 | 168 | if(idx0 == 31) |
|
156 | tmp = (md_t*)sheap.list[idx0].next; |
169 | { |
157 | - | ||
158 | while((link_t*)tmp != &sheap.list[idx0]) |
- | |
159 | { |
- | |
160 | if(tmp->size >= size) |
- | |
161 | { |
170 | md_t *tmp = (md_t*)sheap.list[31].next; |
162 | //printf("remove tmp %x\n", tmp); |
171 | while((link_t*)tmp != &sheap.list[31]) |
163 | list_remove((link_t*)tmp); |
172 | { |
164 | if(list_empty(&sheap.list[idx0])) |
173 | if(tmp->size >= size) |
165 | _reset_smask(idx0); |
174 | { |
- | 175 | md = tmp; |
|
- | 176 | break; |
|
- | 177 | }; |
|
- | 178 | tmp = (md_t*)tmp->link.next; |
|
- | 179 | }; |
|
- | 180 | } |
|
- | 181 | else |
|
166 | md = tmp; |
182 | { |
Line 167... | Line 183... | ||
167 | break; |
183 | idx0 = _bsf(mask); |
- | 184 | ASSERT( !list_empty(&sheap.list[idx0])) |
|
- | 185 | md = (md_t*)sheap.list[idx0].next; |
|
- | 186 | } |
|
- | 187 | }; |
|
- | 188 | ||
- | 189 | if(md) |
|
- | 190 | { |
|
- | 191 | DBG("remove md %x\n", md); |
|
168 | }; |
192 | |
169 | tmp = (md_t*)tmp->link.next; |
193 | list_remove((link_t*)md); |
170 | }; |
194 | if(list_empty(&sheap.list[idx0])) |
- | 195 | _reset_smask(idx0); |
|
- | 196 | } |
|
- | 197 | else |
|
171 | }; |
198 | { |
172 | 199 | md_t *lmd; |
|
173 | if( !md) |
200 | lmd = find_large_md((size+0x3FFFFF)&~0x3FFFFF); |
174 | { |
201 | |
175 | md_t *lmd; |
202 | DBG("get large md %x\n", lmd); |
Line 206... | Line 233... | ||
206 | md->size-= size; |
233 | md->size-= size; |
207 | 234 | ||
Line 208... | Line 235... | ||
208 | idx1 = (md->size>>12) - 1 < 32 ? (md->size>>12) - 1 : 31; |
235 | idx1 = (md->size>>12) - 1 < 32 ? (md->size>>12) - 1 : 31; |
Line 209... | Line 236... | ||
209 | 236 | ||
Line 210... | Line 237... | ||
210 | //printf("insert md %x, base %x size %x idx %x\n", md,md->base, md->size,idx1); |
237 | DBG("insert md %x, base %x size %x idx %x\n", md,md->base, md->size,idx1); |
211 | 238 | ||
212 | if( idx1 < 31) |
239 | if( idx1 < 31) |
213 | list_prepend(&md->link, &sheap.list[idx1]); |
240 | list_prepend(&md->link, &sheap.list[idx1]); |
Line 317... | Line 344... | ||
317 | size = (size+4095)&~4095; |
344 | size = (size+4095)&~4095; |
Line 318... | Line 345... | ||
318 | 345 | ||
Line 319... | Line 346... | ||
319 | md = find_small_md(size); |
346 | md = find_small_md(size); |
- | 347 | ||
320 | 348 | DBG("alloc_kernel_space: %x size %x\n\n",md->base, size); |
|
321 | // printf("alloc_kernel_space: %x size %x\n\n",md->base, size); |
349 | |
322 | if( md ) |
350 | if( md ) |
323 | return (void*)md->base; |
351 | return (void*)md->base; |