Subversion Repositories Kolibri OS

Rev

Rev 889 | Rev 908 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 889 Rev 892
Line 108... Line 108...
108
    {
108
    {
109
        if(idx0 == 31)
109
        if(idx0 == 31)
110
        {
110
        {
111
            md_t *tmp = (md_t*)lheap.unmapped[31].next;
111
            md_t *tmp = (md_t*)lheap.unmapped[31].next;
112
            while((link_t*)tmp != &lheap.unmapped[31])
112
            while(&tmp->link != &lheap.unmapped[31])
113
            {
113
            {
114
                if(tmp->size >= size)
114
                if(tmp->size >= size)
115
                {
115
                {
116
                    DBG("remove large tmp %x\n", tmp);
116
                    DBG("remove large tmp %x\n", tmp);
117
 
117
 
Line 191... Line 191...
191
        {
191
        {
192
            ASSERT( !list_empty(&sheap.unmapped[31]));
192
            ASSERT( !list_empty(&sheap.unmapped[31]));
193
 
193
 
Line 194... Line 194...
194
            md_t *tmp = (md_t*)sheap.unmapped[31].next;
194
            md_t *tmp = (md_t*)sheap.unmapped[31].next;
195
            while((link_t*)tmp != &sheap.unmapped[31])
195
            while( &tmp->link != &sheap.unmapped[31])
196
            {
196
            {
197
                if(tmp->size >= size)
197
                if(tmp->size >= size)
198
                {
198
                {
199
                    md = tmp;
199
                    md = tmp;
200
                    break;
200
                    break;
Line 281... Line 281...
281
            else
281
            else
282
            {
282
            {
283
                md_t *tmp = (md_t*)sheap.unmapped[31].next;
283
                md_t *tmp = (md_t*)sheap.unmapped[31].next;
284
 
284
 
Line 285... Line 285...
285
                while((link_t*)tmp != &sheap.unmapped[31])
285
                while( &tmp->link != &sheap.unmapped[31])
286
                {
286
                {
287
                    if(md->base < tmp->base)
287
                    if(md->base < tmp->base)
288
                        break;
288
                        break;
289
                    tmp = (md_t*)tmp->link.next;
289
                    tmp = (md_t*)tmp->link.next;
290
                }
290
                }
Line 331... Line 331...
331
        {
331
        {
332
            ASSERT( !list_empty(&sheap.mapped[31]));
332
            ASSERT( !list_empty(&sheap.mapped[31]));
333
 
333
 
Line 334... Line 334...
334
            md_t *tmp = (md_t*)sheap.mapped[31].next;
334
            md_t *tmp = (md_t*)sheap.mapped[31].next;
335
            while((link_t*)tmp != &sheap.mapped[31])
335
            while( &tmp->link != &sheap.mapped[31])
336
            {
336
            {
337
                if(tmp->size >= size)
337
                if(tmp->size >= size)
338
                {
338
                {
339
                    md = tmp;
339
                    md = tmp;
340
                    break;
340
                    break;
Line 435... Line 435...
435
            else
435
            else
436
            {
436
            {
437
                md_t *tmp = (md_t*)sheap.mapped[31].next;
437
                md_t *tmp = (md_t*)sheap.mapped[31].next;
438
 
438
 
Line 439... Line 439...
439
                while((link_t*)tmp != &sheap.mapped[31])
439
                while( &tmp->link != &sheap.mapped[31])
440
                {
440
                {
441
                    if(md->base < tmp->base)
441
                    if(md->base < tmp->base)
442
                        break;
442
                        break;
443
                    tmp = (md_t*)tmp->link.next;
443
                    tmp = (md_t*)tmp->link.next;
444
                }
444
                }
Line 519... Line 519...
519
        else
519
        else
520
        {
520
        {
521
            md_t *tmp = (md_t*)sheap.unmapped[31].next;
521
            md_t *tmp = (md_t*)sheap.unmapped[31].next;
522
 
522
 
Line 523... Line 523...
523
            while((link_t*)tmp != &sheap.unmapped[31])
523
            while( &tmp->link != &sheap.unmapped[31])
524
            {
524
            {
525
                if(md->base < tmp->base)
525
                if(md->base < tmp->base)
526
                    break;
526
                    break;
527
                tmp = (md_t*)tmp->link.next;
527
                tmp = (md_t*)tmp->link.next;
528
            }
528
            }
Line 596... Line 596...
596
        else
596
        else
597
        {
597
        {
598
            md_t *tmp = (md_t*)sheap.mapped[31].next;
598
            md_t *tmp = (md_t*)sheap.mapped[31].next;
599
 
599
 
Line 600... Line 600...
600
            while((link_t*)tmp != &sheap.mapped[31])
600
            while( &tmp->link != &sheap.mapped[31])
601
            {
601
            {
602
                if(md->base < tmp->base)
602
                if(md->base < tmp->base)
603
                    break;
603
                    break;
604
                tmp = (md_t*)tmp->link.next;
604
                tmp = (md_t*)tmp->link.next;
605
            }
605
            }
Line 661... Line 661...
661
    return md;
661
    return md;
662
};
662
};
Line -... Line 663...
-
 
663
 
-
 
664
 
-
 
665
void __fastcall md_free(md_t *md)
-
 
666
{
-
 
667
 
-
 
668
    if( md )
-
 
669
    {
-
 
670
        md_t *lmd;
-
 
671
 
-
 
672
        DBG("free md: %x base: %x size: %x\n",md, md->base, md->size);
-
 
673
 
-
 
674
        ASSERT(md->state == MD_USED);
-
 
675
 
-
 
676
        list_remove((link_t*)md);
-
 
677
 
-
 
678
        lmd = (md_t*)md->parent;
-
 
679
 
-
 
680
        ASSERT(lmd != 0);
-
 
681
 
-
 
682
        if(lmd->parent != 0)
-
 
683
        {
-
 
684
            addr_t   mem = md->base;
-
 
685
            addr_t  *pte = &((addr_t*)page_tabs)[md->base>>12];
-
 
686
            count_t  tmp  = md->size >> 12;
-
 
687
 
-
 
688
            while(tmp--)
-
 
689
            {
-
 
690
                *pte++ = 0;
-
 
691
                asm volatile ( "invlpg (%0)" ::"r" (mem) );
-
 
692
                mem+= 4096;
-
 
693
            };
-
 
694
            free_mapped_md( md );
-
 
695
        }
-
 
696
        else
-
 
697
            free_unmapped_md( md );
-
 
698
    }
-
 
699
 
-
 
700
    return;
663
 
701
};
664
 
702
 
665
void * __fastcall mem_alloc(size_t size, u32_t flags)
703
void * __fastcall mem_alloc(size_t size, u32_t flags)
Line 666... Line 704...
666
{
704
{
Line 685... Line 723...
685
    else
723
    else
686
    {
724
    {
687
        md_t *tmp = (md_t*)sheap.used.next;
725
        md_t *tmp = (md_t*)sheap.used.next;
688
 
726
 
Line 689... Line 727...
689
        while((link_t*)tmp != &sheap.used)
727
        while( &tmp->link != &sheap.used)
690
        {
728
        {
691
            if(md->base < tmp->base)
729
            if(md->base < tmp->base)
692
                break;
730
                break;
693
            tmp = (md_t*)tmp->link.next;
731
            tmp = (md_t*)tmp->link.next;
694
        }
732
        }
Line 718... Line 756...
718
    efl = safe_cli();
756
    efl = safe_cli();
Line 719... Line 757...
719
 
757
 
Line 720... Line 758...
720
    tmp = (md_t*)sheap.used.next;
758
    tmp = (md_t*)sheap.used.next;
721
 
759
 
722
    while((link_t*)tmp != &sheap.used)
760
    while( &tmp->link != &sheap.used)
723
    {
761
    {
724
        if( tmp->base == (addr_t)mem )
762
        if( tmp->base == (addr_t)mem )
725
        {
763
        {
Line 730... Line 768...
730
    }
768
    }
731
 
769
 
Line 732... Line 770...
732
    if( md )
770
    if( md )
733
    {
771
    {
734
        md_t *lmd;
772
        md_free( md );
735
 
-
 
736
        DBG("\tmd: %x base: %x size: %x\n",md, md->base, md->size);
-
 
737
 
-
 
738
        ASSERT(md->state == MD_USED);
-
 
Line 739... Line -...
739
 
-
 
740
        list_remove((link_t*)md);
-
 
741
 
-
 
742
        lmd = (md_t*)md->parent;
-
 
743
 
-
 
744
        ASSERT(lmd != 0);
-
 
745
 
-
 
746
        if(lmd->parent != 0)
-
 
747
        {
-
 
748
            count_t tmp  = md->size >> 12;
-
 
749
            addr_t  *pte = &((addr_t*)page_tabs)[md->base>>12];
-
 
750
 
-
 
751
            while(tmp--)
-
 
752
            {
-
 
753
                *pte++ = 0;
-
 
754
                asm volatile (
-
 
755
                    "invlpg (%0)"
-
 
756
                    ::"r" (mem) );
-
 
757
                mem+= 4096;
-
 
758
            };
-
 
759
 
-
 
760
            free_mapped_md( md );
-
 
761
        }
-
 
762
        else
-
 
763
            free_unmapped_md( md );
773
 
764
    }
774
    }
765
    else
775
    else
Line 766... Line 776...
766
        DBG("\tERROR: invalid base address: %x\n", mem);
776
        DBG("\tERROR: invalid base address: %x\n", mem);