1 // Copyright 2018 The Fuchsia Authors
2 //
3 // Use of this source code is governed by a MIT-style
4 // license that can be found in the LICENSE file or at
5 // https://opensource.org/licenses/MIT
6
7 #include "vm/pinned_vm_object.h"
8
9 #include <ktl/move.h>
10 #include <trace.h>
11
12 #include "vm/vm.h"
13
14 #define LOCAL_TRACE 0
15
16 // static
Create(fbl::RefPtr<VmObject> vmo,size_t offset,size_t size,PinnedVmObject * out_pinned_vmo)17 zx_status_t PinnedVmObject::Create(fbl::RefPtr<VmObject> vmo, size_t offset, size_t size,
18 PinnedVmObject* out_pinned_vmo) {
19 DEBUG_ASSERT(vmo != nullptr);
20 DEBUG_ASSERT(IS_PAGE_ALIGNED(offset) && IS_PAGE_ALIGNED(size));
21 DEBUG_ASSERT(out_pinned_vmo != nullptr);
22
23 if (vmo->is_paged()) {
24 zx_status_t status = vmo->CommitRange(offset, size);
25 if (status != ZX_OK) {
26 LTRACEF("vmo->CommitRange failed: %d\n", status);
27 return status;
28 }
29 status = vmo->Pin(offset, size);
30 if (status != ZX_OK) {
31 LTRACEF("vmo->Pin failed: %d\n", status);
32 return status;
33 }
34 }
35
36 out_pinned_vmo->vmo_ = ktl::move(vmo);
37 out_pinned_vmo->offset_ = offset;
38 out_pinned_vmo->size_ = size;
39
40 return ZX_OK;
41 }
42
43 PinnedVmObject::PinnedVmObject() = default;
44
45 PinnedVmObject::PinnedVmObject(PinnedVmObject&&) = default;
46
47 PinnedVmObject& PinnedVmObject::operator=(PinnedVmObject&&) = default;
48
~PinnedVmObject()49 PinnedVmObject::~PinnedVmObject() {
50 if (vmo_ && vmo_->is_paged()) {
51 vmo_->Unpin(offset_, size_);
52 }
53 }
54