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
void
*
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
69
void
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