mm_api_tc.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. * 2022-12-14 WangXiaoyao the first version
  9. * 2023-03-20 WangXiaoyao Format & add more testcases for API under mm_aspace.h
  10. */
  11. #include "common.h"
  12. /**
  13. * @brief Testing all APIs under components/mm
  14. */
  15. void ioremap_tc(void);
  16. void flag_tc(void);
  17. #ifdef STANDALONE_TC
  18. #define TC_ASSERT(expr) \
  19. ((expr) \
  20. ? 0 \
  21. : rt_kprintf("AssertFault(%d): %s\n", __LINE__, RT_STRINGIFY(expr)))
  22. #else
  23. #define TC_ASSERT(expr) uassert_true(expr)
  24. #endif
  25. static rt_err_t utest_tc_init(void)
  26. {
  27. return RT_EOK;
  28. }
  29. static rt_err_t utest_tc_cleanup(void)
  30. {
  31. return RT_EOK;
  32. }
  33. #include "test_aspace_api.h"
  34. static void testcase(void)
  35. {
  36. UTEST_UNIT_RUN(aspace_tc);
  37. UTEST_UNIT_RUN(ioremap_tc);
  38. UTEST_UNIT_RUN(flag_tc);
  39. }
  40. UTEST_TC_EXPORT(testcase, "testcases.mm.api_tc", utest_tc_init, utest_tc_cleanup, 20);
  41. void ioremap_tc(void)
  42. {
  43. const size_t bufsz = 0x1000;
  44. void *paddr = (void *)rt_pages_alloc(rt_page_bits(bufsz)) + PV_OFFSET;
  45. int *vaddr;
  46. vaddr = rt_ioremap_cached(paddr, bufsz);
  47. if (vaddr)
  48. {
  49. TC_ASSERT(*vaddr == *(int *)(paddr - PV_OFFSET));
  50. rt_iounmap(vaddr);
  51. rt_pages_free(paddr - PV_OFFSET, 0);
  52. }
  53. }
  54. void flag_tc(void)
  55. {
  56. size_t flags;
  57. flags = MMF_CREATE(MMF_MAP_FIXED, 0x4000);
  58. TC_ASSERT(MMF_GET_CNTL(flags) == (MMF_MAP_FIXED | MMF_REQUEST_ALIGN));
  59. TC_ASSERT((1 << MMF_GET_ALIGN(flags)) == 0x4000);
  60. flags = MMF_CREATE(MMF_MAP_FIXED, 0);
  61. TC_ASSERT(MMF_GET_CNTL(flags) == MMF_MAP_FIXED);
  62. TC_ASSERT(MMF_GET_ALIGN(flags) == 0);
  63. }
  64. #if 0
  65. #define BUF_SIZE (4ul << 20)
  66. static char ALIGN(BUF_SIZE) buf[BUF_SIZE];
  67. void buddy_tc(void)
  68. {
  69. size_t total, free;
  70. rt_page_get_info(&total, &free);
  71. rt_region_t region = {
  72. .start = (size_t)buf,
  73. .end = (size_t)buf + BUF_SIZE,
  74. };
  75. size_t new_total, new_free;
  76. rt_page_install(region);
  77. rt_page_get_info(&new_total, &new_free);
  78. TC_ASSERT(new_total - total == (BUF_SIZE >> ARCH_PAGE_SHIFT));
  79. TC_ASSERT(new_free > free);
  80. }
  81. void mmu_page_tc()
  82. {
  83. mm_aspace_t aspace = ASPACE_NEW();
  84. size_t total, free;
  85. rt_page_get_info(&total, &free);
  86. rt_hw_mmu_map(aspace, (void *)0x3fffffffff, 0, ARCH_PAGE_SIZE,
  87. MMU_MAP_K_RWCB);
  88. rt_hw_mmu_unmap(aspace, (void *)0x3fffffffff, ARCH_PAGE_SIZE);
  89. size_t new_total, new_free;
  90. rt_page_get_info(&new_total, &new_free);
  91. TC_ASSERT(new_free == free);
  92. mm_aspace_delete(aspace);
  93. }
  94. #endif