lwp_mm_area.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-10-28 Jesven first version
  9. */
  10. #include <rtthread.h>
  11. #ifdef ARCH_MM_MMU
  12. #include <lwp_mm_area.h>
  13. int lwp_map_area_insert(struct lwp_avl_struct **avl_tree, size_t addr, size_t size, int ma_type)
  14. {
  15. struct lwp_avl_struct *node = RT_NULL;
  16. struct rt_mm_area_struct *ma = RT_NULL;
  17. if (!size)
  18. {
  19. return -1;
  20. }
  21. ma = (struct rt_mm_area_struct *)rt_malloc(sizeof(struct rt_mm_area_struct));
  22. if (!ma)
  23. {
  24. return -1;
  25. }
  26. ma->addr = addr;
  27. ma->size = size;
  28. ma->type = ma_type;
  29. node = (struct lwp_avl_struct *)rt_malloc(sizeof(struct lwp_avl_struct));
  30. if (!node)
  31. {
  32. rt_free(ma);
  33. return -1;
  34. }
  35. memset(node, 0, sizeof(struct lwp_avl_struct));
  36. node->avl_key = ma->addr;
  37. node->data = (void *)ma;
  38. lwp_avl_insert(node, avl_tree);
  39. return 0;
  40. }
  41. void lwp_map_area_remove(struct lwp_avl_struct **avl_tree, size_t addr)
  42. {
  43. struct lwp_avl_struct *node = RT_NULL;
  44. node = lwp_avl_find(addr, *avl_tree);
  45. if (!node)
  46. {
  47. return;
  48. }
  49. lwp_avl_remove(node, avl_tree);
  50. rt_free(node->data);
  51. rt_free(node);
  52. }
  53. struct lwp_avl_struct* lwp_map_find(struct lwp_avl_struct* ptree, size_t addr)
  54. {
  55. struct lwp_avl_struct *node = ptree;
  56. while (1)
  57. {
  58. if (!node)
  59. {
  60. return node;
  61. }
  62. if ((size_t)node->avl_key <= addr)
  63. {
  64. struct rt_mm_area_struct *ma = (struct rt_mm_area_struct *)node->data;
  65. if ((ma->addr <= addr) && (addr < ma->addr + ma->size))
  66. {
  67. /* find area */
  68. break;
  69. }
  70. node = node->avl_right;
  71. }
  72. else
  73. {
  74. node = node->avl_left;
  75. }
  76. }
  77. return node;
  78. }
  79. struct lwp_avl_struct* lwp_map_find_first(struct lwp_avl_struct* ptree)
  80. {
  81. if (ptree == AVL_EMPTY)
  82. {
  83. return (struct lwp_avl_struct *)0;
  84. }
  85. while (1)
  86. {
  87. if (!ptree->avl_left)
  88. {
  89. break;
  90. }
  91. ptree = ptree->avl_left;
  92. }
  93. return ptree;
  94. }
  95. int top_mem_fun(struct lwp_avl_struct* ptree, void *arg)
  96. {
  97. size_t *vs = (size_t *)arg;
  98. struct rt_mm_area_struct *ma;
  99. ma = (struct rt_mm_area_struct *)ptree->data;
  100. *vs += ma->size;
  101. return 0;
  102. }
  103. size_t lwp_vmem_count(struct lwp_avl_struct *ptree)
  104. {
  105. size_t vsize = 0;
  106. lwp_avl_traversal(ptree, top_mem_fun, &vsize);
  107. return vsize;
  108. }
  109. #endif