rt-thread/examples/utest/testcases/mm/test_bst_adpt.h
Shell eec78d9f5d
[rt-smart] testcase & improvements for memory management (#7099)
* [utest/mm] add testcase for create/init
format codes of create/init in components/mm

* [libcpu/aarch64] fix user stack check routine

* [kservice] export API for utest

* [utest/mm] testcase for aspace_map
format & modify the files under components/mm related with aspace_map

* [lwp/user_mm] add user_map_varea for mmap feature

* [mm] rename rt_mm_fault_try_fix to rt_aspace_fault_try_fix

* [utest/mm] testcase for synchronization

* [mm] modify unmap api to improve throughput

* [utest/mm] testcases for cache and varea map

* [format] remove extra space

* [utest/mm] fix testcase problem in header

* [lwp] extend map_user_varea with a flag

* [utest/mm] testcase for lwp_map_user_varea

* [libcpu/arm/cortex-a] fix kernel space layout

* [utest/mm] adjust for armv7 arch
2023-03-30 08:25:15 +08:00

108 lines
3.1 KiB
C

/*
* Copyright (c) 2006-2023, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-03-23 WangXiaoyao Complete testcase for internal APIs
*/
#ifndef __TEST_BST_ADPT_H__
#define __TEST_BST_ADPT_H__
#include "common.h"
#include "lwp_arch.h"
#ifdef RT_USING_SMART
#include "lwp_user_mm.h"
#include "mm_aspace.h"
#include "mm_flag.h"
#include <mm_private.h>
#include <lwp_pid.h>
void test_bst_adpt(void)
{
size_t flags = MMF_MAP_FIXED;
void *target_va = (void *)USER_VADDR_START + 0x3000;
size_t map_size = 0x1000;
void *prev_va = target_va - map_size;
void *next_va = target_va + map_size + 1;
struct rt_lwp *lwp;
rt_aspace_t aspace;
rt_mem_obj_t mem_obj;
/* create aspace by lwp */
lwp = lwp_new();
uassert_true(!!lwp);
uassert_true(!lwp_user_space_init(lwp, 0));
aspace = lwp->aspace;
mem_obj = &lwp->lwp_obj->mem_obj;
uassert_true(!!aspace);
uassert_true(!!mem_obj);
/* _aspace_bst_search not cover */
uassert_true(!_aspace_bst_search(aspace, target_va)); // ret == NULL
uassert_true(
!rt_aspace_map(aspace, &target_va, map_size, MMU_MAP_K_RWCB, flags, mem_obj, 0));
/* 2 wrappers */
uassert_true(
!rt_aspace_map(aspace, &prev_va, map_size - 1, MMU_MAP_K_RWCB, flags, mem_obj, 0));
uassert_true(
!rt_aspace_map(aspace, &next_va, map_size - 1, MMU_MAP_K_RWCB, flags, mem_obj, 0));
/* _aspace_bst_search */
uassert_true(!!_aspace_bst_search(aspace, target_va));
uassert_true(!_aspace_bst_search(aspace, target_va + map_size));
uassert_true(!_aspace_bst_search(aspace, target_va - 1));
/**
* @brief _aspace_bst_search_exceed
* for given map [start, end]
*/
rt_varea_t find;
find = _aspace_bst_search_exceed(aspace, target_va);
uassert_true(!!find);
uassert_true(find->start == target_va);
rt_varea_t last = ASPACE_VAREA_LAST(aspace);
find = _aspace_bst_search_exceed(aspace, last->start + 1);
uassert_true(!find);
/**
* @brief _aspace_bst_search_overlap
* for given map [start, end], five types of overlapping
*/
/* 1. all below */
struct _mm_range range = {.start = prev_va - 2, .end = prev_va - 1};
find = _aspace_bst_search_overlap(aspace, range);
uassert_true(!find);
/* 2. start below */
range.end = prev_va;
find = _aspace_bst_search_overlap(aspace, range);
uassert_true(!!find);
uassert_true(find->start == prev_va);
/* 3. all wrapped */
range.start = prev_va;
range.end = prev_va + 1;
find = _aspace_bst_search_overlap(aspace, range);
uassert_true(!!find);
uassert_true(find->start == prev_va);
/* 4. end exceed */
range.start = next_va;
range.end = next_va + map_size + 1;
find = _aspace_bst_search_overlap(aspace, range);
uassert_true(!!find);
uassert_true(find->start == next_va);
/* 5. all exceed */
range.start = next_va + map_size;
find = _aspace_bst_search_overlap(aspace, range);
uassert_true(!find);
lwp_ref_dec(lwp);
}
#endif /* RT_USING_SMART */
#endif /* __TEST_BST_ADPT_H__ */