| // 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/unique_ptr.h> |
| #include <lib/fzl/owned-vmo-mapper.h> |
| #include <lib/fzl/vmar-manager.h> |
| #include <lib/fzl/vmo-mapper.h> |
| #include <lib/zx/vmo.h> |
| |
| namespace fzl { |
| |
| // ResizeableVmoMapper is an extension of the basic VmoMapper utility which |
| // allows resizing of the mapping after it has been created. |
| // |
| class ResizeableVmoMapper : protected OwnedVmoMapper { |
| public: |
| static fbl::unique_ptr<ResizeableVmoMapper> Create( |
| 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); |
| |
| ResizeableVmoMapper() = default; |
| ~ResizeableVmoMapper() { Reset(); } |
| DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(ResizeableVmoMapper); |
| |
| // Move support |
| ResizeableVmoMapper(ResizeableVmoMapper&& other) { |
| MoveFromOther(&other); |
| } |
| |
| ResizeableVmoMapper& operator=(ResizeableVmoMapper&& 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); |
| |
| // 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); |
| |
| // Attempts to reduce both the VMO size and VMAR mapping |
| // from |size_| to |size|. |
| // |
| // Attempting to shrink the mapping to a size of zero or |
| // requesting a "shrink" that would increase the mapping size |
| // returns an error. |
| // |
| // If |size| is not page aligned, shrinking will fail. |
| zx_status_t Shrink(size_t size); |
| |
| // Attempts to increase both VMO size and VMAR mapping: |
| // From [addr_, addr_ + size_] |
| // To [addr_, addr_ + size] |
| // |
| // Attempting to grow the mapping to a size smaller than the |
| // current size will return an error. |
| // |
| // On failure, the Mapping will be safe to use, but will remain at its original size. |
| // |
| // Unlike shrinking, it's permissible to grow to a non-page-aligned |size|. |
| zx_status_t Grow(size_t size); |
| |
| using VmoMapper::start; |
| using VmoMapper::size; |
| using VmoMapper::manager; |
| using OwnedVmoMapper::Reset; |
| using OwnedVmoMapper::Release; |
| using OwnedVmoMapper::vmo; |
| |
| private: |
| void MoveFromOther(ResizeableVmoMapper* other) { |
| map_options_ = other->map_options_; |
| OwnedVmoMapper::MoveFromOther(other); |
| } |
| |
| zx_vm_option_t map_options_ = 0; |
| }; |
| |
| } // namespace fzl |