lwp_mmap_map_fixed.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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-08-17 Shell test case for aspace_map(MAP_FIXED)
  9. */
  10. #include "common.h"
  11. #include "lwp_user_mm.h"
  12. #include "utest_assert.h"
  13. #include <mm_aspace.h>
  14. #include <rtthread.h>
  15. static struct rt_lwp *lwp;
  16. static size_t former_vsz;
  17. static size_t former_vcount;
  18. static void *vaddr = (void *)0x100000000;
  19. static size_t ex_size = 0x5000;
  20. static char *override_start;
  21. static size_t override_size = 0x2000;
  22. static long fd = -1;
  23. static long pgoffset = 0;
  24. static size_t ex_prot = PROT_NONE;
  25. static size_t ex_flags = MAP_PRIVATE | MAP_ANONYMOUS;
  26. static size_t override_prot = PROT_READ | PROT_WRITE;
  27. static size_t override_flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED;
  28. static int _count_vsz(rt_varea_t varea, void *arg)
  29. {
  30. rt_base_t *pvsz = arg;
  31. *pvsz += 1;
  32. return 0;
  33. }
  34. static rt_base_t count_vcount(rt_aspace_t aspace)
  35. {
  36. rt_base_t vcount = 0;
  37. rt_aspace_traversal(aspace, _count_vsz, &vcount);
  38. return vcount;
  39. }
  40. static char put_data[] = "hello,world";
  41. static void test_map_fixed(void)
  42. {
  43. void *effect_override;
  44. former_vsz = rt_aspace_count_vsz(lwp->aspace);
  45. former_vcount = count_vcount(lwp->aspace);
  46. /* create an existed mapping */
  47. vaddr = lwp_mmap2(lwp, vaddr, ex_size, ex_prot, ex_flags, fd, pgoffset);
  48. uassert_true((long)vaddr > 0);
  49. utest_int_equal(former_vsz + ex_size, rt_aspace_count_vsz(lwp->aspace));
  50. utest_int_equal(former_vcount + 1, count_vcount(lwp->aspace));
  51. former_vsz += ex_size;
  52. former_vcount += 1;
  53. /* fix private in the middle */
  54. override_start = (char *)vaddr + 0x1000;
  55. effect_override = lwp_mmap2(lwp, override_start, override_size, override_prot, override_flags, fd, pgoffset);
  56. uassert_true(effect_override == override_start);
  57. utest_int_equal(former_vsz, rt_aspace_count_vsz(lwp->aspace));
  58. utest_int_equal(former_vcount + 2, count_vcount(lwp->aspace));
  59. utest_int_equal(
  60. lwp_data_put(lwp, effect_override, put_data, sizeof(put_data)),
  61. sizeof(put_data)
  62. );
  63. utest_int_equal(RT_EOK, rt_aspace_unmap_range(lwp->aspace, vaddr, ex_size));
  64. }
  65. static void aspace_unmap_tc(void)
  66. {
  67. test_map_fixed();
  68. }
  69. static rt_size_t total, used, max_used;
  70. static rt_size_t totala, useda, max_useda;
  71. static rt_ubase_t level;
  72. static rt_err_t utest_tc_init(void)
  73. {
  74. lwp = lwp_create(0);
  75. if (lwp)
  76. lwp_user_space_init(lwp, 1);
  77. else
  78. return -RT_ENOMEM;
  79. /* stats */
  80. level = rt_heap_lock();
  81. rt_memory_info(&total, &used, &max_used);
  82. return RT_EOK;
  83. }
  84. static rt_err_t utest_tc_cleanup(void)
  85. {
  86. lwp_ref_dec(lwp);
  87. /* check */
  88. rt_memory_info(&totala, &useda, &max_useda);
  89. rt_heap_unlock(level);
  90. utest_int_equal(total, totala);
  91. utest_int_less_equal(useda, used);
  92. return RT_EOK;
  93. }
  94. static void testcase(void)
  95. {
  96. UTEST_UNIT_RUN(aspace_unmap_tc);
  97. }
  98. UTEST_TC_EXPORT(testcase, "testcases.lwp.mman.mmap_anon.fix_private", utest_tc_init, utest_tc_cleanup, 10);