1*eb293b8fSAndroid Build Coastguard Worker /* 2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*eb293b8fSAndroid Build Coastguard Worker * 4*eb293b8fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*eb293b8fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*eb293b8fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*eb293b8fSAndroid Build Coastguard Worker * 8*eb293b8fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*eb293b8fSAndroid Build Coastguard Worker * 10*eb293b8fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*eb293b8fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*eb293b8fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*eb293b8fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*eb293b8fSAndroid Build Coastguard Worker * limitations under the License. 15*eb293b8fSAndroid Build Coastguard Worker */ 16*eb293b8fSAndroid Build Coastguard Worker 17*eb293b8fSAndroid Build Coastguard Worker #pragma once 18*eb293b8fSAndroid Build Coastguard Worker 19*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h> 20*eb293b8fSAndroid Build Coastguard Worker #include <sys/types.h> 21*eb293b8fSAndroid Build Coastguard Worker #include <unistd.h> 22*eb293b8fSAndroid Build Coastguard Worker 23*eb293b8fSAndroid Build Coastguard Worker #include <memory> 24*eb293b8fSAndroid Build Coastguard Worker #include <string> 25*eb293b8fSAndroid Build Coastguard Worker 26*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack { 27*eb293b8fSAndroid Build Coastguard Worker 28*eb293b8fSAndroid Build Coastguard Worker class MemoryCacheBase; 29*eb293b8fSAndroid Build Coastguard Worker 30*eb293b8fSAndroid Build Coastguard Worker class Memory { 31*eb293b8fSAndroid Build Coastguard Worker public: 32*eb293b8fSAndroid Build Coastguard Worker Memory() = default; 33*eb293b8fSAndroid Build Coastguard Worker virtual ~Memory() = default; 34*eb293b8fSAndroid Build Coastguard Worker 35*eb293b8fSAndroid Build Coastguard Worker static std::shared_ptr<Memory> CreateProcessMemory(pid_t pid); 36*eb293b8fSAndroid Build Coastguard Worker static std::shared_ptr<Memory> CreateProcessMemoryCached(pid_t pid); 37*eb293b8fSAndroid Build Coastguard Worker static std::shared_ptr<Memory> CreateProcessMemoryThreadCached(pid_t pid); 38*eb293b8fSAndroid Build Coastguard Worker // This should only be used for performance. Using this could result 39*eb293b8fSAndroid Build Coastguard Worker // in crashes if used to try and read stack data. 40*eb293b8fSAndroid Build Coastguard Worker static std::shared_ptr<Memory> CreateProcessMemoryLocalUnsafe(); 41*eb293b8fSAndroid Build Coastguard Worker 42*eb293b8fSAndroid Build Coastguard Worker static std::shared_ptr<Memory> CreateOfflineMemory(const uint8_t* data, uint64_t start, 43*eb293b8fSAndroid Build Coastguard Worker uint64_t end); 44*eb293b8fSAndroid Build Coastguard Worker static std::shared_ptr<Memory> CreateFileMemory(const std::string& path, uint64_t offset, 45*eb293b8fSAndroid Build Coastguard Worker uint64_t size = UINT64_MAX); 46*eb293b8fSAndroid Build Coastguard Worker AsMemoryCacheBase()47*eb293b8fSAndroid Build Coastguard Worker virtual MemoryCacheBase* AsMemoryCacheBase() { return nullptr; } 48*eb293b8fSAndroid Build Coastguard Worker 49*eb293b8fSAndroid Build Coastguard Worker virtual bool ReadString(uint64_t addr, std::string* dst, size_t max_read); 50*eb293b8fSAndroid Build Coastguard Worker Clear()51*eb293b8fSAndroid Build Coastguard Worker virtual void Clear() {} 52*eb293b8fSAndroid Build Coastguard Worker 53*eb293b8fSAndroid Build Coastguard Worker // Get pointer to directly access the data for buffers that support it. 54*eb293b8fSAndroid Build Coastguard Worker virtual uint8_t* GetPtr(size_t /*addr*/ = 0) { return nullptr; } 55*eb293b8fSAndroid Build Coastguard Worker 56*eb293b8fSAndroid Build Coastguard Worker virtual size_t Read(uint64_t addr, void* dst, size_t size) = 0; ReadTag(uint64_t)57*eb293b8fSAndroid Build Coastguard Worker virtual long ReadTag(uint64_t) { return -1; } 58*eb293b8fSAndroid Build Coastguard Worker 59*eb293b8fSAndroid Build Coastguard Worker bool ReadFully(uint64_t addr, void* dst, size_t size); 60*eb293b8fSAndroid Build Coastguard Worker Read32(uint64_t addr,uint32_t * dst)61*eb293b8fSAndroid Build Coastguard Worker inline bool Read32(uint64_t addr, uint32_t* dst) { 62*eb293b8fSAndroid Build Coastguard Worker return ReadFully(addr, dst, sizeof(uint32_t)); 63*eb293b8fSAndroid Build Coastguard Worker } 64*eb293b8fSAndroid Build Coastguard Worker Read64(uint64_t addr,uint64_t * dst)65*eb293b8fSAndroid Build Coastguard Worker inline bool Read64(uint64_t addr, uint64_t* dst) { 66*eb293b8fSAndroid Build Coastguard Worker return ReadFully(addr, dst, sizeof(uint64_t)); 67*eb293b8fSAndroid Build Coastguard Worker } 68*eb293b8fSAndroid Build Coastguard Worker }; 69*eb293b8fSAndroid Build Coastguard Worker 70*eb293b8fSAndroid Build Coastguard Worker } // namespace unwindstack 71