/*
 * =====================================================================================
 *
 *       Filename:  secMemoryManager.c
 *
 *    Description:  Internal memory manager
 *
 *        Version:  1.0
 *        Created:  03/27/2017 05:23:02 PM
 *       Compiler:  armcc
 *
 *         Author:  Dongwook Shim (), dw.shim@samsung.com
 *        Company:  Samsung Electronics
 *
 *        Copyright (c) 2017 by Samsung Electronics, All rights reserved. 
 *
 * =====================================================================================
 */

#include "commonConfig.h"
#include "log.h"

#if (defined USE_SCRYPTO)
#include <openssl/crypto.h>

int secMemoryManagerInit(void)
{
	return NOT_ERROR;
}

void *secMemoryManagerMalloc(size_t size)
{
	return OPENSSL_malloc(size);
}

void secMemoryManagerFree(void *ptr)
{
	OPENSSL_free(ptr);
}

void *secMemoryManagerRealloc(void *ptr, size_t size)
{
	return OPENSSL_realloc(ptr, size);
}
#elif (defined USE_QSEE)
#include "qsee_heap.h"

int secMemoryManagerInit(void)
{
	return NOT_ERROR;
}

void *secMemoryManagerMalloc(size_t size)
{
	return qsee_malloc(size);
}

void secMemoryManagerFree(void *ptr)
{
	qsee_free(ptr);
}

void *secMemoryManagerRealloc(void *ptr, size_t size)
{
	return qsee_realloc(ptr, size);
}

#elif (defined USE_BLOWFISH)
#include <tee_internal_api.h>

int secMemoryManagerInit(void)
{
	return NOT_ERROR;
}

void *secMemoryManagerMalloc(size_t size)
{
	return TEE_Malloc( size, 0 );
}

void secMemoryManagerFree(void *ptr)
{
	return TEE_Free(ptr);
}

void *secMemoryManagerRealloc(void *ptr, size_t size)
{
	return TEE_Realloc(ptr, size);
}
#else
#include "memmgrs.h"

#define MAX_HEAP_MEMORY 0x30000

static uint8_t heap[MAX_HEAP_MEMORY] __attribute__ ((aligned (MALLOC_ALIGN)));

int secMemoryManagerInit(void)
{
	int32_t res = memmngr_init(heap, MAX_HEAP_MEMORY);
	
	if (!res)
	{
		LOGE("Failed to initialize memory manager.");
		return ERR_TA_NOT_ENOUGH_MEMORY;
	}
	
	return NOT_ERROR;
}

void *secMemoryManagerMalloc(size_t size)
{
	return mem_alloc(size);
}

void secMemoryManagerFree(void *ptr)
{
	mem_free(ptr);
}

void *secMemoryManagerRealloc(void *ptr, size_t size)
{
	return mem_realloc(ptr, size);
}
#endif
