| // Copyright 2019 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 "src/developer/kcounter_inspect/vmo_file_with_update.h" |
| |
| VmoFileWithUpdate::VmoFileWithUpdate(zx::vmo vmo, size_t offset, size_t length, |
| fuchsia::kernel::CounterSyncPtr* kcounter) |
| : offset_(offset), length_(length), vmo_(std::move(vmo)), kcounter_(kcounter) {} |
| |
| VmoFileWithUpdate::~VmoFileWithUpdate() = default; |
| |
| zx_status_t VmoFileWithUpdate::ReadAt(uint64_t length, uint64_t offset, |
| std::vector<uint8_t>* out_data) { |
| if (length == 0u || offset >= length_) { |
| return ZX_OK; |
| } |
| |
| zx_status_t status = Update(); |
| if (status != ZX_OK) { |
| return status; |
| } |
| |
| size_t remaining_length = length_ - offset; |
| if (length > remaining_length) { |
| length = remaining_length; |
| } |
| |
| out_data->resize(length); |
| return vmo_.read(out_data->data(), offset_ + offset, length); |
| } |
| |
| void VmoFileWithUpdate::Describe(fuchsia::io::NodeInfo* out_info) { |
| if (Update() != ZX_OK) { |
| return; |
| } |
| zx::vmo temp_vmo; |
| if (vmo_.duplicate(ZX_RIGHTS_BASIC | ZX_RIGHT_READ, &temp_vmo) != ZX_OK) { |
| return; |
| } |
| out_info->vmofile() = |
| fuchsia::io::Vmofile{.vmo = std::move(temp_vmo), .offset = offset_, .length = length_}; |
| } |
| |
| zx_status_t VmoFileWithUpdate::GetAttr(fuchsia::io::NodeAttributes* out_attributes) const { |
| out_attributes->mode = fuchsia::io::MODE_TYPE_FILE | fuchsia::io::OPEN_RIGHT_READABLE; |
| out_attributes->id = fuchsia::io::INO_UNKNOWN; |
| out_attributes->content_size = length_; |
| out_attributes->storage_size = length_; |
| out_attributes->link_count = 1; |
| out_attributes->creation_time = 0; |
| out_attributes->modification_time = 0; |
| return ZX_OK; |
| } |
| |
| zx_status_t VmoFileWithUpdate::Update() { |
| zx_status_t status; |
| zx_status_t fidl_status = (*kcounter_)->UpdateInspectVmo(&status); |
| if (fidl_status != ZX_OK) { |
| return fidl_status; |
| } |
| if (status != ZX_OK) { |
| return status; |
| } |
| return ZX_OK; |
| } |