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); |