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
13typedef 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
24void *SDK_Malloc(size_t size, size_t alignbytes)
25{
26 mem_align_cb_t *p_cb = NULL;
27 uint32_t alignedsize;
28
29 /* Check overflow. */
30 alignedsize = SDK_SIZEALIGN(size, alignbytes);
31 if (alignedsize < size)
32 {
33 return NULL;
34 }
35
36 if (alignedsize > SIZE_MAX - alignbytes - sizeof(mem_align_cb_t))
37 {
38 return NULL;
39 }
40
41 alignedsize += alignbytes + sizeof(mem_align_cb_t);
42
43 union
44 {
45 void *pointer_value;
46#if (defined(__DSC__) && defined(__CW__))
47 uint32_t unsigned_value;
48#else
49 uintptr_t unsigned_value;
50#endif
51 } p_align_addr, p_addr;
52
53 p_addr.pointer_value = malloc(alignedsize);
54
55 if (p_addr.pointer_value == NULL)
56 {
57 return NULL;
58 }
59
60 p_align_addr.unsigned_value = SDK_SIZEALIGN(p_addr.unsigned_value + sizeof(mem_align_cb_t), alignbytes);
61
62 p_cb = (mem_align_cb_t *)(p_align_addr.unsigned_value - 4U);
63 p_cb->identifier = SDK_MEM_MAGIC_NUMBER;
64 p_cb->offset = (uint16_t)(p_align_addr.unsigned_value - p_addr.unsigned_value);
65
66 return p_align_addr.pointer_value;
67}
68
69void SDK_Free(void *ptr)
70{
71 union
72 {
73 void *pointer_value;
74#if (defined(__DSC__) && defined(__CW__))
75 uint32_t unsigned_value;
76#else
77 uintptr_t unsigned_value;
78#endif
79 } p_free;
80 p_free.pointer_value = ptr;
81 mem_align_cb_t *p_cb = (mem_align_cb_t *)(p_free.unsigned_value - 4U);
82
83 if (p_cb->identifier != SDK_MEM_MAGIC_NUMBER)
84 {
85 return;
86 }
87
88 p_free.unsigned_value = p_free.unsigned_value - p_cb->offset;
89
90 free(p_free.pointer_value);
91}
92