Kernel: Implement WriteCombining memory

This makes framebuffer much faster on real hardware
This commit is contained in:
2024-07-15 22:08:20 +03:00
parent 42c3fa24f0
commit 0578d41500
8 changed files with 64 additions and 20 deletions

View File

@@ -57,6 +57,13 @@ namespace CPUID
return edx & CPUID::EDX_PGE;
}
bool has_pat()
{
uint32_t ecx, edx;
get_features(ecx, edx);
return edx & CPUID::EDX_PAT;
}
const char* feature_string_ecx(uint32_t feat)
{
switch (feat)

View File

@@ -68,7 +68,8 @@ namespace Kernel
m_video_memory_paddr & PAGE_ADDR_MASK,
m_video_memory_vaddr,
video_memory_pages * PAGE_SIZE,
PageTable::Flags::ReadWrite | PageTable::Flags::Present
PageTable::Flags::ReadWrite | PageTable::Flags::Present,
PageTable::WriteCombining
);
m_video_buffer = TRY(VirtualRange::create_to_vaddr_range(

View File

@@ -26,7 +26,7 @@ namespace Kernel
vaddr_guard.disable();
paddr_guard.disable();
PageTable::kernel().map_range_at(paddr, vaddr, size, PageTable::Flags::CacheDisable | PageTable::Flags::ReadWrite | PageTable::Flags::Present);
PageTable::kernel().map_range_at(paddr, vaddr, size, PageTable::Flags::ReadWrite | PageTable::Flags::Present);
return BAN::UniqPtr<DMARegion>::adopt(region_ptr);
}

View File

@@ -652,7 +652,8 @@ namespace Kernel::PCI
m_vaddr = PageTable::kernel().reserve_free_contiguous_pages(needed_pages, KERNEL_OFFSET);
if (m_vaddr == 0)
return BAN::Error::from_errno(ENOMEM);
PageTable::kernel().map_range_at(m_paddr, m_vaddr, m_size, PageTable::Flags::CacheDisable | PageTable::Flags::ReadWrite | PageTable::Flags::Present);
PageTable::kernel().map_range_at(m_paddr, m_vaddr, m_size, PageTable::Flags::ReadWrite | PageTable::Flags::Present);
return {};
}