123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- /*
- * Copyright (c) 2006-2018, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2019-10-28 Jesven first version
- */
- #include <rtthread.h>
- #ifdef ARCH_MM_MMU
- #include <lwp_mm_area.h>
- int lwp_map_area_insert(struct lwp_avl_struct **avl_tree, size_t addr, size_t size, int ma_type)
- {
- struct lwp_avl_struct *node = RT_NULL;
- struct rt_mm_area_struct *ma = RT_NULL;
- if (!size)
- {
- return -1;
- }
- ma = (struct rt_mm_area_struct *)rt_malloc(sizeof(struct rt_mm_area_struct));
- if (!ma)
- {
- return -1;
- }
- ma->addr = addr;
- ma->size = size;
- ma->type = ma_type;
- node = (struct lwp_avl_struct *)rt_malloc(sizeof(struct lwp_avl_struct));
- if (!node)
- {
- rt_free(ma);
- return -1;
- }
- memset(node, 0, sizeof(struct lwp_avl_struct));
- node->avl_key = ma->addr;
- node->data = (void *)ma;
- lwp_avl_insert(node, avl_tree);
- return 0;
- }
- void lwp_map_area_remove(struct lwp_avl_struct **avl_tree, size_t addr)
- {
- struct lwp_avl_struct *node = RT_NULL;
- node = lwp_avl_find(addr, *avl_tree);
- if (!node)
- {
- return;
- }
- lwp_avl_remove(node, avl_tree);
- rt_free(node->data);
- rt_free(node);
- }
- struct lwp_avl_struct* lwp_map_find(struct lwp_avl_struct* ptree, size_t addr)
- {
- struct lwp_avl_struct *node = ptree;
- while (1)
- {
- if (!node)
- {
- return node;
- }
- if ((size_t)node->avl_key <= addr)
- {
- struct rt_mm_area_struct *ma = (struct rt_mm_area_struct *)node->data;
- if ((ma->addr <= addr) && (addr < ma->addr + ma->size))
- {
- /* find area */
- break;
- }
- node = node->avl_right;
- }
- else
- {
- node = node->avl_left;
- }
- }
- return node;
- }
- struct lwp_avl_struct* lwp_map_find_first(struct lwp_avl_struct* ptree)
- {
- if (ptree == AVL_EMPTY)
- {
- return (struct lwp_avl_struct *)0;
- }
- while (1)
- {
- if (!ptree->avl_left)
- {
- break;
- }
- ptree = ptree->avl_left;
- }
- return ptree;
- }
- int top_mem_fun(struct lwp_avl_struct* ptree, void *arg)
- {
- size_t *vs = (size_t *)arg;
- struct rt_mm_area_struct *ma;
- ma = (struct rt_mm_area_struct *)ptree->data;
- *vs += ma->size;
- return 0;
- }
- size_t lwp_vmem_count(struct lwp_avl_struct *ptree)
- {
- size_t vsize = 0;
- lwp_avl_traversal(ptree, top_mem_fun, &vsize);
- return vsize;
- }
- #endif
|