Merge branch 'master' of git://git.ucc.asn.au/acess2
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / heap.c
index 23df92a..499d24c 100644 (file)
@@ -34,7 +34,7 @@ EXPORT void   free(void *mem);
 EXPORT void    *realloc(void *mem, Uint bytes);\r
 EXPORT void    *sbrk(int increment);\r
 LOCAL void     *extendHeap(int bytes);\r
-LOCAL uint     brk(int delta);\r
+LOCAL uint     brk(Uint newpos);\r
 \r
 //Code\r
 \r
@@ -53,7 +53,7 @@ EXPORT void *malloc(size_t bytes)
        \r
        // Initialise Heap\r
        if(_heap_start == NULL)\r
-       {LOCAL void     *sbrk(int delta);\r
+       {\r
                _heap_start = sbrk(0);\r
                _heap_end = _heap_start;\r
                extendHeap(HEAP_INIT_SIZE);\r
@@ -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
@@ -208,10 +211,10 @@ EXPORT void *realloc(void *oldPos, size_t bytes)
 }\r
 \r
 /**\r
- \fn LOCAL void *extendHeap(int bytes)\r
- \brief Create a new block at the end of the heap area\r
\param bytes  Integer - Size reqired\r
- \return Pointer to last free block\r
\fn LOCAL void *extendHeap(int bytes)\r
\brief Create a new block at the end of the heap area\r
* \param bytes        Integer - Size reqired\r
\return Pointer to last free block\r
  */\r
 \r
 LOCAL void *extendHeap(int bytes)\r
@@ -260,7 +263,7 @@ EXPORT void *sbrk(int increment)
        static size_t oldEnd = 0;\r
        static size_t curEnd = 0;\r
 \r
-       //SysDebug("sbrk: (increment=%i)\n", increment);\r
+       //_SysDebug("sbrk: (increment=%i)\n", increment);\r
 \r
        if (oldEnd == 0)        curEnd = oldEnd = brk(0);\r
 \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,33 +320,46 @@ 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(int delta)\r
+LOCAL uint brk(Uint newpos)\r
 {\r
        static uint     curpos;\r
        uint    pages;\r
        uint    ret = curpos;\r
+        int    delta;\r
+       \r
+       //_SysDebug("brk: (newpos=0x%x)", newpos);\r
        \r
        // Find initial position\r
        if(curpos == 0) curpos = (uint)FindHeapBase();\r
        \r
        // Get Current Position\r
-       if(delta == 0)\r
-       {\r
-               return curpos;\r
-       }\r
+       if(newpos == 0) return curpos;\r
+       \r
+       if(newpos < curpos)     return newpos;\r
+       \r
+       delta = newpos - curpos;\r
+       //_SysDebug(" brk: delta = 0x%x", delta);\r
        \r
        // Do we need to add pages\r
        if(curpos & 0xFFF && (curpos & 0xFFF) + delta < 0x1000)\r

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