Cleanup and Bugfixes
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / heap.c
index 10cdb24..499d24c 100644 (file)
@@ -140,7 +140,10 @@ EXPORT void *malloc(size_t bytes)
 */\r
 EXPORT void free(void *mem)\r
 {\r
-       heap_head       *head = mem;\r
+       heap_head       *head = (void*)((intptr_t)mem-sizeof(heap_head));\r
+       \r
+       // Sanity please!\r
+       if(!mem)        return;\r
        \r
        if(head->magic != MAGIC)        //Valid Heap Address\r
                return;\r
@@ -148,19 +151,19 @@ EXPORT void free(void *mem)
        head->magic = MAGIC_FREE;\r
        \r
        //Unify Right\r
-       if((Uint)head + head->size < (Uint)_heap_end)\r
+       if((intptr_t)head + head->size < (intptr_t)_heap_end)\r
        {\r
-               heap_head       *nextHead = (heap_head*)((Uint)head + head->size);\r
+               heap_head       *nextHead = (heap_head*)((intptr_t)head + head->size);\r
                if(nextHead->magic == MAGIC_FREE) {     //Is the next block free\r
                        head->size += nextHead->size;   //Amalgamate\r
                        nextHead->magic = 0;    //For Security\r
                }\r
        }\r
        //Unify Left\r
-       if((Uint)head - sizeof(heap_foot) > (Uint)_heap_start)\r
+       if((intptr_t)head - sizeof(heap_foot) > (intptr_t)_heap_start)\r
        {\r
                heap_head       *prevHead;\r
-               heap_foot       *prevFoot = (heap_foot *)((Uint)head - sizeof(heap_foot));\r
+               heap_foot       *prevFoot = (heap_foot *)((intptr_t)head - sizeof(heap_foot));\r
                if(prevFoot->magic == MAGIC) {\r
                        prevHead = prevFoot->header;\r
                        if(prevHead->magic == MAGIC_FREE) {\r
@@ -304,10 +307,12 @@ EXPORT int IsHeap(void *ptr)
  */\r
 static void *FindHeapBase()\r
 {\r
+       #if 0\r
        #define MAX             0xC0000000      // Address\r
        #define THRESHOLD       512     // Pages\r
        uint    addr;\r
        uint    stretch = 0;\r
+       uint64_t        tmp;\r
        \r
        // Scan address space\r
        for(addr = 0;\r
@@ -315,17 +320,25 @@ static void *FindHeapBase()
                addr += 0x1000\r
                )\r
        {\r
-               if( _SysGetPhys(addr) == 0 ) {\r
+               tmp = _SysGetPhys(addr);\r
+               if( tmp != 0 ) {\r
                        stretch = 0;\r
                } else {\r
                        stretch ++;\r
                        if(stretch > THRESHOLD)\r
                        {\r
-                               return (void*)( addr + stretch*0x1000 );\r
+                               return (void*)( addr - stretch*0x1000 );\r
                        }\r
                }\r
+               //__asm__ __volatile__ (\r
+               //      "push %%ebx;mov %%edx,%%ebx;int $0xAC;pop %%ebx"\r
+               //      ::"a"(256),"d"("%x"),"c"(addr));\r
        }\r
+       \r
        return NULL;\r
+       #else\r
+       return (void*)0x00900000;\r
+       #endif\r
 }\r
 \r
 LOCAL uint brk(Uint newpos)\r

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