mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:27:35 +00:00
Kernel: Add AnonymousVMObject constructor for a Vector of physical pages
This will be used later on by the AHCI code to create a Region that spans over scattered DMA pages.
This commit is contained in:
parent
e65fd83e23
commit
ecb169b61e
4 changed files with 22 additions and 0 deletions
|
@ -81,6 +81,11 @@ RefPtr<AnonymousVMObject> AnonymousVMObject::create_with_size(size_t size, Alloc
|
||||||
return adopt(*new AnonymousVMObject(size, commit));
|
return adopt(*new AnonymousVMObject(size, commit));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NonnullRefPtr<AnonymousVMObject> AnonymousVMObject::create_with_physical_pages(NonnullRefPtrVector<PhysicalPage> physical_pages)
|
||||||
|
{
|
||||||
|
return adopt(*new AnonymousVMObject(physical_pages));
|
||||||
|
}
|
||||||
|
|
||||||
NonnullRefPtr<AnonymousVMObject> AnonymousVMObject::create_with_physical_page(PhysicalPage& page)
|
NonnullRefPtr<AnonymousVMObject> AnonymousVMObject::create_with_physical_page(PhysicalPage& page)
|
||||||
{
|
{
|
||||||
return adopt(*new AnonymousVMObject(page));
|
return adopt(*new AnonymousVMObject(page));
|
||||||
|
@ -127,6 +132,15 @@ AnonymousVMObject::AnonymousVMObject(PhysicalPage& page)
|
||||||
physical_pages()[0] = page;
|
physical_pages()[0] = page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AnonymousVMObject::AnonymousVMObject(NonnullRefPtrVector<PhysicalPage> physical_pages)
|
||||||
|
: VMObject()
|
||||||
|
, m_volatile_ranges_cache({ 0, page_count() })
|
||||||
|
{
|
||||||
|
for (auto& page : physical_pages) {
|
||||||
|
m_physical_pages.append(page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
AnonymousVMObject::AnonymousVMObject(const AnonymousVMObject& other)
|
AnonymousVMObject::AnonymousVMObject(const AnonymousVMObject& other)
|
||||||
: VMObject(other)
|
: VMObject(other)
|
||||||
, m_volatile_ranges_cache({ 0, page_count() }) // do *not* clone this
|
, m_volatile_ranges_cache({ 0, page_count() }) // do *not* clone this
|
||||||
|
|
|
@ -43,6 +43,7 @@ public:
|
||||||
static RefPtr<AnonymousVMObject> create_with_size(size_t, AllocationStrategy);
|
static RefPtr<AnonymousVMObject> create_with_size(size_t, AllocationStrategy);
|
||||||
static RefPtr<AnonymousVMObject> create_for_physical_range(PhysicalAddress paddr, size_t size);
|
static RefPtr<AnonymousVMObject> create_for_physical_range(PhysicalAddress paddr, size_t size);
|
||||||
static NonnullRefPtr<AnonymousVMObject> create_with_physical_page(PhysicalPage& page);
|
static NonnullRefPtr<AnonymousVMObject> create_with_physical_page(PhysicalPage& page);
|
||||||
|
static NonnullRefPtr<AnonymousVMObject> create_with_physical_pages(NonnullRefPtrVector<PhysicalPage>);
|
||||||
virtual RefPtr<VMObject> clone() override;
|
virtual RefPtr<VMObject> clone() override;
|
||||||
|
|
||||||
RefPtr<PhysicalPage> allocate_committed_page(size_t);
|
RefPtr<PhysicalPage> allocate_committed_page(size_t);
|
||||||
|
@ -119,6 +120,7 @@ private:
|
||||||
explicit AnonymousVMObject(size_t, AllocationStrategy);
|
explicit AnonymousVMObject(size_t, AllocationStrategy);
|
||||||
explicit AnonymousVMObject(PhysicalAddress, size_t);
|
explicit AnonymousVMObject(PhysicalAddress, size_t);
|
||||||
explicit AnonymousVMObject(PhysicalPage&);
|
explicit AnonymousVMObject(PhysicalPage&);
|
||||||
|
explicit AnonymousVMObject(NonnullRefPtrVector<PhysicalPage>);
|
||||||
explicit AnonymousVMObject(const AnonymousVMObject&);
|
explicit AnonymousVMObject(const AnonymousVMObject&);
|
||||||
|
|
||||||
virtual const char* class_name() const override { return "AnonymousVMObject"; }
|
virtual const char* class_name() const override { return "AnonymousVMObject"; }
|
||||||
|
|
|
@ -35,6 +35,11 @@ VMObject::VMObject(const VMObject& other)
|
||||||
MM.register_vmobject(*this);
|
MM.register_vmobject(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VMObject::VMObject()
|
||||||
|
{
|
||||||
|
MM.register_vmobject(*this);
|
||||||
|
}
|
||||||
|
|
||||||
VMObject::VMObject(size_t size)
|
VMObject::VMObject(size_t size)
|
||||||
{
|
{
|
||||||
m_physical_pages.resize(ceil_div(size, static_cast<size_t>(PAGE_SIZE)));
|
m_physical_pages.resize(ceil_div(size, static_cast<size_t>(PAGE_SIZE)));
|
||||||
|
|
|
@ -88,6 +88,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
VMObject();
|
||||||
explicit VMObject(size_t);
|
explicit VMObject(size_t);
|
||||||
explicit VMObject(const VMObject&);
|
explicit VMObject(const VMObject&);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue