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