• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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 _LIBUNWINDSTACK_MEMORY_H
18 #define _LIBUNWINDSTACK_MEMORY_H
19 
20 #include <stdint.h>
21 #include <sys/types.h>
22 #include <unistd.h>
23 
24 #include <string>
25 #include <vector>
26 
27 namespace unwindstack {
28 
29 class Memory {
30  public:
31   Memory() = default;
32   virtual ~Memory() = default;
33 
34   virtual bool ReadString(uint64_t addr, std::string* string, uint64_t max_read = UINT64_MAX);
35 
36   virtual bool Read(uint64_t addr, void* dst, size_t size) = 0;
37 
ReadField(uint64_t addr,void * start,void * field,size_t size)38   inline bool ReadField(uint64_t addr, void* start, void* field, size_t size) {
39     if (reinterpret_cast<uintptr_t>(field) < reinterpret_cast<uintptr_t>(start)) {
40       return false;
41     }
42     uint64_t offset = reinterpret_cast<uintptr_t>(field) - reinterpret_cast<uintptr_t>(start);
43     if (__builtin_add_overflow(addr, offset, &offset)) {
44       return false;
45     }
46     // The read will check if offset + size overflows.
47     return Read(offset, field, size);
48   }
49 
Read32(uint64_t addr,uint32_t * dst)50   inline bool Read32(uint64_t addr, uint32_t* dst) { return Read(addr, dst, sizeof(uint32_t)); }
51 
Read64(uint64_t addr,uint64_t * dst)52   inline bool Read64(uint64_t addr, uint64_t* dst) { return Read(addr, dst, sizeof(uint64_t)); }
53 };
54 
55 class MemoryBuffer : public Memory {
56  public:
57   MemoryBuffer() = default;
58   virtual ~MemoryBuffer() = default;
59 
60   bool Read(uint64_t addr, void* dst, size_t size) override;
61 
62   uint8_t* GetPtr(size_t offset);
63 
Resize(size_t size)64   void Resize(size_t size) { raw_.resize(size); }
65 
Size()66   uint64_t Size() { return raw_.size(); }
67 
68  private:
69   std::vector<uint8_t> raw_;
70 };
71 
72 class MemoryFileAtOffset : public Memory {
73  public:
74   MemoryFileAtOffset() = default;
75   virtual ~MemoryFileAtOffset();
76 
77   bool Init(const std::string& file, uint64_t offset, uint64_t size = UINT64_MAX);
78 
79   bool Read(uint64_t addr, void* dst, size_t size) override;
80 
81   void Clear();
82 
83  protected:
84   size_t size_ = 0;
85   size_t offset_ = 0;
86   uint8_t* data_ = nullptr;
87 };
88 
89 class MemoryOffline : public MemoryFileAtOffset {
90  public:
91   MemoryOffline() = default;
92   virtual ~MemoryOffline() = default;
93 
94   bool Init(const std::string& file, uint64_t offset);
95 
96   bool Read(uint64_t addr, void* dst, size_t size) override;
97 
98  private:
99   uint64_t start_;
100 };
101 
102 class MemoryRemote : public Memory {
103  public:
MemoryRemote(pid_t pid)104   MemoryRemote(pid_t pid) : pid_(pid) {}
105   virtual ~MemoryRemote() = default;
106 
107   bool Read(uint64_t addr, void* dst, size_t size) override;
108 
pid()109   pid_t pid() { return pid_; }
110 
111  protected:
112   virtual bool PtraceRead(uint64_t addr, long* value);
113 
114  private:
115   pid_t pid_;
116 };
117 
118 class MemoryLocal : public Memory {
119  public:
120   MemoryLocal() = default;
121   virtual ~MemoryLocal() = default;
122 
123   bool Read(uint64_t addr, void* dst, size_t size) override;
124 };
125 
126 class MemoryRange : public Memory {
127  public:
128   MemoryRange(Memory* memory, uint64_t begin, uint64_t end);
~MemoryRange()129   virtual ~MemoryRange() { delete memory_; }
130 
131   bool Read(uint64_t addr, void* dst, size_t size) override;
132 
133  private:
134   Memory* memory_;
135   uint64_t begin_;
136   uint64_t length_;
137 };
138 
139 }  // namespace unwindstack
140 
141 #endif  // _LIBUNWINDSTACK_MEMORY_H
142