Serenity Operating System
at master 43 lines 1.3 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/Heap/kmalloc.h> 8#include <Kernel/Memory/MemoryManager.h> 9#include <Kernel/Memory/PhysicalPage.h> 10 11namespace Kernel::Memory { 12 13NonnullRefPtr<PhysicalPage> PhysicalPage::create(PhysicalAddress paddr, MayReturnToFreeList may_return_to_freelist) 14{ 15 auto& physical_page_entry = MM.get_physical_page_entry(paddr); 16 return adopt_ref(*new (&physical_page_entry.allocated.physical_page) PhysicalPage(may_return_to_freelist)); 17} 18 19PhysicalPage::PhysicalPage(MayReturnToFreeList may_return_to_freelist) 20 : m_may_return_to_freelist(may_return_to_freelist) 21{ 22} 23 24PhysicalAddress PhysicalPage::paddr() const 25{ 26 return MM.get_physical_address(*this); 27} 28 29void PhysicalPage::free_this() const 30{ 31 auto paddr = MM.get_physical_address(*this); 32 if (m_may_return_to_freelist == MayReturnToFreeList::Yes) { 33 auto& this_as_freelist_entry = MM.get_physical_page_entry(paddr).freelist; 34 this->~PhysicalPage(); // delete in place 35 this_as_freelist_entry.next_index = -1; 36 this_as_freelist_entry.prev_index = -1; 37 MM.deallocate_physical_page(paddr); 38 } else { 39 this->~PhysicalPage(); // delete in place 40 } 41} 42 43}