blob: 694e686ff21b055a568f3268d63f8dbc294f89fe [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/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