summaryrefslogtreecommitdiff
path: root/Kernel/VM/PageDirectory.h
blob: b4f7ee876e3391afc0f2a161b7675f7f7190cc2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#pragma once

#include <AK/HashMap.h>
#include <AK/RetainPtr.h>
#include <AK/Retainable.h>
#include <Kernel/VM/PhysicalPage.h>
#include <Kernel/VM/RangeAllocator.h>

class PageDirectory : public Retainable<PageDirectory> {
    friend class MemoryManager;

public:
    static Retained<PageDirectory> create_for_userspace(const RangeAllocator* parent_range_allocator = nullptr) { return adopt(*new PageDirectory(parent_range_allocator)); }
    static Retained<PageDirectory> create_at_fixed_address(PhysicalAddress paddr) { return adopt(*new PageDirectory(paddr)); }
    ~PageDirectory();

    dword cr3() const { return m_directory_page->paddr().get(); }
    dword* entries() { return reinterpret_cast<dword*>(cr3()); }

    void flush(VirtualAddress);

    RangeAllocator& range_allocator() { return m_range_allocator; }

private:
    explicit PageDirectory(const RangeAllocator* parent_range_allocator);
    explicit PageDirectory(PhysicalAddress);

    RangeAllocator m_range_allocator;
    RetainPtr<PhysicalPage> m_directory_page;
    HashMap<unsigned, RetainPtr<PhysicalPage>> m_physical_pages;
};