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 #pragma once
8 
9 #include <err.h>
10 #include <fbl/macros.h>
11 #include <stdint.h>
12 #include <vm/pmm.h>
13 
14 namespace intel_iommu {
15 
16 static constexpr paddr_t kInvalidPaddr = UINT64_MAX;
17 
18 // RAII object for managing the lifetime of the memory that backs hardware
19 // datastructures.
20 class IommuPage {
21 public:
IommuPage()22     IommuPage()
23         : page_(nullptr), virt_(0) {}
24     ~IommuPage();
25 
IommuPage(IommuPage && p)26     IommuPage(IommuPage&& p)
27         : page_(p.page_), virt_(p.virt_) {
28         p.page_ = nullptr;
29         p.virt_ = 0;
30     }
31     IommuPage& operator=(IommuPage&& p) {
32         page_ = p.page_;
33         virt_ = p.virt_;
34         p.page_ = nullptr;
35         p.virt_ = 0;
36         return *this;
37     }
38 
39     static zx_status_t AllocatePage(IommuPage* out);
40 
vaddr()41     uintptr_t vaddr() const {
42         return virt_;
43     }
paddr()44     paddr_t paddr() const {
45         return likely(page_) ? page_->paddr() : kInvalidPaddr;
46     }
47 
48 private:
49     IommuPage(vm_page_t* page, uintptr_t virt);
50     DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(IommuPage);
51 
52     vm_page_t* page_;
53     uintptr_t virt_;
54 };
55 
56 } // namespace intel_iommu
57