| // 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. |
| |
| #pragma once |
| |
| #include <fbl/macros.h> |
| #include <fbl/ref_ptr.h> |
| #include <fbl/ref_counted.h> |
| #include <lib/fzl/vmar-manager.h> |
| #include <lib/fzl/vmo-mapper.h> |
| #include <lib/zx/vmo.h> |
| |
| #include <utility> |
| |
| namespace fzl { |
| |
| // OwnedVmoWrapper is a convenience wrapper around the underlying VmoMapper |
| // which also takes ownership of the underlying VMO. |
| class OwnedVmoMapper : protected VmoMapper { |
| public: |
| OwnedVmoMapper() = default; |
| ~OwnedVmoMapper() { Reset(); } |
| DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(OwnedVmoMapper); |
| |
| // Move support |
| OwnedVmoMapper(OwnedVmoMapper&& other) { |
| MoveFromOther(&other); |
| } |
| |
| OwnedVmoMapper& operator=(OwnedVmoMapper&& other) { |
| Reset(); |
| MoveFromOther(&other); |
| return *this; |
| } |
| |
| // See |VmoMapper::CreateAndMap|. |
| zx_status_t CreateAndMap(uint64_t size, |
| const char* name, |
| zx_vm_option_t map_options = ZX_VM_PERM_READ | ZX_VM_PERM_WRITE, |
| fbl::RefPtr<VmarManager> vmar_manager = nullptr, |
| uint32_t cache_policy = 0, |
| uint32_t vmo_options = 0); |
| |
| // See |VmoMapper::Map|. |
| zx_status_t Map(zx::vmo vmo, |
| uint64_t size = 0, |
| zx_vm_option_t map_options = ZX_VM_PERM_READ | ZX_VM_PERM_WRITE, |
| fbl::RefPtr<VmarManager> vmar_manager = nullptr); |
| |
| // Reset the VMO from whichever VMAR it was mapped into, then release. |
| void Reset() { |
| vmo_.reset(); |
| VmoMapper::Unmap(); |
| } |
| |
| zx::vmo Release() { |
| VmoMapper::Unmap(); |
| return std::move(vmo_); |
| } |
| |
| const zx::vmo& vmo() const { return vmo_; } |
| |
| using VmoMapper::start; |
| using VmoMapper::size; |
| using VmoMapper::manager; |
| |
| protected: |
| void MoveFromOther(OwnedVmoMapper* other) { |
| vmo_ = std::move(other->vmo_); |
| VmoMapper::MoveFromOther(other); |
| } |
| |
| private: |
| zx::vmo vmo_; |
| }; |
| |
| } // namespace fzl |