1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 21:27:35 +00:00

Kernel: Don't treat read faults like CoW exceptions

I'm not sure why we would have a non-readable CoW region, but I suppose
we could, so let's not Copy-on-Read in those cases.
This commit is contained in:
Andreas Kling 2019-08-06 09:39:39 +02:00
parent af4cf01560
commit 945f8eb22a
2 changed files with 9 additions and 3 deletions

View file

@ -304,14 +304,20 @@ public:
} }
enum class Type { enum class Type {
PageNotPresent, PageNotPresent = PageFaultFlags::NotPresent,
ProtectionViolation, ProtectionViolation = PageFaultFlags::ProtectionViolation,
};
enum class Access {
Read = PageFaultFlags::Read,
Write = PageFaultFlags::Write,
}; };
VirtualAddress vaddr() const { return m_vaddr; } VirtualAddress vaddr() const { return m_vaddr; }
u16 code() const { return m_code; } u16 code() const { return m_code; }
Type type() const { return (Type)(m_code & 1); } Type type() const { return (Type)(m_code & 1); }
Access access() const { return (Access)(m_code & 2); }
bool is_not_present() const { return (m_code & 1) == PageFaultFlags::NotPresent; } bool is_not_present() const { return (m_code & 1) == PageFaultFlags::NotPresent; }
bool is_protection_violation() const { return (m_code & 1) == PageFaultFlags::ProtectionViolation; } bool is_protection_violation() const { return (m_code & 1) == PageFaultFlags::ProtectionViolation; }

View file

@ -437,7 +437,7 @@ PageFaultResponse MemoryManager::handle_page_fault(const PageFault& fault)
return PageFaultResponse::Continue; return PageFaultResponse::Continue;
} }
ASSERT(fault.type() == PageFault::Type::ProtectionViolation); ASSERT(fault.type() == PageFault::Type::ProtectionViolation);
if (region->should_cow(page_index_in_region)) { if (fault.access() == PageFault::Access::Write && region->should_cow(page_index_in_region)) {
#ifdef PAGE_FAULT_DEBUG #ifdef PAGE_FAULT_DEBUG
dbgprintf("PV(cow) fault in Region{%p}[%u]\n", region, page_index_in_region); dbgprintf("PV(cow) fault in Region{%p}[%u]\n", region, page_index_in_region);
#endif #endif