19762338dSopenharmony_ci/* 29762338dSopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 49762338dSopenharmony_ci * you may not use this file except in compliance with the License. 59762338dSopenharmony_ci * You may obtain a copy of the License at 69762338dSopenharmony_ci * 79762338dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 89762338dSopenharmony_ci * 99762338dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129762338dSopenharmony_ci * See the License for the specific language governing permissions and 139762338dSopenharmony_ci * limitations under the License. 149762338dSopenharmony_ci */ 159762338dSopenharmony_ci 169762338dSopenharmony_ci#include <gtest/gtest.h> 179762338dSopenharmony_ci#include <fcntl.h> 189762338dSopenharmony_ci#include <cinttypes> 199762338dSopenharmony_ci#include <climits> 209762338dSopenharmony_ci#include <cstdio> 219762338dSopenharmony_ci#include <cstdlib> 229762338dSopenharmony_ci#include <unistd.h> 239762338dSopenharmony_ci#include <iomanip> 249762338dSopenharmony_ci#include <iostream> 259762338dSopenharmony_ci#include <string> 269762338dSopenharmony_ci#include <vector> 279762338dSopenharmony_ci#include <sys/mman.h> 289762338dSopenharmony_ci#include <sys/utsname.h> 299762338dSopenharmony_ci#include <string> 309762338dSopenharmony_ci#include <regex> 319762338dSopenharmony_ci#include "securec.h" 329762338dSopenharmony_ci 339762338dSopenharmony_ci#define PAGE_SIZE 4096 349762338dSopenharmony_ci 359762338dSopenharmony_ci 369762338dSopenharmony_ciusing namespace testing::ext; 379762338dSopenharmony_ciusing namespace std; 389762338dSopenharmony_ci 399762338dSopenharmony_ciclass MadviseApiTest : public testing::Test { 409762338dSopenharmony_cipublic: 419762338dSopenharmony_ci static void SetUpTestCase(); 429762338dSopenharmony_ci static void TearDownTestCase(); 439762338dSopenharmony_ci void SetUp(); 449762338dSopenharmony_ci void TearDown(); 459762338dSopenharmony_ciprivate: 469762338dSopenharmony_ci}; 479762338dSopenharmony_civoid MadviseApiTest::SetUp() 489762338dSopenharmony_ci{ 499762338dSopenharmony_ci} 509762338dSopenharmony_civoid MadviseApiTest::TearDown() 519762338dSopenharmony_ci{ 529762338dSopenharmony_ci} 539762338dSopenharmony_civoid MadviseApiTest::SetUpTestCase() 549762338dSopenharmony_ci{ 559762338dSopenharmony_ci} 569762338dSopenharmony_civoid MadviseApiTest::TearDownTestCase() 579762338dSopenharmony_ci{ 589762338dSopenharmony_ci} 599762338dSopenharmony_ci 609762338dSopenharmony_cistatic void CreateFile() 619762338dSopenharmony_ci{ 629762338dSopenharmony_ci FILE *file; 639762338dSopenharmony_ci int ret = -1; 649762338dSopenharmony_ci char *buffer = static_cast<char *>(malloc(PAGE_SIZE)); 659762338dSopenharmony_ci if (buffer != nullptr) { 669762338dSopenharmony_ci ret = memset_s(buffer, PAGE_SIZE, 'a', PAGE_SIZE); 679762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 689762338dSopenharmony_ci file = fopen("output_file.txt", "wb"); 699762338dSopenharmony_ci if (fwrite(buffer, 1, PAGE_SIZE, file) != PAGE_SIZE) { 709762338dSopenharmony_ci std::cout << "Error fwrite file.\n" << std::endl; 719762338dSopenharmony_ci ASSERT_TRUE(ret != 0); 729762338dSopenharmony_ci } 739762338dSopenharmony_ci fclose(file); 749762338dSopenharmony_ci } 759762338dSopenharmony_ci free(buffer); 769762338dSopenharmony_ci} 779762338dSopenharmony_ci 789762338dSopenharmony_ci/* 799762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_0100 809762338dSopenharmony_ci * @tc.name MadviseMadvCold001 819762338dSopenharmony_ci * @tc.desc MADV_COLD with MAP_PRIVATE 829762338dSopenharmony_ci*/ 839762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvCold001, Function | MediumTest | Level1) 849762338dSopenharmony_ci{ 859762338dSopenharmony_ci void *addr = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 869762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 879762338dSopenharmony_ci int err = madvise(addr, PAGE_SIZE, MADV_COLD); 889762338dSopenharmony_ci ASSERT_TRUE(err == 0); 899762338dSopenharmony_ci int ret = munmap(addr, PAGE_SIZE); 909762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 919762338dSopenharmony_ci addr = nullptr; 929762338dSopenharmony_ci} 939762338dSopenharmony_ci 949762338dSopenharmony_ci/* 959762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_0200 969762338dSopenharmony_ci * @tc.name MadviseMadvCold002 979762338dSopenharmony_ci * @tc.desc MADV_COLD with MAP_SHARED 989762338dSopenharmony_ci*/ 999762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvCold002, Function | MediumTest | Level1) 1009762338dSopenharmony_ci{ 1019762338dSopenharmony_ci CreateFile(); 1029762338dSopenharmony_ci int fd = open("output_file.txt", O_RDWR); 1039762338dSopenharmony_ci ASSERT_TRUE(fd > 0); 1049762338dSopenharmony_ci void *addr = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED | MAP_FILE, fd, 0); 1059762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 1069762338dSopenharmony_ci int ret = madvise(addr, PAGE_SIZE, MADV_COLD); 1079762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1089762338dSopenharmony_ci ret = munmap(addr, PAGE_SIZE); 1099762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1109762338dSopenharmony_ci addr = nullptr; 1119762338dSopenharmony_ci close(fd); 1129762338dSopenharmony_ci ret = unlink("output_file.txt"); 1139762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1149762338dSopenharmony_ci addr = nullptr; 1159762338dSopenharmony_ci} 1169762338dSopenharmony_ci 1179762338dSopenharmony_ci/* 1189762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_0300 1199762338dSopenharmony_ci * @tc.name MadviseMadvCold003 1209762338dSopenharmony_ci * @tc.desc MADV_COLD with mlock MAP_PRIVATE FILE 1219762338dSopenharmony_ci*/ 1229762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvCold003, Function | MediumTest | Level1) 1239762338dSopenharmony_ci{ 1249762338dSopenharmony_ci CreateFile(); 1259762338dSopenharmony_ci int fd = open("output_file.txt", O_RDWR); 1269762338dSopenharmony_ci ASSERT_TRUE(fd > 0); 1279762338dSopenharmony_ci void *addr = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED | MAP_FILE, fd, 0); 1289762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 1299762338dSopenharmony_ci int ret = mlock(addr, PAGE_SIZE); 1309762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1319762338dSopenharmony_ci ret = madvise(addr, PAGE_SIZE, MADV_COLD); 1329762338dSopenharmony_ci ASSERT_TRUE(ret == -1); 1339762338dSopenharmony_ci ret = munmap(addr, PAGE_SIZE); 1349762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1359762338dSopenharmony_ci addr = nullptr; 1369762338dSopenharmony_ci close(fd); 1379762338dSopenharmony_ci ret = unlink("output_file.txt"); 1389762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1399762338dSopenharmony_ci addr = nullptr; 1409762338dSopenharmony_ci} 1419762338dSopenharmony_ci 1429762338dSopenharmony_ci/* 1439762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_0400 1449762338dSopenharmony_ci * @tc.name MadviseMadvCold004 1459762338dSopenharmony_ci * @tc.desc MADV_COLD with mlock MAP_PRIVATE anon 1469762338dSopenharmony_ci*/ 1479762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvCold004, Function | MediumTest | Level1) 1489762338dSopenharmony_ci{ 1499762338dSopenharmony_ci void *addr = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 1509762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 1519762338dSopenharmony_ci int ret = mlock(addr, PAGE_SIZE); 1529762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1539762338dSopenharmony_ci ret = madvise(addr, PAGE_SIZE, MADV_COLD); 1549762338dSopenharmony_ci ASSERT_TRUE(ret == -1); 1559762338dSopenharmony_ci ret = munmap(addr, PAGE_SIZE); 1569762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1579762338dSopenharmony_ci addr = nullptr; 1589762338dSopenharmony_ci} 1599762338dSopenharmony_ci 1609762338dSopenharmony_ci/* 1619762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_0500 1629762338dSopenharmony_ci * @tc.name MadviseMadvPageOut001 1639762338dSopenharmony_ci * @tc.desc MADV_PAGEOUT with MAP_PRIVATE anon 1649762338dSopenharmony_ci*/ 1659762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvPageOut001, Function | MediumTest | Level1) 1669762338dSopenharmony_ci{ 1679762338dSopenharmony_ci int ret = -1; 1689762338dSopenharmony_ci void *addr = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 1699762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 1709762338dSopenharmony_ci ret = memset_s(addr, PAGE_SIZE, 'a', PAGE_SIZE); 1719762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1729762338dSopenharmony_ci ret = madvise(addr, PAGE_SIZE, MADV_PAGEOUT); 1739762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1749762338dSopenharmony_ci ret = munmap(addr, PAGE_SIZE); 1759762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1769762338dSopenharmony_ci addr = nullptr; 1779762338dSopenharmony_ci} 1789762338dSopenharmony_ci 1799762338dSopenharmony_ci/* 1809762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_0600 1819762338dSopenharmony_ci * @tc.name MadviseMadvPageOut002 1829762338dSopenharmony_ci * @tc.desc MADV_PAGEOUT with MAP_SHARED FILE 1839762338dSopenharmony_ci*/ 1849762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvPageOut002, Function | MediumTest | Level1) 1859762338dSopenharmony_ci{ 1869762338dSopenharmony_ci CreateFile(); 1879762338dSopenharmony_ci int fd = open("output_file.txt", O_RDWR); 1889762338dSopenharmony_ci ASSERT_TRUE(fd > 0); 1899762338dSopenharmony_ci void *addr = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED | MAP_FILE, fd, 0); 1909762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 1919762338dSopenharmony_ci int ret = memset_s(addr, PAGE_SIZE, 'a', PAGE_SIZE); 1929762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1939762338dSopenharmony_ci ret = madvise(addr, PAGE_SIZE, MADV_PAGEOUT); 1949762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1959762338dSopenharmony_ci ret = munmap(addr, PAGE_SIZE); 1969762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 1979762338dSopenharmony_ci close(fd); 1989762338dSopenharmony_ci ret = unlink("output_file.txt"); 1999762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2009762338dSopenharmony_ci addr = nullptr; 2019762338dSopenharmony_ci} 2029762338dSopenharmony_ci 2039762338dSopenharmony_ci/* 2049762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_0700 2059762338dSopenharmony_ci * @tc.name MadviseMadvPageOut003 2069762338dSopenharmony_ci * @tc.desc MADV_PAGEOUT with mlock MAP_SHARED FILE 2079762338dSopenharmony_ci*/ 2089762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvPageOut003, Function | MediumTest | Level1) 2099762338dSopenharmony_ci{ 2109762338dSopenharmony_ci CreateFile(); 2119762338dSopenharmony_ci int fd = open("output_file.txt", O_RDWR); 2129762338dSopenharmony_ci ASSERT_TRUE(fd > 0); 2139762338dSopenharmony_ci void *addr = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED | MAP_FILE, fd, 0); 2149762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 2159762338dSopenharmony_ci int ret = memset_s(addr, PAGE_SIZE, 'a', PAGE_SIZE); 2169762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2179762338dSopenharmony_ci ret = mlock(addr, PAGE_SIZE); 2189762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2199762338dSopenharmony_ci ret = madvise(addr, PAGE_SIZE, MADV_PAGEOUT); 2209762338dSopenharmony_ci ASSERT_TRUE(ret == -1); 2219762338dSopenharmony_ci ret = munmap(addr, PAGE_SIZE); 2229762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2239762338dSopenharmony_ci close(fd); 2249762338dSopenharmony_ci ret = unlink("output_file.txt"); 2259762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2269762338dSopenharmony_ci addr = nullptr; 2279762338dSopenharmony_ci} 2289762338dSopenharmony_ci 2299762338dSopenharmony_ci/* 2309762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_0800 2319762338dSopenharmony_ci * @tc.name MadviseMadvPageOut004 2329762338dSopenharmony_ci * @tc.desc MADV_PAGEOUT with mlock MAP_PRIVATE anon 2339762338dSopenharmony_ci*/ 2349762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvPageOut004, Function | MediumTest | Level1) 2359762338dSopenharmony_ci{ 2369762338dSopenharmony_ci int ret = -2; 2379762338dSopenharmony_ci void *addr = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 2389762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 2399762338dSopenharmony_ci ret = memset_s(addr, PAGE_SIZE, 'a', PAGE_SIZE); 2409762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2419762338dSopenharmony_ci ret = mlock(addr, PAGE_SIZE); 2429762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2439762338dSopenharmony_ci ret = madvise(addr, PAGE_SIZE, MADV_PAGEOUT); 2449762338dSopenharmony_ci ASSERT_TRUE(ret == -1); 2459762338dSopenharmony_ci ret = munmap(addr, PAGE_SIZE); 2469762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2479762338dSopenharmony_ci addr = nullptr; 2489762338dSopenharmony_ci} 2499762338dSopenharmony_ci 2509762338dSopenharmony_ci/* 2519762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_0900 2529762338dSopenharmony_ci * @tc.name MadviseMadvWipeOnFork001 2539762338dSopenharmony_ci * @tc.desc MADV_WIPEONFORK with MAP_PRIVATE anon 2549762338dSopenharmony_ci*/ 2559762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvWipeOnFork001, Function | MediumTest | Level1) 2569762338dSopenharmony_ci{ 2579762338dSopenharmony_ci int status = 0; 2589762338dSopenharmony_ci char *addr = static_cast<char*>(mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, 2599762338dSopenharmony_ci MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)); 2609762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 2619762338dSopenharmony_ci *addr = 'A'; 2629762338dSopenharmony_ci int err = madvise(addr, PAGE_SIZE, MADV_WIPEONFORK); 2639762338dSopenharmony_ci ASSERT_TRUE(err == 0); 2649762338dSopenharmony_ci pid_t pid = fork(); 2659762338dSopenharmony_ci ASSERT_TRUE(pid >= 0); 2669762338dSopenharmony_ci if (pid == 0) 2679762338dSopenharmony_ci { 2689762338dSopenharmony_ci ASSERT_TRUE(*addr == 0); 2699762338dSopenharmony_ci exit(0); 2709762338dSopenharmony_ci } else { 2719762338dSopenharmony_ci ASSERT_TRUE(*addr == 'A'); 2729762338dSopenharmony_ci waitpid(0, &status, 0); 2739762338dSopenharmony_ci } 2749762338dSopenharmony_ci int ret = munmap(addr, PAGE_SIZE); 2759762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2769762338dSopenharmony_ci addr = nullptr; 2779762338dSopenharmony_ci} 2789762338dSopenharmony_ci 2799762338dSopenharmony_ci/* 2809762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_1000 2819762338dSopenharmony_ci * @tc.name MadviseMadvWipeOnFork002 2829762338dSopenharmony_ci * @tc.desc MADV_WIPEONFORK with MAP_SHARED 2839762338dSopenharmony_ci*/ 2849762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvWipeOnFork002, Function | MediumTest | Level1) 2859762338dSopenharmony_ci{ 2869762338dSopenharmony_ci void *addr = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0); 2879762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 2889762338dSopenharmony_ci int err = madvise(addr, PAGE_SIZE, MADV_WIPEONFORK); 2899762338dSopenharmony_ci ASSERT_TRUE(err == -1); 2909762338dSopenharmony_ci int ret = munmap(addr, PAGE_SIZE); 2919762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 2929762338dSopenharmony_ci addr = nullptr; 2939762338dSopenharmony_ci} 2949762338dSopenharmony_ci 2959762338dSopenharmony_ci/* 2969762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_1100 2979762338dSopenharmony_ci * @tc.name MadviseMadvWipeOnFork003 2989762338dSopenharmony_ci * @tc.desc MADV_KEEPONFORK after MADV_WIPEONFORK 2999762338dSopenharmony_ci*/ 3009762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvWipeOnFork003, Function | MediumTest | Level1) 3019762338dSopenharmony_ci{ 3029762338dSopenharmony_ci int status = 0; 3039762338dSopenharmony_ci char *addr = static_cast<char*>(mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, 3049762338dSopenharmony_ci MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)); 3059762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 3069762338dSopenharmony_ci *addr = 'A'; 3079762338dSopenharmony_ci int err = madvise(addr, PAGE_SIZE, MADV_WIPEONFORK); 3089762338dSopenharmony_ci ASSERT_TRUE(err == 0); 3099762338dSopenharmony_ci err = madvise(addr, PAGE_SIZE, MADV_KEEPONFORK); 3109762338dSopenharmony_ci ASSERT_TRUE(err == 0); 3119762338dSopenharmony_ci pid_t pid = fork(); 3129762338dSopenharmony_ci ASSERT_TRUE(pid >= 0); 3139762338dSopenharmony_ci if (pid == 0) 3149762338dSopenharmony_ci { 3159762338dSopenharmony_ci ASSERT_TRUE(*addr == 'A'); 3169762338dSopenharmony_ci exit(0); 3179762338dSopenharmony_ci } else { 3189762338dSopenharmony_ci ASSERT_TRUE(*addr == 'A'); 3199762338dSopenharmony_ci waitpid(0, &status, 0); 3209762338dSopenharmony_ci } 3219762338dSopenharmony_ci int ret = munmap(addr, PAGE_SIZE); 3229762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 3239762338dSopenharmony_ci addr = nullptr; 3249762338dSopenharmony_ci} 3259762338dSopenharmony_ci 3269762338dSopenharmony_ci/* 3279762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_1200 3289762338dSopenharmony_ci * @tc.name MadviseMadvWipeOnFork004 3299762338dSopenharmony_ci * @tc.desc next vregion is no MADV_WIPEONFORK 3309762338dSopenharmony_ci*/ 3319762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvWipeOnFork004, Function | MediumTest | Level1) 3329762338dSopenharmony_ci{ 3339762338dSopenharmony_ci int status = 0; 3349762338dSopenharmony_ci char *addr = static_cast<char*>(mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, 3359762338dSopenharmony_ci MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)); 3369762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 3379762338dSopenharmony_ci char *nextAddr = static_cast<char*>(mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE, 3389762338dSopenharmony_ci MAP_ANONYMOUS | MAP_PRIVATE, -1, PAGE_SIZE)); 3399762338dSopenharmony_ci ASSERT_TRUE(nextAddr != MAP_FAILED); 3409762338dSopenharmony_ci *addr = 'A'; 3419762338dSopenharmony_ci *nextAddr = 'B'; 3429762338dSopenharmony_ci int err = madvise(addr, PAGE_SIZE, MADV_WIPEONFORK); 3439762338dSopenharmony_ci ASSERT_TRUE(err == 0); 3449762338dSopenharmony_ci pid_t pid = fork(); 3459762338dSopenharmony_ci ASSERT_TRUE(pid >= 0); 3469762338dSopenharmony_ci if (pid == 0) 3479762338dSopenharmony_ci { 3489762338dSopenharmony_ci ASSERT_TRUE(*addr == 0); 3499762338dSopenharmony_ci ASSERT_TRUE(*nextAddr == 'B'); 3509762338dSopenharmony_ci exit(0); 3519762338dSopenharmony_ci } else { 3529762338dSopenharmony_ci ASSERT_TRUE(*addr == 'A'); 3539762338dSopenharmony_ci ASSERT_TRUE(*nextAddr == 'B'); 3549762338dSopenharmony_ci waitpid(0, &status, 0); 3559762338dSopenharmony_ci } 3569762338dSopenharmony_ci int ret = munmap(addr, PAGE_SIZE); 3579762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 3589762338dSopenharmony_ci ret = munmap(nextAddr, PAGE_SIZE); 3599762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 3609762338dSopenharmony_ci addr = nullptr; 3619762338dSopenharmony_ci nextAddr = nullptr; 3629762338dSopenharmony_ci} 3639762338dSopenharmony_ci 3649762338dSopenharmony_ci/* 3659762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_1300 3669762338dSopenharmony_ci * @tc.name MadviseMadvWipeOnFork005 3679762338dSopenharmony_ci * @tc.desc next vregion is MADV_WIPEONFORK 3689762338dSopenharmony_ci*/ 3699762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvWipeOnFork005, Function | MediumTest | Level1) 3709762338dSopenharmony_ci{ 3719762338dSopenharmony_ci int status = 0; 3729762338dSopenharmony_ci char *addr = static_cast<char*>(mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, 3739762338dSopenharmony_ci MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)); 3749762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 3759762338dSopenharmony_ci char *nextAddr = static_cast<char*>(mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE, 3769762338dSopenharmony_ci MAP_ANONYMOUS | MAP_PRIVATE, -1, PAGE_SIZE)); 3779762338dSopenharmony_ci ASSERT_TRUE(nextAddr != MAP_FAILED); 3789762338dSopenharmony_ci *addr = 'A'; 3799762338dSopenharmony_ci *nextAddr = 'B'; 3809762338dSopenharmony_ci int err = madvise(addr, PAGE_SIZE, MADV_WIPEONFORK); 3819762338dSopenharmony_ci ASSERT_TRUE(err == 0); 3829762338dSopenharmony_ci err = madvise(nextAddr, PAGE_SIZE, MADV_WIPEONFORK); 3839762338dSopenharmony_ci ASSERT_TRUE(err == 0); 3849762338dSopenharmony_ci pid_t pid = fork(); 3859762338dSopenharmony_ci ASSERT_TRUE(pid >= 0); 3869762338dSopenharmony_ci if (pid == 0) 3879762338dSopenharmony_ci { 3889762338dSopenharmony_ci ASSERT_TRUE(*addr == 0); 3899762338dSopenharmony_ci ASSERT_TRUE(*nextAddr == 0); 3909762338dSopenharmony_ci exit(0); 3919762338dSopenharmony_ci } else { 3929762338dSopenharmony_ci ASSERT_TRUE(*addr == 'A'); 3939762338dSopenharmony_ci ASSERT_TRUE(*nextAddr == 'B'); 3949762338dSopenharmony_ci waitpid(0, &status, 0); 3959762338dSopenharmony_ci } 3969762338dSopenharmony_ci int ret = munmap(addr, PAGE_SIZE); 3979762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 3989762338dSopenharmony_ci ret = munmap(nextAddr, PAGE_SIZE); 3999762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 4009762338dSopenharmony_ci addr = nullptr; 4019762338dSopenharmony_ci nextAddr = nullptr; 4029762338dSopenharmony_ci} 4039762338dSopenharmony_ci 4049762338dSopenharmony_ci/* 4059762338dSopenharmony_ci * @tc.number SUB_KERNEL_MEM_MADVISE_1400 4069762338dSopenharmony_ci * @tc.name MadviseMadvWipeOnFork006 4079762338dSopenharmony_ci * @tc.desc next vregion is MADV_KEEPONFORK 4089762338dSopenharmony_ci*/ 4099762338dSopenharmony_ciHWTEST_F(MadviseApiTest, MadviseMadvWipeOnFork006, Function | MediumTest | Level1) 4109762338dSopenharmony_ci{ 4119762338dSopenharmony_ci int status = 0; 4129762338dSopenharmony_ci char *addr = static_cast<char*>(mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, 4139762338dSopenharmony_ci MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)); 4149762338dSopenharmony_ci ASSERT_TRUE(addr != MAP_FAILED); 4159762338dSopenharmony_ci char *nextAddr = static_cast<char*>(mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE, 4169762338dSopenharmony_ci MAP_ANONYMOUS | MAP_PRIVATE, -1, PAGE_SIZE)); 4179762338dSopenharmony_ci ASSERT_TRUE(nextAddr != MAP_FAILED); 4189762338dSopenharmony_ci *addr = 'A'; 4199762338dSopenharmony_ci *nextAddr = 'B'; 4209762338dSopenharmony_ci int err = madvise(addr, PAGE_SIZE, MADV_WIPEONFORK); 4219762338dSopenharmony_ci ASSERT_TRUE(err == 0); 4229762338dSopenharmony_ci err = madvise(nextAddr, PAGE_SIZE, MADV_WIPEONFORK); 4239762338dSopenharmony_ci ASSERT_TRUE(err == 0); 4249762338dSopenharmony_ci err = madvise(addr, PAGE_SIZE, MADV_KEEPONFORK); 4259762338dSopenharmony_ci ASSERT_TRUE(err == 0); 4269762338dSopenharmony_ci err = madvise(nextAddr, PAGE_SIZE, MADV_KEEPONFORK); 4279762338dSopenharmony_ci ASSERT_TRUE(err == 0); 4289762338dSopenharmony_ci pid_t pid = fork(); 4299762338dSopenharmony_ci ASSERT_TRUE(pid >= 0); 4309762338dSopenharmony_ci if (pid == 0) 4319762338dSopenharmony_ci { 4329762338dSopenharmony_ci ASSERT_TRUE(*addr == 'A'); 4339762338dSopenharmony_ci ASSERT_TRUE(*nextAddr == 'B'); 4349762338dSopenharmony_ci exit(0); 4359762338dSopenharmony_ci } else { 4369762338dSopenharmony_ci ASSERT_TRUE(*addr == 'A'); 4379762338dSopenharmony_ci ASSERT_TRUE(*nextAddr == 'B'); 4389762338dSopenharmony_ci waitpid(0, &status, 0); 4399762338dSopenharmony_ci } 4409762338dSopenharmony_ci int ret = munmap(addr, PAGE_SIZE); 4419762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 4429762338dSopenharmony_ci ret = munmap(nextAddr, PAGE_SIZE); 4439762338dSopenharmony_ci ASSERT_TRUE(ret == 0); 4449762338dSopenharmony_ci addr = nullptr; 4459762338dSopenharmony_ci nextAddr = nullptr; 4469762338dSopenharmony_ci}