blob: eceee010eb9d145373f34a60c5116d896649f66f [file] [log] [blame]
// Copyright 2016 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 "memory_process.h"
#include <zircon/syscalls.h>
#include <cinttypes>
#include "lib/fxl/logging.h"
#include "lib/fxl/strings/string_printf.h"
#include "garnet/lib/debugger_utils/util.h"
#include "process.h"
namespace inferior_control {
ProcessMemory::ProcessMemory(Process* process) : process_(process) {}
bool ProcessMemory::Read(uintptr_t address, void* out_buffer,
size_t length) const {
FXL_DCHECK(out_buffer);
zx_handle_t handle = process_->handle();
FXL_DCHECK(handle != ZX_HANDLE_INVALID);
size_t bytes_read;
zx_status_t status =
zx_process_read_memory(handle, address, out_buffer, length, &bytes_read);
if (status != ZX_OK) {
FXL_LOG(ERROR) << fxl::StringPrintf(
"Failed to read memory at addr: %" PRIxPTR ": ",
address)
<< debugger_utils::ZxErrorString(status);
return false;
}
// TODO(dje): The kernel currently doesn't support short reads,
// despite claims to the contrary.
FXL_DCHECK(length == bytes_read);
// TODO(dje): Dump the bytes read at sufficiently high logging level (>2).
return true;
}
bool ProcessMemory::Write(uintptr_t address, const void* buffer,
size_t length) const {
FXL_DCHECK(buffer);
// We could be trying to remove a breakpoint after the process has exited.
// So if the process is gone just return.
zx_handle_t handle = process_->handle();
if (handle == ZX_HANDLE_INVALID) {
FXL_VLOG(2) << "No process memory to write to";
return false;
}
if (length == 0) {
FXL_VLOG(2) << "No data to write";
return true;
}
size_t bytes_written;
zx_status_t status =
zx_process_write_memory(handle, address, buffer, length, &bytes_written);
if (status != ZX_OK) {
FXL_LOG(ERROR) << fxl::StringPrintf(
"Failed to write memory at addr: %" PRIxPTR ": ",
address)
<< debugger_utils::ZxErrorString(status);
return false;
}
// TODO(dje): The kernel currently doesn't support short writes,
// despite claims to the contrary.
FXL_DCHECK(length == bytes_written);
// TODO(dje): Dump the bytes written at sufficiently high logging level (>2).
return true;
}
} // namespace inferior_control