Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:22:58

0001 /*
0002  * Copyright (c) 2015-2016, Freescale Semiconductor, Inc.
0003  * Copyright 2016-2021 NXP
0004  * All rights reserved.
0005  *
0006  * SPDX-License-Identifier: BSD-3-Clause
0007  */
0008 
0009 #include "fsl_common.h"
0010 
0011 #define SDK_MEM_MAGIC_NUMBER 12345U
0012 
0013 typedef struct _mem_align_control_block
0014 {
0015     uint16_t identifier; /*!< Identifier for the memory control block. */
0016     uint16_t offset;     /*!< offset from aligned address to real address */
0017 } mem_align_cb_t;
0018 
0019 /* Component ID definition, used by tools. */
0020 #ifndef FSL_COMPONENT_ID
0021 #define FSL_COMPONENT_ID "platform.drivers.common"
0022 #endif
0023 
0024 #if !((defined(__DSC__) && defined(__CW__)))
0025 void *SDK_Malloc(size_t size, size_t alignbytes)
0026 {
0027     mem_align_cb_t *p_cb = NULL;
0028     uint32_t alignedsize;
0029 
0030     /* Check overflow. */
0031     alignedsize = (uint32_t)(unsigned int)SDK_SIZEALIGN(size, alignbytes);
0032     if (alignedsize < size)
0033     {
0034         return NULL;
0035     }
0036 
0037     if (alignedsize > SIZE_MAX - alignbytes - sizeof(mem_align_cb_t))
0038     {
0039         return NULL;
0040     }
0041 
0042     alignedsize += alignbytes + (uint32_t)sizeof(mem_align_cb_t);
0043 
0044     union
0045     {
0046         void *pointer_value;
0047         uintptr_t unsigned_value;
0048     } p_align_addr, p_addr;
0049 
0050     p_addr.pointer_value = malloc((size_t)alignedsize);
0051 
0052     if (p_addr.pointer_value == NULL)
0053     {
0054         return NULL;
0055     }
0056 
0057     p_align_addr.unsigned_value = SDK_SIZEALIGN(p_addr.unsigned_value + sizeof(mem_align_cb_t), alignbytes);
0058 
0059     p_cb             = (mem_align_cb_t *)(p_align_addr.unsigned_value - 4U);
0060     p_cb->identifier = SDK_MEM_MAGIC_NUMBER;
0061     p_cb->offset     = (uint16_t)(p_align_addr.unsigned_value - p_addr.unsigned_value);
0062 
0063     return p_align_addr.pointer_value;
0064 }
0065 
0066 void SDK_Free(void *ptr)
0067 {
0068     union
0069     {
0070         void *pointer_value;
0071         uintptr_t unsigned_value;
0072     } p_free;
0073 
0074     p_free.pointer_value = ptr;
0075     mem_align_cb_t *p_cb = (mem_align_cb_t *)(p_free.unsigned_value - 4U);
0076 
0077     if (p_cb->identifier != SDK_MEM_MAGIC_NUMBER)
0078     {
0079         return;
0080     }
0081 
0082     p_free.unsigned_value = p_free.unsigned_value - p_cb->offset;
0083 
0084     free(p_free.pointer_value);
0085 }
0086 #endif