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