root/tools/testing/vma/tests/mmap.c
// SPDX-License-Identifier: GPL-2.0-or-later

static bool test_mmap_region_basic(void)
{
        const vma_flags_t vma_flags = mk_vma_flags(VMA_READ_BIT, VMA_WRITE_BIT,
                        VMA_MAYREAD_BIT, VMA_MAYWRITE_BIT);
        struct mm_struct mm = {};
        unsigned long addr;
        struct vm_area_struct *vma;
        VMA_ITERATOR(vmi, &mm, 0);

        current->mm = &mm;

        /* Map at 0x300000, length 0x3000. */
        addr = __mmap_region(NULL, 0x300000, 0x3000, vma_flags, 0x300, NULL);
        ASSERT_EQ(addr, 0x300000);

        /* Map at 0x250000, length 0x3000. */
        addr = __mmap_region(NULL, 0x250000, 0x3000, vma_flags, 0x250, NULL);
        ASSERT_EQ(addr, 0x250000);

        /* Map at 0x303000, merging to 0x300000 of length 0x6000. */
        addr = __mmap_region(NULL, 0x303000, 0x3000, vma_flags, 0x303, NULL);
        ASSERT_EQ(addr, 0x303000);

        /* Map at 0x24d000, merging to 0x250000 of length 0x6000. */
        addr = __mmap_region(NULL, 0x24d000, 0x3000, vma_flags, 0x24d, NULL);
        ASSERT_EQ(addr, 0x24d000);

        ASSERT_EQ(mm.map_count, 2);

        for_each_vma(vmi, vma) {
                if (vma->vm_start == 0x300000) {
                        ASSERT_EQ(vma->vm_end, 0x306000);
                        ASSERT_EQ(vma->vm_pgoff, 0x300);
                } else if (vma->vm_start == 0x24d000) {
                        ASSERT_EQ(vma->vm_end, 0x253000);
                        ASSERT_EQ(vma->vm_pgoff, 0x24d);
                } else {
                        ASSERT_FALSE(true);
                }
        }

        cleanup_mm(&mm, &vmi);
        return true;
}

static void run_mmap_tests(int *num_tests, int *num_fail)
{
        TEST(mmap_region_basic);
}