1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ART_IMGDIAG_PAGE_UTIL_H_ 18 #define ART_IMGDIAG_PAGE_UTIL_H_ 19 20 #include <cstdint> 21 22 #include "base/array_ref.h" 23 #include "base/os.h" 24 #include "base/unix_file/fd_file.h" 25 26 namespace art { 27 static constexpr size_t kPageMapEntrySize = sizeof(uint64_t); 28 // bits 0-54 [in /proc/$pid/pagemap] 29 static constexpr uint64_t kPageFrameNumberMask = (1ULL << 55) - 1; 30 31 static constexpr size_t kPageFlagsEntrySize = sizeof(uint64_t); 32 static constexpr size_t kPageCountEntrySize = sizeof(uint64_t); 33 static constexpr uint64_t kPageFlagsDirtyMask = (1ULL << 4); // in /proc/kpageflags 34 static constexpr uint64_t kPageFlagsNoPageMask = (1ULL << 20); // in /proc/kpageflags 35 static constexpr uint64_t kPageFlagsMmapMask = (1ULL << 11); // in /proc/kpageflags 36 37 // Note: On failure, `page_flags_or_counts[.]` shall be clobbered. 38 bool GetPageFlagsOrCount(art::File& kpage_file, 39 uint64_t page_frame_number, 40 /*out*/ uint64_t& page_flags_or_count, 41 /*out*/ std::string& error_msg); 42 43 bool GetPageFlagsOrCounts(art::File& kpage_file, 44 ArrayRef<const uint64_t> page_frame_numbers, 45 /*out*/ ArrayRef<uint64_t> page_flags_or_counts, 46 /*out*/ std::string& error_msg); 47 48 // Note: On failure, `*page_frame_number` shall be clobbered. 49 bool GetPageFrameNumber(art::File& page_map_file, 50 size_t virtual_page_index, 51 /*out*/ uint64_t& page_frame_number, 52 /*out*/ std::string& error_msg); 53 54 bool GetPageFrameNumbers(art::File& page_map_file, 55 size_t virtual_page_index, 56 /*out*/ ArrayRef<uint64_t> page_frame_numbers, 57 /*out*/ std::string& error_msg); 58 59 } // namespace art 60 61 #endif // ART_IMGDIAG_PAGE_UTIL_H_ 62