platform/pc: remove translations after Out_of_ram

Since page tables might need to be allocated during
insert_translation(), Out_of_ram or Out_of_caps exceptions might occur.
Entries that have already been added by insert_translation() must thus be
removed once one of those exceptions occurred.

Fixes #5254
This commit is contained in:
Johannes Schlatow 2024-06-24 18:07:00 +02:00 committed by Christian Helmuth
parent a83d7d515d
commit 09c40688e1

View File

@ -74,10 +74,23 @@ void Intel::Io_mmu::Domain<TABLE>::add_range(Range const & range,
Page_flags flags { RW, NO_EXEC, USER, NO_GLOBAL,
RAM, Genode::CACHED };
_translation_table.insert_translation(vaddr, paddr, size, flags,
_table_allocator,
!_intel_iommu.coherent_page_walk(),
_intel_iommu.supported_page_sizes());
auto cleanup_partial_translations = [&] () {
_translation_table.remove_translation(vaddr, size, _table_allocator,
!_intel_iommu.coherent_page_walk());
};
try {
_translation_table.insert_translation(vaddr, paddr, size, flags,
_table_allocator,
!_intel_iommu.coherent_page_walk(),
_intel_iommu.supported_page_sizes());
} catch (Out_of_ram) {
cleanup_partial_translations();
throw;
} catch (Out_of_caps) {
cleanup_partial_translations();
throw;
}
if (_skip_invalidation)
return;