diff options
Diffstat (limited to 'Kernel/Memory/PhysicalRegion.h')
-rw-r--r-- | Kernel/Memory/PhysicalRegion.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/Kernel/Memory/PhysicalRegion.h b/Kernel/Memory/PhysicalRegion.h new file mode 100644 index 0000000000..ba7b4957b9 --- /dev/null +++ b/Kernel/Memory/PhysicalRegion.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/OwnPtr.h> +#include <Kernel/Memory/PhysicalPage.h> +#include <Kernel/Memory/PhysicalZone.h> + +namespace Kernel { + +class PhysicalRegion { + AK_MAKE_ETERNAL; + AK_MAKE_NONCOPYABLE(PhysicalRegion); + AK_MAKE_NONMOVABLE(PhysicalRegion); + +public: + static OwnPtr<PhysicalRegion> try_create(PhysicalAddress lower, PhysicalAddress upper) + { + return adopt_own_if_nonnull(new PhysicalRegion { lower, upper }); + } + + ~PhysicalRegion(); + + void initialize_zones(); + + PhysicalAddress lower() const { return m_lower; } + PhysicalAddress upper() const { return m_upper; } + unsigned size() const { return m_pages; } + bool contains(PhysicalAddress paddr) const { return paddr >= m_lower && paddr < m_upper; } + + OwnPtr<PhysicalRegion> try_take_pages_from_beginning(unsigned); + + RefPtr<PhysicalPage> take_free_page(); + NonnullRefPtrVector<PhysicalPage> take_contiguous_free_pages(size_t count); + void return_page(PhysicalAddress); + +private: + PhysicalRegion(PhysicalAddress lower, PhysicalAddress upper); + + NonnullOwnPtrVector<PhysicalZone> m_zones; + + PhysicalZone::List m_usable_zones; + PhysicalZone::List m_full_zones; + + PhysicalAddress m_lower; + PhysicalAddress m_upper; + unsigned m_pages { 0 }; +}; + +} |