blob: 919e345e38850eb9376560c6b087a9f8ac7b770d [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "garnet/bin/zxdb/client/memory_dump.h"
namespace zxdb {
MemoryDump::MemoryDump() {}
MemoryDump::MemoryDump(std::vector<debug_ipc::MemoryBlock>&& blocks)
: blocks_(std::move(blocks)) {}
MemoryDump::~MemoryDump() = default;
bool MemoryDump::AllValid() const {
if (blocks_.empty())
return false;
for (const auto& block : blocks_) {
if (!block.valid)
return false;
}
return true;
}
bool MemoryDump::GetByte(uint64_t address, uint8_t* byte) const {
*byte = 0;
// Address math needs to be careful to avoid overflow.
if (blocks_.empty() || address < blocks_.front().address ||
address > blocks_.back().address + (blocks_.back().size - 1)) {
return false;
}
// It's expected the set of blocks will be in the 1-3 block making a
// brute-force search for the
// block containing the address more efficient than a binary search.
for (const auto& block : blocks_) {
uint64_t last_addr =
block.address + (block.size - 1); // Watch out for overflow.
if (address >= block.address && address <= last_addr) {
if (!block.valid)
return false;
*byte = block.data[address - block.address];
return true;
}
}
return false;
}
} // namespace zxdb