/* * Copyright (C) 2018-2021 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/source/helpers/basic_math.h" #include "shared/source/memory_manager/physical_address_allocator.h" #include #include #include #include #include #include namespace NEO { class GraphicsAllocation; typedef std::function PageWalker; template class PageTable { public: PageTable(PhysicalAddressAllocator *physicalAddressAllocator) : allocator(physicalAddressAllocator) { entries.fill(nullptr); }; virtual ~PageTable() { for (auto &e : entries) delete e; } virtual uintptr_t map(uintptr_t vm, size_t size, uint64_t entryBits, uint32_t memoryBank); virtual void pageWalk(uintptr_t vm, size_t size, size_t offset, uint64_t entryBits, PageWalker &pageWalker, uint32_t memoryBank); static const size_t pageSize = 1 << 12; static size_t getBits() { return T::getBits() + bits; } protected: std::array entries; PhysicalAddressAllocator *allocator = nullptr; }; template <> inline PageTable::~PageTable() { } class PTE : public PageTable { public: PTE(PhysicalAddressAllocator *physicalAddressAllocator) : PageTable(physicalAddressAllocator) {} uintptr_t map(uintptr_t vm, size_t size, uint64_t entryBits, uint32_t memoryBank) override; void pageWalk(uintptr_t vm, size_t size, size_t offset, uint64_t entryBits, PageWalker &pageWalker, uint32_t memoryBank) override; static const uint32_t level = 0; static const uint32_t bits = 9; }; class PDE : public PageTable { public: PDE(PhysicalAddressAllocator *physicalAddressAllocator) : PageTable(physicalAddressAllocator) { } }; class PDP : public PageTable { public: PDP(PhysicalAddressAllocator *physicalAddressAllocator) : PageTable(physicalAddressAllocator) { } }; class PML4 : public PageTable { public: PML4(PhysicalAddressAllocator *physicalAddressAllocator) : PageTable(physicalAddressAllocator) { } }; class PDPE : public PageTable { public: PDPE(PhysicalAddressAllocator *physicalAddressAllocator) : PageTable(physicalAddressAllocator) { } }; } // namespace NEO