mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 19:27:44 +00:00
Kernel: Implement Page Attribute Table (PAT) support and Write-Combine
This allows us to enable Write-Combine on e.g. framebuffers, significantly improving performance on bare metal. To keep things simple we right now only use one of up to three bits (bit 7 in the PTE), which maps to the PA4 entry in the PAT MSR, which we set to the Write-Combine mode on each CPU at boot time.
This commit is contained in:
parent
1abbe9b02c
commit
6e46e21c42
6 changed files with 40 additions and 0 deletions
|
@ -212,6 +212,8 @@ bool Region::map_individual_page_impl(size_t page_index)
|
|||
pte->set_writable(is_writable());
|
||||
if (Processor::current().has_feature(CPUFeature::NX))
|
||||
pte->set_execute_disabled(!is_executable());
|
||||
if (Processor::current().has_feature(CPUFeature::PAT))
|
||||
pte->set_pat(is_write_combine());
|
||||
pte->set_user_allowed(user_allowed);
|
||||
}
|
||||
return true;
|
||||
|
@ -311,6 +313,18 @@ void Region::remap()
|
|||
TODO();
|
||||
}
|
||||
|
||||
ErrorOr<void> Region::set_write_combine(bool enable)
|
||||
{
|
||||
if (enable && !Processor::current().has_feature(CPUFeature::PAT)) {
|
||||
dbgln("PAT is not supported, implement MTRR fallback if available");
|
||||
return Error::from_errno(ENOTSUP);
|
||||
}
|
||||
|
||||
m_write_combine = enable;
|
||||
remap();
|
||||
return {};
|
||||
}
|
||||
|
||||
void Region::clear_to_zero()
|
||||
{
|
||||
VERIFY(vmobject().is_anonymous());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue