brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 71f810e Raw
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