Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f2e8bb5 authored by Christopher Ferris's avatar Christopher Ferris Committed by android-build-merger
Browse files

Merge "Add a MemoryOfflineBuffer object."

am: c692ff90

Change-Id: I2f73ae14c4da9cd61d2d970dfd4742420fd45884
parents 566cf781 c692ff90
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -149,13 +149,12 @@ bool UnwindStackOfflineMap::CreateProcessMemory(const backtrace_stackinfo_t& sta
  }

  // Create the process memory from the stack data.
  uint64_t size = stack.end - stack.start;
  unwindstack::MemoryBuffer* memory = new unwindstack::MemoryBuffer;
  memory->Resize(size);
  memcpy(memory->GetPtr(0), stack.data, size);
  std::shared_ptr<unwindstack::Memory> shared_memory(memory);

  process_memory_.reset(new unwindstack::MemoryRange(shared_memory, 0, size, stack.start));
  if (memory_ == nullptr) {
    memory_ = new unwindstack::MemoryOfflineBuffer(stack.data, stack.start, stack.end);
    process_memory_.reset(memory_);
  } else {
    memory_->Reset(stack.data, stack.start, stack.end);
  }
  return true;
}

+3 −0
Original line number Diff line number Diff line
@@ -79,6 +79,9 @@ class UnwindStackOfflineMap : public UnwindStackMap {
  bool Build(const std::vector<backtrace_map_t>& maps);

  bool CreateProcessMemory(const backtrace_stackinfo_t& stack);

 private:
  unwindstack::MemoryOfflineBuffer* memory_ = nullptr;
};

#endif  // _LIBBACKTRACE_UNWINDSTACK_MAP_H
+1 −0
Original line number Diff line number Diff line
@@ -155,6 +155,7 @@ cc_test {
        "tests/MemoryFake.cpp",
        "tests/MemoryFileTest.cpp",
        "tests/MemoryLocalTest.cpp",
        "tests/MemoryOfflineBufferTest.cpp",
        "tests/MemoryOfflineTest.cpp",
        "tests/MemoryRangeTest.cpp",
        "tests/MemoryRemoteTest.cpp",
+19 −0
Original line number Diff line number Diff line
@@ -345,6 +345,25 @@ size_t MemoryOffline::Read(uint64_t addr, void* dst, size_t size) {
  return memory_->Read(addr, dst, size);
}

MemoryOfflineBuffer::MemoryOfflineBuffer(const uint8_t* data, uint64_t start, uint64_t end)
    : data_(data), start_(start), end_(end) {}

void MemoryOfflineBuffer::Reset(const uint8_t* data, uint64_t start, uint64_t end) {
  data_ = data;
  start_ = start;
  end_ = end;
}

size_t MemoryOfflineBuffer::Read(uint64_t addr, void* dst, size_t size) {
  if (addr < start_ || addr >= end_) {
    return 0;
  }

  size_t read_length = std::min(size, static_cast<size_t>(end_ - addr));
  memcpy(dst, &data_[addr - start_], read_length);
  return read_length;
}

MemoryOfflineParts::~MemoryOfflineParts() {
  for (auto memory : memories_) {
    delete memory;
+15 −0
Original line number Diff line number Diff line
@@ -151,6 +151,21 @@ class MemoryOffline : public Memory {
  std::unique_ptr<MemoryRange> memory_;
};

class MemoryOfflineBuffer : public Memory {
 public:
  MemoryOfflineBuffer(const uint8_t* data, uint64_t start, uint64_t end);
  virtual ~MemoryOfflineBuffer() = default;

  void Reset(const uint8_t* data, uint64_t start, uint64_t end);

  size_t Read(uint64_t addr, void* dst, size_t size) override;

 private:
  const uint8_t* data_;
  uint64_t start_;
  uint64_t end_;
};

class MemoryOfflineParts : public Memory {
 public:
  MemoryOfflineParts() = default;
Loading