aspace_unmap_range_invalid_param.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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_unmap_range
  9. */
  10. #include "common.h"
  11. #include "lwp_user_mm.h"
  12. #include <mm_aspace.h>
  13. #include <rtthread.h>
  14. static void *vaddr = (void *)0x100000000;
  15. static size_t existed_size = 0x5000;
  16. static char *unmap_start;
  17. static size_t unmap_size = 0x2000;
  18. static size_t former_vsz;
  19. static struct rt_lwp *lwp;
  20. static size_t flags = MMF_PREFETCH | MMF_MAP_FIXED;
  21. static void test_unmap_range_invalid_param(void)
  22. {
  23. rt_mem_obj_t notsupp_object;
  24. /* create an existed mapping */
  25. former_vsz = rt_aspace_count_vsz(lwp->aspace);
  26. uassert_true(!rt_aspace_map(lwp->aspace, &vaddr, existed_size, MMU_MAP_K_RWCB, flags, &rt_mm_dummy_mapper, 0));
  27. utest_int_equal(former_vsz + existed_size, rt_aspace_count_vsz(lwp->aspace));
  28. former_vsz += existed_size;
  29. /* test unaligned vaddr start */
  30. unmap_start = (char *)vaddr - 0x1234;
  31. utest_int_equal(-RT_EINVAL, rt_aspace_unmap_range(lwp->aspace, unmap_start, unmap_size));
  32. utest_int_equal(former_vsz, rt_aspace_count_vsz(lwp->aspace));
  33. /* test unaligned size */
  34. unmap_size = 0x2000;
  35. unmap_start = (char *)vaddr + existed_size - unmap_size;
  36. utest_int_equal(RT_EOK, rt_aspace_unmap_range(lwp->aspace, unmap_start, unmap_size - 0x123));
  37. utest_int_equal(former_vsz - unmap_size, rt_aspace_count_vsz(lwp->aspace));
  38. /* create another mapping binding to mem_obj without proper handler */
  39. notsupp_object = rt_mem_obj_create(&rt_mm_dummy_mapper);
  40. notsupp_object->on_varea_shrink = RT_NULL;
  41. utest_int_equal(
  42. RT_EOK,
  43. rt_aspace_map(lwp->aspace, (void *)&unmap_start, unmap_size, MMU_MAP_K_RWCB, flags, notsupp_object, 0)
  44. );
  45. utest_int_equal(-RT_EPERM, rt_aspace_unmap_range(lwp->aspace, unmap_start, 0x1000));
  46. utest_int_equal(RT_EOK, rt_aspace_unmap_range(lwp->aspace, vaddr, existed_size));
  47. rt_free(notsupp_object);
  48. }
  49. static void aspace_unmap_tc(void)
  50. {
  51. CONSIST_HEAP(test_unmap_range_invalid_param());
  52. }
  53. static rt_err_t utest_tc_init(void)
  54. {
  55. lwp = lwp_create(0);
  56. if (lwp)
  57. lwp_user_space_init(lwp, 1);
  58. else
  59. return -RT_ENOMEM;
  60. return RT_EOK;
  61. }
  62. static rt_err_t utest_tc_cleanup(void)
  63. {
  64. lwp_ref_dec(lwp);
  65. return RT_EOK;
  66. }
  67. static void testcase(void)
  68. {
  69. UTEST_UNIT_RUN(aspace_unmap_tc);
  70. }
  71. UTEST_TC_EXPORT(testcase, "testcases.mm.aspace_unmap_range.invalid_param", utest_tc_init, utest_tc_cleanup, 10);