[Feature][T106]ZXW P56U09 code

Only Configure: Yes
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: No
Doc Update: No

Change-Id: I3cbd8b420271eb20c2b40ebe5c78f83059cd42f3
diff --git a/boot/common/src/uboot/lib/memory.c b/boot/common/src/uboot/lib/memory.c
new file mode 100755
index 0000000..3739b62
--- /dev/null
+++ b/boot/common/src/uboot/lib/memory.c
@@ -0,0 +1,169 @@
+#include <malloc.h>

+#include <common.h>

+#include <config.h>

+

+#define MARK 					(0xCD)

+#define INICONTENT				(0x0)

+#define MARK_SIZE       		(4)

+

+#define ALIGN_SIZE      		(sizeof(Align))

+#define REVALUEUPALIGN(val)     ((val) ? (((val) - 1) / ALIGN_SIZE + 1) : 0)

+#define HEADER_ALIGN_SIZE       (REVALUEUPALIGN(sizeof(HeaderStruct)))

+

+typedef union Header_tag Header;

+

+static Header *g_Header = NULL;

+

+typedef union

+{

+    long        l_dummy;

+    double      d_dummy;

+    void       *p_dummy;

+} Align;

+

+typedef struct

+{

+    int         	size;

+    char           *filename;

+    int         	line;

+    Header         *prev;

+    Header         *next;

+    unsigned char   mark[MARK_SIZE];

+} HeaderStruct;

+

+union Header_tag

+{

+    HeaderStruct	s;

+    Align           u[HEADER_ALIGN_SIZE];

+};

+

+static void chain_block(Header *header)

+{

+    if (g_Header)

+    {

+        g_Header->s.prev = header;

+    }

+    

+    header->s.prev = NULL;

+    header->s.next = g_Header;

+    g_Header = header;

+}

+

+static void unchain_block(Header *header)

+{

+    if (header->s.prev)

+    {

+        header->s.prev->s.next = header->s.next;

+    }

+    else

+    {

+        g_Header = header->s.next;

+    }

+    

+    if (header->s.next)

+    {

+        header->s.next->s.prev = header->s.prev;

+    }

+}

+

+static void set_header(Header *header, int size, char *filename, int line)

+{

+    header->s.size = size;

+    header->s.filename = filename;

+    header->s.line = line;

+    header->s.prev = NULL;

+    header->s.next = NULL;

+    

+    memset(header->s.mark, MARK, (char*)&header[1] - (char*)header->s.mark);

+}

+

+static void set_tail(void *ptr, int alloc_size)

+{

+    char *tail;

+    

+    tail = ((char*)ptr) + alloc_size - MARK_SIZE;

+    memset(tail, MARK, MARK_SIZE);

+}

+

+static int check_mark_sub(unsigned char *mark, int size)

+{

+    int i;

+

+    for (i = 0; i < size; i++)

+    {

+        if (mark[i] != MARK) {

+            return -1;

+        }

+    }

+

+    return 0;

+}

+

+static int check_mark(Header *header)

+{

+    unsigned char  *tail;

+    

+    if (check_mark_sub(header->s.mark, (char*)&header[1] - (char*)header->s.mark))

+    {

+    	printf("bad mark at header allocated in %s:%d\n", header->s.filename, header->s.line);

+    	return -1;

+    }

+    

+    tail = ((unsigned char*)header) + header->s.size + sizeof(Header);

+    

+    if (check_mark_sub(tail, MARK_SIZE))

+    {

+    	printf("bad mark at tail allocated in %s:%d\n", header->s.filename, header->s.line);

+    	return -2;

+    }

+

+    return 0;

+}

+

+void* MEM_malloc(char *filename, int line, size_t size)

+{

+    void        *ptr;

+    size_t      alloc_size;

+

+#if DEBUG

+    alloc_size = size + sizeof(Header) + MARK_SIZE;

+#else

+    alloc_size = size;

+#endif /* DEBUG */

+

+    ptr = malloc(alloc_size);

+    if (ptr == NULL)

+    {

+        return NULL;

+    }

+

+#if DEBUG

+    memset(ptr, INICONTENT, alloc_size);

+    set_header(ptr, size, filename, line);

+    set_tail(ptr, alloc_size);

+    chain_block((Header*)ptr);

+    ptr = (char*)ptr + sizeof(Header);

+#endif /* DEBUG */

+

+    return ptr;

+}

+

+void MEM_free(void *ptr)

+{

+    void        *real_ptr;

+

+    if (ptr == NULL)

+        return;

+

+#if DEBUG

+    real_ptr = (char*)ptr - sizeof(Header);

+    check_mark((Header*)real_ptr);

+    unchain_block(real_ptr);

+#else

+    real_ptr = ptr;

+#endif /* DEBUG */

+

+    free(real_ptr);

+}

+

+