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