fsl_common.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. #include "fsl_common.h"
  9. #define SDK_MEM_MAGIC_NUMBER 12345U
  10. typedef struct _mem_align_control_block
  11. {
  12. uint16_t identifier; /*!< Identifier for the memory control block. */
  13. uint16_t offset; /*!< offset from aligned address to real address */
  14. } mem_align_cb_t;
  15. /* Component ID definition, used by tools. */
  16. #ifndef FSL_COMPONENT_ID
  17. #define FSL_COMPONENT_ID "platform.drivers.common"
  18. #endif
  19. void *SDK_Malloc(size_t size, size_t alignbytes)
  20. {
  21. mem_align_cb_t *p_cb = NULL;
  22. uint32_t alignedsize;
  23. /* Check overflow. */
  24. alignedsize = SDK_SIZEALIGN(size, alignbytes);
  25. if (alignedsize < size)
  26. {
  27. return NULL;
  28. }
  29. if (alignedsize > SIZE_MAX - alignbytes - sizeof(mem_align_cb_t))
  30. {
  31. return NULL;
  32. }
  33. alignedsize += alignbytes + sizeof(mem_align_cb_t);
  34. union
  35. {
  36. void *pointer_value;
  37. #if (defined(__DSC__) && defined(__CW__))
  38. uint32_t unsigned_value;
  39. #else
  40. uintptr_t unsigned_value;
  41. #endif
  42. } p_align_addr, p_addr;
  43. p_addr.pointer_value = malloc(alignedsize);
  44. if (p_addr.pointer_value == NULL)
  45. {
  46. return NULL;
  47. }
  48. p_align_addr.unsigned_value = SDK_SIZEALIGN(p_addr.unsigned_value + sizeof(mem_align_cb_t), alignbytes);
  49. p_cb = (mem_align_cb_t *)(p_align_addr.unsigned_value - 4U);
  50. p_cb->identifier = SDK_MEM_MAGIC_NUMBER;
  51. p_cb->offset = (uint16_t)(p_align_addr.unsigned_value - p_addr.unsigned_value);
  52. return p_align_addr.pointer_value;
  53. }
  54. void SDK_Free(void *ptr)
  55. {
  56. union
  57. {
  58. void *pointer_value;
  59. #if (defined(__DSC__) && defined(__CW__))
  60. uint32_t unsigned_value;
  61. #else
  62. uintptr_t unsigned_value;
  63. #endif
  64. } p_free;
  65. p_free.pointer_value = ptr;
  66. mem_align_cb_t *p_cb = (mem_align_cb_t *)(p_free.unsigned_value - 4U);
  67. if (p_cb->identifier != SDK_MEM_MAGIC_NUMBER)
  68. {
  69. return;
  70. }
  71. p_free.unsigned_value = p_free.unsigned_value - p_cb->offset;
  72. free(p_free.pointer_value);
  73. }