diff options
Diffstat (limited to 'Kernel/Arch/PageDirectory.h')
-rw-r--r-- | Kernel/Arch/PageDirectory.h | 154 |
1 files changed, 8 insertions, 146 deletions
diff --git a/Kernel/Arch/PageDirectory.h b/Kernel/Arch/PageDirectory.h index 1fddb0ad4f..dbc8bc6c8b 100644 --- a/Kernel/Arch/PageDirectory.h +++ b/Kernel/Arch/PageDirectory.h @@ -1,156 +1,18 @@ /* * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2022, Timon Kruiper <timonkruiper@gmail.com> * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once -#include <AK/Badge.h> -#include <AK/Types.h> -#include <Kernel/Forward.h> -#include <Kernel/PhysicalAddress.h> - #include <AK/Platform.h> -namespace Kernel { - -class PageDirectoryEntry { -public: - PhysicalPtr page_table_base() const { return PhysicalAddress::physical_page_base(m_raw); } - void set_page_table_base(u32 value) - { - m_raw &= 0x8000000000000fffULL; - m_raw |= PhysicalAddress::physical_page_base(value); - } - - bool is_null() const { return m_raw == 0; } - void clear() { m_raw = 0; } - - u64 raw() const { return m_raw; } - void copy_from(Badge<Memory::PageDirectory>, PageDirectoryEntry const& other) { m_raw = other.m_raw; } - - enum Flags { - Present = 1 << 0, - ReadWrite = 1 << 1, - UserSupervisor = 1 << 2, - WriteThrough = 1 << 3, - CacheDisabled = 1 << 4, - Huge = 1 << 7, - Global = 1 << 8, - NoExecute = 0x8000000000000000ULL, - }; - - bool is_present() const { return (raw() & Present) == Present; } - void set_present(bool b) { set_bit(Present, b); } - - bool is_user_allowed() const { return (raw() & UserSupervisor) == UserSupervisor; } - void set_user_allowed(bool b) { set_bit(UserSupervisor, b); } - - bool is_huge() const { return (raw() & Huge) == Huge; } - void set_huge(bool b) { set_bit(Huge, b); } - - bool is_writable() const { return (raw() & ReadWrite) == ReadWrite; } - void set_writable(bool b) { set_bit(ReadWrite, b); } - - bool is_write_through() const { return (raw() & WriteThrough) == WriteThrough; } - void set_write_through(bool b) { set_bit(WriteThrough, b); } - - bool is_cache_disabled() const { return (raw() & CacheDisabled) == CacheDisabled; } - void set_cache_disabled(bool b) { set_bit(CacheDisabled, b); } - - bool is_global() const { return (raw() & Global) == Global; } - void set_global(bool b) { set_bit(Global, b); } - - bool is_execute_disabled() const { return (raw() & NoExecute) == NoExecute; } - void set_execute_disabled(bool b) { set_bit(NoExecute, b); } - -private: - void set_bit(u64 bit, bool value) - { - if (value) - m_raw |= bit; - else - m_raw &= ~bit; - } - - u64 m_raw; -}; - -class PageTableEntry { -public: - PhysicalPtr physical_page_base() const { return PhysicalAddress::physical_page_base(m_raw); } - void set_physical_page_base(PhysicalPtr value) - { - // FIXME: IS THIS PLATFORM SPECIFIC? - m_raw &= 0x8000000000000fffULL; - m_raw |= PhysicalAddress::physical_page_base(value); - } - - u64 raw() const { return m_raw; } - - enum Flags { - Present = 1 << 0, - ReadWrite = 1 << 1, - UserSupervisor = 1 << 2, - WriteThrough = 1 << 3, - CacheDisabled = 1 << 4, - PAT = 1 << 7, - Global = 1 << 8, - NoExecute = 0x8000000000000000ULL, - }; - - bool is_present() const { return (raw() & Present) == Present; } - void set_present(bool b) { set_bit(Present, b); } - - bool is_user_allowed() const { return (raw() & UserSupervisor) == UserSupervisor; } - void set_user_allowed(bool b) { set_bit(UserSupervisor, b); } - - bool is_writable() const { return (raw() & ReadWrite) == ReadWrite; } - void set_writable(bool b) { set_bit(ReadWrite, b); } - - bool is_write_through() const { return (raw() & WriteThrough) == WriteThrough; } - void set_write_through(bool b) { set_bit(WriteThrough, b); } - - bool is_cache_disabled() const { return (raw() & CacheDisabled) == CacheDisabled; } - void set_cache_disabled(bool b) { set_bit(CacheDisabled, b); } - - bool is_global() const { return (raw() & Global) == Global; } - void set_global(bool b) { set_bit(Global, b); } - - bool is_execute_disabled() const { return (raw() & NoExecute) == NoExecute; } - void set_execute_disabled(bool b) { set_bit(NoExecute, b); } - - bool is_pat() const { return (raw() & PAT) == PAT; } - void set_pat(bool b) { set_bit(PAT, b); } - - bool is_null() const { return m_raw == 0; } - void clear() { m_raw = 0; } - -private: - void set_bit(u64 bit, bool value) - { - if (value) - m_raw |= bit; - else - m_raw &= ~bit; - } - - u64 m_raw; -}; - -static_assert(AssertSize<PageDirectoryEntry, 8>()); -static_assert(AssertSize<PageTableEntry, 8>()); - -class PageDirectoryPointerTable { -public: - PageDirectoryEntry* directory(size_t index) - { - VERIFY(index <= (NumericLimits<size_t>::max() << 30)); - return (PageDirectoryEntry*)(PhysicalAddress::physical_page_base(raw[index])); - } - - u64 raw[512]; -}; - -} +#if ARCH(X86_64) || ARCH(I386) +# include <Kernel/Arch/x86/PageDirectory.h> +#elif ARCH(AARCH64) +# include <Kernel/Arch/aarch64/PageDirectory.h> +#else +# error "Unknown architecture" +#endif |