blob: 2cece079d9a03664a8462c990c9d3c94e01f6adf [file] [log] [blame]
// 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