| // Copyright 2022 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 "lib/elfldltl/mapped-vmo-file.h" |
| |
| #include <lib/zx/vmar.h> |
| #include <zircon/assert.h> |
| #include <zircon/status.h> |
| |
| namespace elfldltl { |
| |
| zx::result<> MappedVmoFile::Init(zx::unowned_vmo vmo, zx::unowned_vmar vmar) { |
| uint64_t vmo_size; |
| zx_status_t status = vmo->get_size(&vmo_size); |
| if (status == ZX_OK) { |
| uint64_t content_size = vmo_size; |
| status = vmo->get_prop_content_size(&content_size); |
| if (status == ZX_OK) { |
| uintptr_t mapped; |
| status = vmar->map(ZX_VM_PERM_READ, 0, *vmo, 0, vmo_size, &mapped); |
| if (status == ZX_OK) { |
| set_image({reinterpret_cast<std::byte*>(mapped), content_size}); |
| vmar_ = vmar->borrow(); |
| mapped_size_ = vmo_size; |
| } |
| } |
| } |
| if (status != ZX_OK) { |
| return zx::error{status}; |
| } |
| return zx::ok(); |
| } |
| |
| zx::result<> MappedVmoFile::InitMutable(zx::unowned_vmo vmo, size_t size, uintptr_t base, |
| zx::unowned_vmar vmar) { |
| uintptr_t mapped; |
| zx_status_t status = vmar->map(ZX_VM_PERM_READ | ZX_VM_PERM_WRITE, 0, *vmo, 0, size, &mapped); |
| if (status == ZX_OK) { |
| set_image({reinterpret_cast<std::byte*>(mapped), size}); |
| set_base(base); |
| mapped_size_ = size; |
| vmar_ = vmar->borrow(); |
| } |
| return zx::make_result(status); |
| } |
| |
| MappedVmoFile::~MappedVmoFile() { |
| if (mapped_size_ != 0) { |
| [[maybe_unused]] zx_status_t status = |
| vmar_->unmap(reinterpret_cast<uintptr_t>(image().data()), mapped_size_); |
| ZX_DEBUG_ASSERT_MSG(status == ZX_OK, "unmap(%p, %#zx) -> %s", image().data(), mapped_size_, |
| zx_status_get_string(status)); |
| } |
| } |
| |
| } // namespace elfldltl |