92 lines · cpp
1//===-- common_test.cpp -----------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "internal_defs.h"10#include "tests/scudo_unit_test.h"11 12#include "common.h"13#include "mem_map.h"14 15#include <errno.h>16#include <string.h>17#include <sys/mman.h>18 19#include <algorithm>20#include <vector>21 22namespace scudo {23 24static void getResidentPages(void *BaseAddress, size_t TotalPages,25 size_t *ResidentPages) {26 std::vector<unsigned char> Pages(TotalPages, 0);27 ASSERT_EQ(28 0, mincore(BaseAddress, TotalPages * getPageSizeCached(), Pages.data()))29 << strerror(errno);30 *ResidentPages = 0;31 for (unsigned char Value : Pages) {32 if (Value & 1) {33 ++*ResidentPages;34 }35 }36}37 38// Fuchsia needs getResidentPages implementation.39TEST(ScudoCommonTest, SKIP_ON_FUCHSIA(ResidentMemorySize)) {40 // Make sure to have the size of the map on a page boundary.41 const uptr PageSize = getPageSizeCached();42 const size_t NumPages = 1000;43 const uptr SizeBytes = NumPages * PageSize;44 45 MemMapT MemMap;46 ASSERT_TRUE(MemMap.map(/*Addr=*/0U, SizeBytes, "ResidentMemorySize"));47 ASSERT_NE(MemMap.getBase(), 0U);48 49 void *P = reinterpret_cast<void *>(MemMap.getBase());50 size_t ResidentPages;51 getResidentPages(P, NumPages, &ResidentPages);52 EXPECT_EQ(0U, ResidentPages);53 54 // Make the entire map resident.55 memset(P, 1, SizeBytes);56 getResidentPages(P, NumPages, &ResidentPages);57 EXPECT_EQ(NumPages, ResidentPages);58 59 // Should release the memory to the kernel immediately.60 MemMap.releasePagesToOS(MemMap.getBase(), SizeBytes);61 getResidentPages(P, NumPages, &ResidentPages);62 EXPECT_EQ(0U, ResidentPages);63 64 // Make the entire map resident again.65 memset(P, 1, SizeBytes);66 getResidentPages(P, NumPages, &ResidentPages);67 EXPECT_EQ(NumPages, ResidentPages);68 69 MemMap.unmap();70}71 72TEST(ScudoCommonTest, Zeros) {73 const uptr Size = 1ull << 20;74 75 MemMapT MemMap;76 ASSERT_TRUE(MemMap.map(/*Addr=*/0U, Size, "Zeros"));77 ASSERT_NE(MemMap.getBase(), 0U);78 uptr *P = reinterpret_cast<uptr *>(MemMap.getBase());79 const ptrdiff_t N = Size / sizeof(uptr);80 EXPECT_EQ(std::count(P, P + N, 0), N);81 82 memset(P, 1, Size);83 EXPECT_EQ(std::count(P, P + N, 0), 0);84 85 MemMap.releasePagesToOS(MemMap.getBase(), Size);86 EXPECT_EQ(std::count(P, P + N, 0), N);87 88 MemMap.unmap();89}90 91} // namespace scudo92