1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2023-03-23     WangXiaoyao  Complete testcase for internal APIs
9  */
10 #ifndef __TEST_ASPACE_API_INTERNAL_H__
11 #define __TEST_ASPACE_API_INTERNAL_H__
12 
13 #include "common.h"
14 #include "mmu.h"
15 #include "test_bst_adpt.h"
16 #include <stddef.h>
17 
18 /**
19  * @brief 3 cases for find free:
20  * with prefer & MAP_FIXED
21  * with prefer
22  * without prefer
23  *
24  * the requirement of find free:
25  * it will return a subset in address space that is free
26  * the subset contains `length` contiguous elements
27  * the alignment is satisfied
28  */
test_find_free(void)29 static void test_find_free(void)
30 {
31     void *top_page = rt_kernel_space.start + rt_kernel_space.size - 0x1000;
32     void *vaddr = top_page;
33 
34     CONSIST_HEAP({
35         /* type 1, on success */
36         uassert_true(!rt_aspace_map(&rt_kernel_space, &vaddr, 0x1000, MMU_MAP_K_RWCB, MMF_MAP_FIXED, &rt_mm_dummy_mapper, 0));
37         uassert_true(vaddr == top_page);
38         /* type 1, on failure */
39         // uassert_true(rt_aspace_map(&rt_kernel_space, &vaddr, 0x1000, MMU_MAP_K_RWCB, MMF_MAP_FIXED, &rt_mm_dummy_mapper, 0));
40         // uassert_true(!vaddr);
41 
42         /* type 2, on success */
43         vaddr = top_page;
44         uassert_true(!rt_aspace_map(&rt_kernel_space, &vaddr, 0x1000, MMU_MAP_K_RWCB, 0, &rt_mm_dummy_mapper, 0));
45         uassert_true(vaddr < top_page);
46         uassert_true(!!vaddr);
47         rt_aspace_unmap(&rt_kernel_space, vaddr);
48         /* type 2, on failure */
49         vaddr = rt_kernel_space.start;
50         uassert_true(-RT_ENOSPC == rt_aspace_map(&rt_kernel_space, &vaddr, rt_kernel_space.size - 0x08000000, MMU_MAP_K_RWCB, 0, &rt_mm_dummy_mapper, 0));
51         uassert_true(!vaddr);
52 
53         /* type 3, on success is covered by ioremap */
54         /* type 3, on failure */
55         size_t map_size = ARCH_PAGE_SIZE;
56         while (1)
57         {
58             void *va = rt_ioremap(0, map_size);
59             if (va)
60             {
61                 uassert_true(1);
62                 rt_iounmap(va);
63                 map_size <<= 1;
64             }
65             else
66             {
67                 uassert_true(1);
68                 break;
69             }
70         }
71 
72         /* free top page */
73         rt_aspace_unmap(&rt_kernel_space, top_page);
74     });
75 
76     /* test mm_private.h */
77     CONSIST_HEAP(test_bst_adpt());
78 }
79 
80 #endif /* __TEST_ASPACE_API_INTERNAL_H__ */
81