| // Copyright 2017 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 <limits.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| |
| #include <zircon/types.h> |
| #include <fbl/algorithm.h> |
| #include <fbl/unique_ptr.h> |
| |
| class MappedVmo { |
| public: |
| DISALLOW_COPY_ASSIGN_AND_MOVE(MappedVmo); |
| virtual ~MappedVmo(); |
| |
| static zx_status_t Create(size_t size, const char* name, fbl::unique_ptr<MappedVmo>* out); |
| |
| // Attempts to reduce both the VMO size and VMAR mapping: |
| // From [addr_, addr_ + len_] |
| // To [addr_ + off, addr_ + off + len] |
| // |
| // Attempting to shrink the mapping to a length of zero or |
| // requesting a "shrink" that would increase the mapping size |
| // returns an error. |
| // |
| // On failure, the Mapping may be partially removed, and should not be used. |
| zx_status_t Shrink(size_t off, size_t len); |
| |
| // Attempts to increase both VMO size and VMAR mapping: |
| // From [addr_, addr_ + len_] |
| // To [addr_, addr_ + len] |
| // |
| // Attempting to grow the mapping to a length 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. |
| zx_status_t Grow(size_t len); |
| |
| zx_handle_t GetVmo(void) const; |
| size_t GetSize(void) const; |
| void* GetData(void) const; |
| |
| private: |
| MappedVmo(zx_handle_t vmo, uintptr_t addr, size_t len); |
| |
| zx_handle_t vmo_; |
| uintptr_t addr_; |
| size_t len_; |
| }; |