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)25 void *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)66 void 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