blob: c24a147363e560a346af7206abd97ec9351e300a [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#pragma once
#include <arch/x86/page_tables/page_tables.h>
#include "hw.h"
namespace intel_iommu {
class DeviceContext;
class IommuImpl;
// Implementation of second-level page tables used by VT-d
class SecondLevelPageTable final : public X86PageTableBase {
public:
SecondLevelPageTable(IommuImpl* iommu, DeviceContext* parent);
~SecondLevelPageTable();
zx_status_t Init(PageTableLevel top_level);
void Destroy();
private:
PageTableLevel top_level() final { return top_level_; }
bool allowed_flags(uint flags) final;
bool check_paddr(paddr_t paddr) final;
bool check_vaddr(vaddr_t vaddr) final;
bool supports_page_size(PageTableLevel level) final;
IntermediatePtFlags intermediate_flags() final;
PtFlags terminal_flags(PageTableLevel level, uint flags) final;
PtFlags split_flags(PageTableLevel level, PtFlags flags) final;
void TlbInvalidate(PendingTlbInvalidation* pending) final;
uint pt_flags_to_mmu_flags(PtFlags flags, PageTableLevel level) final;
bool needs_cache_flushes() final { return needs_flushes_; }
IommuImpl* iommu_;
DeviceContext* parent_;
PageTableLevel top_level_;
bool needs_flushes_;
bool supports_2mb_;
bool supports_1gb_;
vaddr_t valid_vaddr_mask_;
bool initialized_;
};
} // namespace intel_iommu