*/\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
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
*/\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
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