*/\r
#include <acess/sys.h>\r
#include <stdlib.h>\r
+#include <string.h>\r
#include "lib.h"\r
\r
// === Constants ===\r
\r
typedef unsigned int Uint;\r
\r
-//Typedefs\r
+// === TYPES ===\r
typedef struct {\r
Uint magic;\r
Uint size;\r
Uint magic;\r
} heap_foot;\r
\r
-//Globals\r
-void *_heap_start = NULL;\r
-void *_heap_end = NULL;\r
+// === LOCAL VARIABLES ===\r
+static void *_heap_start = NULL;\r
+static void *_heap_end = NULL;\r
\r
-//Prototypes\r
-EXPORT void *malloc(Uint bytes);\r
+// === PROTOTYPES ===\r
+EXPORT void *malloc(size_t bytes);\r
+EXPORT void *calloc(size_t bytes, size_t count);\r
EXPORT void free(void *mem);\r
EXPORT void *realloc(void *mem, Uint bytes);\r
EXPORT void *sbrk(int increment);\r
\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
return (void*)(bestMatchAddr+sizeof(heap_head));\r
}\r
\r
+/**\r
+ * \fn EXPORT void *calloc(size_t bytes, size_t count)\r
+ * \brief Allocate and zero a block of memory\r
+ * \param __nmemb Number of memeber elements\r
+ * \param __size Size of one element\r
+ */\r
+EXPORT void *calloc(size_t __nmemb, size_t __size)\r
+{\r
+ void *ret = malloc(__size*__nmemb);\r
+ if(!ret) return NULL;\r
+ memset(ret, 0, __size*__nmemb);\r
+ return ret;\r
+}\r
+\r
/**\r
\fn EXPORT void free(void *mem)\r
\brief Free previously allocated memory\r
*/\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
\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
*/\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