110,7 → 110,7 |
if(idx0 == 31) |
{ |
md_t *tmp = (md_t*)lheap.unmapped[31].next; |
while((link_t*)tmp != &lheap.unmapped[31]) |
while(&tmp->link != &lheap.unmapped[31]) |
{ |
if(tmp->size >= size) |
{ |
193,7 → 193,7 |
ASSERT( !list_empty(&sheap.unmapped[31])); |
|
md_t *tmp = (md_t*)sheap.unmapped[31].next; |
while((link_t*)tmp != &sheap.unmapped[31]) |
while( &tmp->link != &sheap.unmapped[31]) |
{ |
if(tmp->size >= size) |
{ |
283,7 → 283,7 |
{ |
md_t *tmp = (md_t*)sheap.unmapped[31].next; |
|
while((link_t*)tmp != &sheap.unmapped[31]) |
while( &tmp->link != &sheap.unmapped[31]) |
{ |
if(md->base < tmp->base) |
break; |
333,7 → 333,7 |
ASSERT( !list_empty(&sheap.mapped[31])); |
|
md_t *tmp = (md_t*)sheap.mapped[31].next; |
while((link_t*)tmp != &sheap.mapped[31]) |
while( &tmp->link != &sheap.mapped[31]) |
{ |
if(tmp->size >= size) |
{ |
437,7 → 437,7 |
{ |
md_t *tmp = (md_t*)sheap.mapped[31].next; |
|
while((link_t*)tmp != &sheap.mapped[31]) |
while( &tmp->link != &sheap.mapped[31]) |
{ |
if(md->base < tmp->base) |
break; |
521,7 → 521,7 |
{ |
md_t *tmp = (md_t*)sheap.unmapped[31].next; |
|
while((link_t*)tmp != &sheap.unmapped[31]) |
while( &tmp->link != &sheap.unmapped[31]) |
{ |
if(md->base < tmp->base) |
break; |
598,7 → 598,7 |
{ |
md_t *tmp = (md_t*)sheap.mapped[31].next; |
|
while((link_t*)tmp != &sheap.mapped[31]) |
while( &tmp->link != &sheap.mapped[31]) |
{ |
if(md->base < tmp->base) |
break; |
663,6 → 663,44 |
}; |
|
|
void __fastcall md_free(md_t *md) |
{ |
|
if( md ) |
{ |
md_t *lmd; |
|
DBG("free md: %x base: %x size: %x\n",md, md->base, md->size); |
|
ASSERT(md->state == MD_USED); |
|
list_remove((link_t*)md); |
|
lmd = (md_t*)md->parent; |
|
ASSERT(lmd != 0); |
|
if(lmd->parent != 0) |
{ |
addr_t mem = md->base; |
addr_t *pte = &((addr_t*)page_tabs)[md->base>>12]; |
count_t tmp = md->size >> 12; |
|
while(tmp--) |
{ |
*pte++ = 0; |
asm volatile ( "invlpg (%0)" ::"r" (mem) ); |
mem+= 4096; |
}; |
free_mapped_md( md ); |
} |
else |
free_unmapped_md( md ); |
} |
|
return; |
}; |
|
void * __fastcall mem_alloc(size_t size, u32_t flags) |
{ |
eflags_t efl; |
687,7 → 725,7 |
{ |
md_t *tmp = (md_t*)sheap.used.next; |
|
while((link_t*)tmp != &sheap.used) |
while( &tmp->link != &sheap.used) |
{ |
if(md->base < tmp->base) |
break; |
720,7 → 758,7 |
|
tmp = (md_t*)sheap.used.next; |
|
while((link_t*)tmp != &sheap.used) |
while( &tmp->link != &sheap.used) |
{ |
if( tmp->base == (addr_t)mem ) |
{ |
732,38 → 770,10 |
|
if( md ) |
{ |
md_t *lmd; |
md_free( md ); |
|
DBG("\tmd: %x base: %x size: %x\n",md, md->base, md->size); |
|
ASSERT(md->state == MD_USED); |
|
list_remove((link_t*)md); |
|
lmd = (md_t*)md->parent; |
|
ASSERT(lmd != 0); |
|
if(lmd->parent != 0) |
{ |
count_t tmp = md->size >> 12; |
addr_t *pte = &((addr_t*)page_tabs)[md->base>>12]; |
|
while(tmp--) |
{ |
*pte++ = 0; |
asm volatile ( |
"invlpg (%0)" |
::"r" (mem) ); |
mem+= 4096; |
}; |
|
free_mapped_md( md ); |
} |
else |
free_unmapped_md( md ); |
} |
else |
DBG("\tERROR: invalid base address: %x\n", mem); |
|
safe_sti(efl); |