1 /* 2 * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. 3 * Copyright 2016-2021 NXP 4 * All rights reserved. 5 * 6 * SPDX-License-Identifier: BSD-3-Clause 7 */ 8 9 #include "fsl_common.h" 10 11 #define SDK_MEM_MAGIC_NUMBER 12345U 12 13 typedef struct _mem_align_control_block 14 { 15 uint16_t identifier; /*!< Identifier for the memory control block. */ 16 uint16_t offset; /*!< offset from aligned address to real address */ 17 } mem_align_cb_t; 18 19 /* Component ID definition, used by tools. */ 20 #ifndef FSL_COMPONENT_ID 21 #define FSL_COMPONENT_ID "platform.drivers.common" 22 #endif 23 24 #if !((defined(__DSC__) && defined(__CW__))) SDK_Malloc(size_t size,size_t alignbytes)25void *SDK_Malloc(size_t size, size_t alignbytes) 26 { 27 mem_align_cb_t *p_cb = NULL; 28 uint32_t alignedsize; 29 30 /* Check overflow. */ 31 alignedsize = (uint32_t)(unsigned int)SDK_SIZEALIGN(size, alignbytes); 32 if (alignedsize < size) 33 { 34 return NULL; 35 } 36 37 if (alignedsize > SIZE_MAX - alignbytes - sizeof(mem_align_cb_t)) 38 { 39 return NULL; 40 } 41 42 alignedsize += alignbytes + (uint32_t)sizeof(mem_align_cb_t); 43 44 union 45 { 46 void *pointer_value; 47 uintptr_t unsigned_value; 48 } p_align_addr, p_addr; 49 50 p_addr.pointer_value = malloc((size_t)alignedsize); 51 52 if (p_addr.pointer_value == NULL) 53 { 54 return NULL; 55 } 56 57 p_align_addr.unsigned_value = SDK_SIZEALIGN(p_addr.unsigned_value + sizeof(mem_align_cb_t), alignbytes); 58 59 p_cb = (mem_align_cb_t *)(p_align_addr.unsigned_value - 4U); 60 p_cb->identifier = SDK_MEM_MAGIC_NUMBER; 61 p_cb->offset = (uint16_t)(p_align_addr.unsigned_value - p_addr.unsigned_value); 62 63 return p_align_addr.pointer_value; 64 } 65 SDK_Free(void * ptr)66void SDK_Free(void *ptr) 67 { 68 union 69 { 70 void *pointer_value; 71 uintptr_t unsigned_value; 72 } p_free; 73 74 p_free.pointer_value = ptr; 75 mem_align_cb_t *p_cb = (mem_align_cb_t *)(p_free.unsigned_value - 4U); 76 77 if (p_cb->identifier != SDK_MEM_MAGIC_NUMBER) 78 { 79 return; 80 } 81 82 p_free.unsigned_value = p_free.unsigned_value - p_cb->offset; 83 84 free(p_free.pointer_value); 85 } 86 #endif 87