1*fe1645e2SSchrodinger ZHU Yifan //===-- Unittests for msync -----------------------------------------------===// 2*fe1645e2SSchrodinger ZHU Yifan // 3*fe1645e2SSchrodinger ZHU Yifan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*fe1645e2SSchrodinger ZHU Yifan // See https://llvm.org/LICENSE.txt for license information. 5*fe1645e2SSchrodinger ZHU Yifan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*fe1645e2SSchrodinger ZHU Yifan // 7*fe1645e2SSchrodinger ZHU Yifan //===----------------------------------------------------------------------===// 8*fe1645e2SSchrodinger ZHU Yifan 9*fe1645e2SSchrodinger ZHU Yifan #include "src/errno/libc_errno.h" 10*fe1645e2SSchrodinger ZHU Yifan #include "src/sys/mman/mlock.h" 11*fe1645e2SSchrodinger ZHU Yifan #include "src/sys/mman/mmap.h" 12*fe1645e2SSchrodinger ZHU Yifan #include "src/sys/mman/msync.h" 13*fe1645e2SSchrodinger ZHU Yifan #include "src/sys/mman/munlock.h" 14*fe1645e2SSchrodinger ZHU Yifan #include "src/sys/mman/munmap.h" 15*fe1645e2SSchrodinger ZHU Yifan #include "src/unistd/sysconf.h" 16*fe1645e2SSchrodinger ZHU Yifan #include "test/UnitTest/ErrnoSetterMatcher.h" 17*fe1645e2SSchrodinger ZHU Yifan #include "test/UnitTest/Test.h" 18*fe1645e2SSchrodinger ZHU Yifan 19*fe1645e2SSchrodinger ZHU Yifan using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher; 20*fe1645e2SSchrodinger ZHU Yifan 21*fe1645e2SSchrodinger ZHU Yifan struct PageHolder { 22*fe1645e2SSchrodinger ZHU Yifan size_t size; 23*fe1645e2SSchrodinger ZHU Yifan void *addr; 24*fe1645e2SSchrodinger ZHU Yifan 25*fe1645e2SSchrodinger ZHU Yifan PageHolder() 26*fe1645e2SSchrodinger ZHU Yifan : size(LIBC_NAMESPACE::sysconf(_SC_PAGESIZE)), 27*fe1645e2SSchrodinger ZHU Yifan addr(LIBC_NAMESPACE::mmap(nullptr, size, PROT_READ | PROT_WRITE, 28*fe1645e2SSchrodinger ZHU Yifan MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)) {} 29*fe1645e2SSchrodinger ZHU Yifan ~PageHolder() { 30*fe1645e2SSchrodinger ZHU Yifan if (addr != MAP_FAILED) 31*fe1645e2SSchrodinger ZHU Yifan LIBC_NAMESPACE::munmap(addr, size); 32*fe1645e2SSchrodinger ZHU Yifan } 33*fe1645e2SSchrodinger ZHU Yifan 34*fe1645e2SSchrodinger ZHU Yifan char &operator[](size_t i) { return reinterpret_cast<char *>(addr)[i]; } 35*fe1645e2SSchrodinger ZHU Yifan 36*fe1645e2SSchrodinger ZHU Yifan bool is_valid() { return addr != MAP_FAILED; } 37*fe1645e2SSchrodinger ZHU Yifan }; 38*fe1645e2SSchrodinger ZHU Yifan 39*fe1645e2SSchrodinger ZHU Yifan TEST(LlvmLibcMsyncTest, UnMappedMemory) { 40*fe1645e2SSchrodinger ZHU Yifan EXPECT_THAT(LIBC_NAMESPACE::msync(nullptr, 1024, MS_SYNC), Fails(ENOMEM)); 41*fe1645e2SSchrodinger ZHU Yifan EXPECT_THAT(LIBC_NAMESPACE::msync(nullptr, 1024, MS_ASYNC), Fails(ENOMEM)); 42*fe1645e2SSchrodinger ZHU Yifan } 43*fe1645e2SSchrodinger ZHU Yifan 44*fe1645e2SSchrodinger ZHU Yifan TEST(LlvmLibcMsyncTest, LockedPage) { 45*fe1645e2SSchrodinger ZHU Yifan PageHolder page; 46*fe1645e2SSchrodinger ZHU Yifan ASSERT_TRUE(page.is_valid()); 47*fe1645e2SSchrodinger ZHU Yifan ASSERT_THAT(LIBC_NAMESPACE::mlock(page.addr, page.size), Succeeds()); 48*fe1645e2SSchrodinger ZHU Yifan EXPECT_THAT( 49*fe1645e2SSchrodinger ZHU Yifan LIBC_NAMESPACE::msync(page.addr, page.size, MS_SYNC | MS_INVALIDATE), 50*fe1645e2SSchrodinger ZHU Yifan Fails(EBUSY)); 51*fe1645e2SSchrodinger ZHU Yifan ASSERT_THAT(LIBC_NAMESPACE::munlock(page.addr, page.size), Succeeds()); 52*fe1645e2SSchrodinger ZHU Yifan EXPECT_THAT(LIBC_NAMESPACE::msync(page.addr, page.size, MS_SYNC), Succeeds()); 53*fe1645e2SSchrodinger ZHU Yifan } 54*fe1645e2SSchrodinger ZHU Yifan 55*fe1645e2SSchrodinger ZHU Yifan TEST(LlvmLibcMsyncTest, UnalignedAddress) { 56*fe1645e2SSchrodinger ZHU Yifan PageHolder page; 57*fe1645e2SSchrodinger ZHU Yifan ASSERT_TRUE(page.is_valid()); 58*fe1645e2SSchrodinger ZHU Yifan EXPECT_THAT(LIBC_NAMESPACE::msync(&page[1], page.size - 1, MS_SYNC), 59*fe1645e2SSchrodinger ZHU Yifan Fails(EINVAL)); 60*fe1645e2SSchrodinger ZHU Yifan } 61*fe1645e2SSchrodinger ZHU Yifan 62*fe1645e2SSchrodinger ZHU Yifan TEST(LlvmLibcMsyncTest, InvalidFlag) { 63*fe1645e2SSchrodinger ZHU Yifan PageHolder page; 64*fe1645e2SSchrodinger ZHU Yifan ASSERT_TRUE(page.is_valid()); 65*fe1645e2SSchrodinger ZHU Yifan EXPECT_THAT(LIBC_NAMESPACE::msync(page.addr, page.size, MS_SYNC | MS_ASYNC), 66*fe1645e2SSchrodinger ZHU Yifan Fails(EINVAL)); 67*fe1645e2SSchrodinger ZHU Yifan EXPECT_THAT(LIBC_NAMESPACE::msync(page.addr, page.size, -1), Fails(EINVAL)); 68*fe1645e2SSchrodinger ZHU Yifan } 69