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