More 32-bit int fixes
[tpg/acess2.git] / Kernel / heap.c
index 3a0edb3..75854b3 100644 (file)
@@ -10,8 +10,6 @@
 #define        DEBUG_TRACE     0
 
 // === CONSTANTS ===
-#define HEAP_BASE      0xE0800000
-#define HEAP_MAX       0xF0000000      // 120MiB, Plenty
 #define        HEAP_INIT_SIZE  0x8000  // 32 KiB
 #define        BLOCK_SIZE      (sizeof(void*)) // 8 Machine Words
 #define        COMPACT_HEAP    0       // Use 4 byte header?
@@ -30,7 +28,7 @@ void  free(void *Ptr);
 void   Heap_Dump();
 
 // === GLOBALS ===
- int   glHeap;
+tSpinlock      glHeap;
 void   *gHeapStart;
 void   *gHeapEnd;
 
@@ -53,18 +51,18 @@ void *Heap_Extend(int Bytes)
        tHeapFoot       *foot;
        
        // Bounds Check
-       if( (Uint)gHeapEnd == MM_KHEAP_MAX )
+       if( (tVAddr)gHeapEnd == MM_KHEAP_MAX )
                return NULL;
        
        // Bounds Check
-       if( (Uint)gHeapEnd + ((Bytes+0xFFF)&~0xFFF) > MM_KHEAP_MAX ) {
-               Bytes = MM_KHEAP_MAX - (Uint)gHeapEnd;
+       if( (tVAddr)gHeapEnd + ((Bytes+0xFFF)&~0xFFF) > MM_KHEAP_MAX ) {
+               Bytes = MM_KHEAP_MAX - (tVAddr)gHeapEnd;
                return NULL;
        }
        
        // Heap expands in pages
        for(i=0;i<(Bytes+0xFFF)>>12;i++)
-               MM_Allocate( (Uint)gHeapEnd+(i<<12) );
+               MM_Allocate( (tVAddr)gHeapEnd+(i<<12) );
        
        // Increas heap end
        gHeapEnd += i << 12;
@@ -76,7 +74,6 @@ void *Heap_Extend(int Bytes)
        foot->Head = head;
        foot->Magic = MAGIC_FOOT;
        
-       //Log(" Heap_Extend: head = %p", head);
        return Heap_Merge(head);        // Merge with previous block
 }
 
@@ -97,7 +94,7 @@ void *Heap_Merge(tHeapHead *Head)
        
        // Merge Left (Down)
        foot = (void*)( (Uint)Head - sizeof(tHeapFoot) );
-       if( ((Uint)foot < (Uint)gHeapEnd && (Uint)foot > HEAP_BASE)
+       if( ((Uint)foot < (Uint)gHeapEnd && (Uint)foot > (Uint)gHeapStart)
        && foot->Head->Magic == MAGIC_FREE) {
                foot->Head->Size += Head->Size; // Increase size
                thisFoot->Head = foot->Head;    // Change backlink
@@ -151,7 +148,7 @@ void *malloc(size_t Bytes)
                // Alignment Check
                if( head->Size & (BLOCK_SIZE-1) ) {
                        #if WARNINGS
-                       Warning("Size of heap address %p is invalid not aligned (0x%x)", head, head->Size);
+                       Log_Warning("Heap", "Size of heap address %p is invalid not aligned (0x%x)", head, head->Size);
                        Heap_Dump();
                        #endif
                        RELEASE(&glHeap);
@@ -163,7 +160,7 @@ void *malloc(size_t Bytes)
                // Error check
                if(head->Magic != MAGIC_FREE)   {
                        #if WARNINGS
-                       Warning("Magic of heap address %p is invalid (0x%x)", head, head->Magic);
+                       Log_Warning("Heap", "Magic of heap address %p is invalid (0x%x)", head, head->Magic);
                        Heap_Dump();
                        #endif
                        RELEASE(&glHeap);       // Release spinlock
@@ -178,9 +175,9 @@ void *malloc(size_t Bytes)
                        head->Magic = MAGIC_USED;
                        RELEASE(&glHeap);       // Release spinlock
                        #if DEBUG_TRACE
-                       LOG("RETURN %p, to %p", best->Data, __builtin_return_address(0));
+                       Log("[Heap   ] Malloc'd %p (%i bytes), returning to %p", head->Data, head->Size,  __builtin_return_address(0));
                        #endif
-                       return best->Data;
+                       return head->Data;
                }
                
                // Break out of loop
@@ -210,7 +207,7 @@ void *malloc(size_t Bytes)
                if(best->Size == Bytes) {
                        RELEASE(&glHeap);       // Release spinlock
                        #if DEBUG_TRACE
-                       LOG("RETURN %p, to %p", best->Data, __builtin_return_address(0));
+                       Log("[Heap   ] Malloc'd %p (%i bytes), returning to %p", best->Data, best->Size, __builtin_return_address(0));
                        #endif
                        return best->Data;
                }
@@ -231,7 +228,7 @@ void *malloc(size_t Bytes)
        
        RELEASE(&glHeap);       // Release spinlock
        #if DEBUG_TRACE
-       LOG("RETURN %p, to %p", best->Data, __builtin_return_address(0));
+       Log("[Heap   ] Malloc'd %p (%i bytes), returning to %p", best->Data, best->Size, __builtin_return_address(0));
        #endif
        return best->Data;
 }
@@ -246,8 +243,8 @@ void free(void *Ptr)
        tHeapFoot       *foot;
        
        #if DEBUG_TRACE
-       LOG("Ptr = %p", Ptr);
-       LOG("Returns to %p", __builtin_return_address(0));
+       Log_Log("Heap", "free: Ptr = %p", Ptr);
+       Log_Log("Heap", "free: Returns to %p", __builtin_return_address(0));
        #endif
        
        // Alignment Check
@@ -414,31 +411,31 @@ void Heap_Dump()
        while( (Uint)head < (Uint)gHeapEnd )
        {               
                foot = (void*)( (Uint)head + head->Size - sizeof(tHeapFoot) );
-               Log("%p (0x%x): 0x%08lx 0x%lx", head, MM_GetPhysAddr((Uint)head), head->Size, head->Magic);
-               Log("%p 0x%lx", foot->Head, foot->Magic);
-               Log("");
+               Log_Log("Heap", "%p (0x%x): 0x%08lx 0x%lx", head, MM_GetPhysAddr((Uint)head), head->Size, head->Magic);
+               Log_Log("Heap", "%p 0x%lx", foot->Head, foot->Magic);
+               Log_Log("Heap", "");
                
                // Sanity Check Header
                if(head->Size == 0) {
-                       Log("HALTED - Size is zero");
+                       Log_Warning("Heap", "HALTED - Size is zero");
                        break;
                }
                if(head->Size & (BLOCK_SIZE-1)) {
-                       Log("HALTED - Size is malaligned");
+                       Log_Warning("Heap", "HALTED - Size is malaligned");
                        break;
                }
                if(head->Magic != MAGIC_FREE && head->Magic != MAGIC_USED) {
-                       Log("HALTED - Head Magic is Bad");
+                       Log_Warning("Heap", "HALTED - Head Magic is Bad");
                        break;
                }
                
                // Check footer
                if(foot->Magic != MAGIC_FOOT) {
-                       Log("HALTED - Foot Magic is Bad");
+                       Log_Warning("Heap", "HALTED - Foot Magic is Bad");
                        break;
                }
                if(head != foot->Head) {
-                       Log("HALTED - Footer backlink is invalid");
+                       Log_Warning("Heap", "HALTED - Footer backlink is invalid");
                        break;
                }
                

UCC git Repository :: git.ucc.asn.au