mmap.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. static bool test_mmap_region_basic(void)
  3. {
  4. struct mm_struct mm = {};
  5. unsigned long addr;
  6. struct vm_area_struct *vma;
  7. VMA_ITERATOR(vmi, &mm, 0);
  8. current->mm = &mm;
  9. /* Map at 0x300000, length 0x3000. */
  10. addr = __mmap_region(NULL, 0x300000, 0x3000,
  11. VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE,
  12. 0x300, NULL);
  13. ASSERT_EQ(addr, 0x300000);
  14. /* Map at 0x250000, length 0x3000. */
  15. addr = __mmap_region(NULL, 0x250000, 0x3000,
  16. VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE,
  17. 0x250, NULL);
  18. ASSERT_EQ(addr, 0x250000);
  19. /* Map at 0x303000, merging to 0x300000 of length 0x6000. */
  20. addr = __mmap_region(NULL, 0x303000, 0x3000,
  21. VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE,
  22. 0x303, NULL);
  23. ASSERT_EQ(addr, 0x303000);
  24. /* Map at 0x24d000, merging to 0x250000 of length 0x6000. */
  25. addr = __mmap_region(NULL, 0x24d000, 0x3000,
  26. VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE,
  27. 0x24d, NULL);
  28. ASSERT_EQ(addr, 0x24d000);
  29. ASSERT_EQ(mm.map_count, 2);
  30. for_each_vma(vmi, vma) {
  31. if (vma->vm_start == 0x300000) {
  32. ASSERT_EQ(vma->vm_end, 0x306000);
  33. ASSERT_EQ(vma->vm_pgoff, 0x300);
  34. } else if (vma->vm_start == 0x24d000) {
  35. ASSERT_EQ(vma->vm_end, 0x253000);
  36. ASSERT_EQ(vma->vm_pgoff, 0x24d);
  37. } else {
  38. ASSERT_FALSE(true);
  39. }
  40. }
  41. cleanup_mm(&mm, &vmi);
  42. return true;
  43. }
  44. static void run_mmap_tests(int *num_tests, int *num_fail)
  45. {
  46. TEST(mmap_region_basic);
  47. }