| // 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_counted.h> |
| #include <fbl/ref_ptr.h> |
| #include <lib/zx/vmar.h> |
| |
| namespace fzl { |
| |
| // VmarManager |
| // |
| // A small utility class which manages the lifecycle of a VMAR intended to be |
| // shared among a collection of users. VmarManager will handle simple tasks such as |
| // automatically destroying the VMAR at end-of-life in addition to releasing the |
| // handle. |
| // |
| // Currently, the primary use case for a VmarManager is to be used to create a |
| // COMPACT sub-vmar in order to hold a number of VMO mappings while minimizing |
| // page table fragmentation.. |
| // |
| // See fzl::VmoMapper. |
| class VmarManager : public fbl::RefCounted<VmarManager> { |
| public: |
| // Create a new VmarManager (creating the underlying VMAR object in the |
| // process) |
| // |
| // size : the size of the VMAR region to create. |
| // parent : the parent of this VMAR, or nullptr to use the root VMAR. |
| // flags : creation flags to pass to vmar_allocate |
| static fbl::RefPtr<VmarManager> Create(size_t size, |
| fbl::RefPtr<VmarManager> parent = nullptr, |
| zx_vm_option_t options = ZX_VM_COMPACT | |
| ZX_VM_CAN_MAP_READ | |
| ZX_VM_CAN_MAP_WRITE); |
| |
| const zx::vmar& vmar() const { return vmar_; } |
| void* start() const { return start_; } |
| uint64_t size() const { return size_; } |
| const fbl::RefPtr<VmarManager>& parent() const { return parent_; } |
| |
| private: |
| friend class fbl::RefPtr<VmarManager>; |
| |
| VmarManager() = default; |
| ~VmarManager() { |
| if (vmar_.is_valid()) { |
| vmar_.destroy(); |
| } |
| } |
| |
| // suppress default constructors |
| DISALLOW_COPY_ASSIGN_AND_MOVE(VmarManager); |
| |
| zx::vmar vmar_; |
| void* start_ = nullptr; |
| uint64_t size_ = 0; |
| fbl::RefPtr<VmarManager> parent_; |
| }; |
| |
| } // namespace fzl |