/* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ART_IMGDIAG_PAGE_UTIL_H_ #define ART_IMGDIAG_PAGE_UTIL_H_ #include #include "base/array_ref.h" #include "base/os.h" #include "base/unix_file/fd_file.h" namespace art { static constexpr size_t kPageMapEntrySize = sizeof(uint64_t); // bits 0-54 [in /proc/$pid/pagemap] static constexpr uint64_t kPageFrameNumberMask = (1ULL << 55) - 1; static constexpr size_t kPageFlagsEntrySize = sizeof(uint64_t); static constexpr size_t kPageCountEntrySize = sizeof(uint64_t); static constexpr uint64_t kPageFlagsDirtyMask = (1ULL << 4); // in /proc/kpageflags static constexpr uint64_t kPageFlagsNoPageMask = (1ULL << 20); // in /proc/kpageflags static constexpr uint64_t kPageFlagsMmapMask = (1ULL << 11); // in /proc/kpageflags // Note: On failure, `page_flags_or_counts[.]` shall be clobbered. bool GetPageFlagsOrCount(art::File& kpage_file, uint64_t page_frame_number, /*out*/ uint64_t& page_flags_or_count, /*out*/ std::string& error_msg); bool GetPageFlagsOrCounts(art::File& kpage_file, ArrayRef page_frame_numbers, /*out*/ ArrayRef page_flags_or_counts, /*out*/ std::string& error_msg); // Note: On failure, `*page_frame_number` shall be clobbered. bool GetPageFrameNumber(art::File& page_map_file, size_t virtual_page_index, /*out*/ uint64_t& page_frame_number, /*out*/ std::string& error_msg); bool GetPageFrameNumbers(art::File& page_map_file, size_t virtual_page_index, /*out*/ ArrayRef page_frame_numbers, /*out*/ std::string& error_msg); } // namespace art #endif // ART_IMGDIAG_PAGE_UTIL_H_