1*6dbdd20aSAndroid Build Coastguard Worker /* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker * 4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker * 8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker * 10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker */ 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_KALLSYMS_LAZY_KERNEL_SYMBOLIZER_H_ 18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_KALLSYMS_LAZY_KERNEL_SYMBOLIZER_H_ 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker #include <memory> 21*6dbdd20aSAndroid Build Coastguard Worker 22*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/thread_checker.h" 23*6dbdd20aSAndroid Build Coastguard Worker 24*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 25*6dbdd20aSAndroid Build Coastguard Worker 26*6dbdd20aSAndroid Build Coastguard Worker class KernelSymbolMap; 27*6dbdd20aSAndroid Build Coastguard Worker 28*6dbdd20aSAndroid Build Coastguard Worker // This class is a wrapper around KernelSymbolMap. It serves two purposes: 29*6dbdd20aSAndroid Build Coastguard Worker // 1. Deals with /proc/kallsyms reads and temporary lowering of kptr_restrict. 30*6dbdd20aSAndroid Build Coastguard Worker // KernelSymbolMap is just a parser and doesn't do I/O. 31*6dbdd20aSAndroid Build Coastguard Worker // 2. Allows to share the same KernelSymbolMap instance across several clients 32*6dbdd20aSAndroid Build Coastguard Worker // and tear it down when tracing stops. 33*6dbdd20aSAndroid Build Coastguard Worker // 34*6dbdd20aSAndroid Build Coastguard Worker // LazyKernelSymbolizer is owned by the (one) FtraceController. FtraceController 35*6dbdd20aSAndroid Build Coastguard Worker // handles LazyKernelSymbolizer pointers to N CpuReader-s (one per CPU). In 36*6dbdd20aSAndroid Build Coastguard Worker // this way all CpuReader instances can share the same symbol map instance. 37*6dbdd20aSAndroid Build Coastguard Worker // The object being shared is LazyKernelSymbolizer, which is cheap and always 38*6dbdd20aSAndroid Build Coastguard Worker // valid. LazyKernelSymbolizer may or may not contain a valid symbol map. 39*6dbdd20aSAndroid Build Coastguard Worker class LazyKernelSymbolizer { 40*6dbdd20aSAndroid Build Coastguard Worker public: 41*6dbdd20aSAndroid Build Coastguard Worker // Constructs an empty instance. Does NOT load any symbols upon construction. 42*6dbdd20aSAndroid Build Coastguard Worker // Loading and parsing happens on the first GetOrCreateKernelSymbolMap() call. 43*6dbdd20aSAndroid Build Coastguard Worker LazyKernelSymbolizer(); 44*6dbdd20aSAndroid Build Coastguard Worker ~LazyKernelSymbolizer(); 45*6dbdd20aSAndroid Build Coastguard Worker 46*6dbdd20aSAndroid Build Coastguard Worker // Returns |instance_|, creating it if doesn't exist or was destroyed. 47*6dbdd20aSAndroid Build Coastguard Worker KernelSymbolMap* GetOrCreateKernelSymbolMap(); 48*6dbdd20aSAndroid Build Coastguard Worker is_valid()49*6dbdd20aSAndroid Build Coastguard Worker bool is_valid() const { return !!symbol_map_; } 50*6dbdd20aSAndroid Build Coastguard Worker 51*6dbdd20aSAndroid Build Coastguard Worker // Destroys the |symbol_map_| freeing up memory. A further call to 52*6dbdd20aSAndroid Build Coastguard Worker // GetOrCreateKernelSymbolMap() will create it again. 53*6dbdd20aSAndroid Build Coastguard Worker void Destroy(); 54*6dbdd20aSAndroid Build Coastguard Worker 55*6dbdd20aSAndroid Build Coastguard Worker // Exposed for testing. 56*6dbdd20aSAndroid Build Coastguard Worker static bool CanReadKernelSymbolAddresses( 57*6dbdd20aSAndroid Build Coastguard Worker const char* ksyms_path_for_testing = nullptr); 58*6dbdd20aSAndroid Build Coastguard Worker 59*6dbdd20aSAndroid Build Coastguard Worker private: 60*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<KernelSymbolMap> symbol_map_; 61*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_THREAD_CHECKER(thread_checker_) 62*6dbdd20aSAndroid Build Coastguard Worker }; 63*6dbdd20aSAndroid Build Coastguard Worker 64*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 65*6dbdd20aSAndroid Build Coastguard Worker 66*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_KALLSYMS_LAZY_KERNEL_SYMBOLIZER_H_ 67