From b349dd9c0a3fec42473a9cd321d955cf8b9c9774 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 30 May 2023 16:44:03 +0200 Subject: [PATCH] sel4: convert io memory on demand instead all during boot. On x86 and qemu this takes quite a while until the system is booted. Fixes #4913 --- .../base-fiasco/src/core/io_mem_session_support.cc | 2 +- repos/base-foc/src/core/io_mem_session_support.cc | 2 +- repos/base-hw/src/core/io_mem_session_support.cc | 2 +- repos/base-nova/src/core/io_mem_session_support.cc | 2 +- repos/base-okl4/src/core/io_mem_session_support.cc | 2 +- .../src/core/io_mem_session_support.cc | 2 +- .../src/core/include/initial_untyped_pool.h | 6 ------ repos/base-sel4/src/core/io_mem_session_support.cc | 14 ++++++++++++-- .../src/core/include/io_mem_session_component.h | 2 +- repos/base/src/core/io_mem_session_component.cc | 2 +- 10 files changed, 20 insertions(+), 16 deletions(-) diff --git a/repos/base-fiasco/src/core/io_mem_session_support.cc b/repos/base-fiasco/src/core/io_mem_session_support.cc index 79738876a4..55bcfab142 100644 --- a/repos/base-fiasco/src/core/io_mem_session_support.cc +++ b/repos/base-fiasco/src/core/io_mem_session_support.cc @@ -22,7 +22,7 @@ using namespace Core; -void Io_mem_session_component::_unmap_local(addr_t base, size_t) +void Io_mem_session_component::_unmap_local(addr_t base, size_t, addr_t) { platform().region_alloc().free(reinterpret_cast(base)); } diff --git a/repos/base-foc/src/core/io_mem_session_support.cc b/repos/base-foc/src/core/io_mem_session_support.cc index add5548d15..b7fdaea88d 100644 --- a/repos/base-foc/src/core/io_mem_session_support.cc +++ b/repos/base-foc/src/core/io_mem_session_support.cc @@ -21,7 +21,7 @@ using namespace Core; -void Io_mem_session_component::_unmap_local(addr_t base, size_t) +void Io_mem_session_component::_unmap_local(addr_t base, size_t, addr_t) { platform().region_alloc().free(reinterpret_cast(base)); } diff --git a/repos/base-hw/src/core/io_mem_session_support.cc b/repos/base-hw/src/core/io_mem_session_support.cc index d408750c5d..a25f199fd8 100644 --- a/repos/base-hw/src/core/io_mem_session_support.cc +++ b/repos/base-hw/src/core/io_mem_session_support.cc @@ -18,7 +18,7 @@ using namespace Core; -void Io_mem_session_component::_unmap_local(addr_t, size_t) { } +void Io_mem_session_component::_unmap_local(addr_t, size_t, addr_t) { } addr_t Io_mem_session_component::_map_local(addr_t base, size_t) { return base; } diff --git a/repos/base-nova/src/core/io_mem_session_support.cc b/repos/base-nova/src/core/io_mem_session_support.cc index 287a3ac2a5..4bba83ebdc 100644 --- a/repos/base-nova/src/core/io_mem_session_support.cc +++ b/repos/base-nova/src/core/io_mem_session_support.cc @@ -21,6 +21,6 @@ using namespace Core; -void Io_mem_session_component::_unmap_local(addr_t, size_t) { } +void Io_mem_session_component::_unmap_local(addr_t, size_t, addr_t) { } addr_t Io_mem_session_component::_map_local(addr_t, size_t) { return 0; } diff --git a/repos/base-okl4/src/core/io_mem_session_support.cc b/repos/base-okl4/src/core/io_mem_session_support.cc index a169e79230..6b0422ea42 100644 --- a/repos/base-okl4/src/core/io_mem_session_support.cc +++ b/repos/base-okl4/src/core/io_mem_session_support.cc @@ -19,7 +19,7 @@ using namespace Core; -void Io_mem_session_component::_unmap_local(addr_t, size_t) { } +void Io_mem_session_component::_unmap_local(addr_t, size_t, addr_t) { } addr_t Io_mem_session_component::_map_local(addr_t, size_t) { return 0; } diff --git a/repos/base-pistachio/src/core/io_mem_session_support.cc b/repos/base-pistachio/src/core/io_mem_session_support.cc index 95b0ce500e..fce9d33920 100644 --- a/repos/base-pistachio/src/core/io_mem_session_support.cc +++ b/repos/base-pistachio/src/core/io_mem_session_support.cc @@ -46,7 +46,7 @@ static bool is_conventional_memory(addr_t base) } -void Io_mem_session_component::_unmap_local(addr_t, size_t) { } +void Io_mem_session_component::_unmap_local(addr_t, size_t, addr_t) { } static inline bool can_use_super_page(addr_t base, size_t size) diff --git a/repos/base-sel4/src/core/include/initial_untyped_pool.h b/repos/base-sel4/src/core/include/initial_untyped_pool.h index 5d49f02326..c4995ace15 100644 --- a/repos/base-sel4/src/core/include/initial_untyped_pool.h +++ b/repos/base-sel4/src/core/include/initial_untyped_pool.h @@ -252,12 +252,6 @@ class Core::Initial_untyped_pool /* track memory left to be converted */ max_memory -= batch_size; - - /* convert device memory directly into page frames */ - if (range.device) { - size_t const num_pages = batch_size >> get_page_size_log2(); - Untyped_memory::convert_to_page_frames(phys_addr, num_pages); - } } }); } diff --git a/repos/base-sel4/src/core/io_mem_session_support.cc b/repos/base-sel4/src/core/io_mem_session_support.cc index f1f005e409..008746945c 100644 --- a/repos/base-sel4/src/core/io_mem_session_support.cc +++ b/repos/base-sel4/src/core/io_mem_session_support.cc @@ -13,12 +13,22 @@ /* core includes */ #include +#include using namespace Core; -void Io_mem_session_component::_unmap_local(addr_t, size_t) { } +void Io_mem_session_component::_unmap_local(addr_t, size_t size, addr_t phys) +{ + Untyped_memory::convert_to_untyped_frames(phys, size); +} -addr_t Io_mem_session_component::_map_local(addr_t, size_t) { return 0; } +addr_t Io_mem_session_component::_map_local(addr_t phys, size_t size) +{ + size_t const num_pages = size >> get_page_size_log2(); + Untyped_memory::convert_to_page_frames(phys, num_pages); + + return 0; +} diff --git a/repos/base/src/core/include/io_mem_session_component.h b/repos/base/src/core/include/io_mem_session_component.h index de7687380a..93a6ea08bf 100644 --- a/repos/base/src/core/include/io_mem_session_component.h +++ b/repos/base/src/core/include/io_mem_session_component.h @@ -112,7 +112,7 @@ class Core::Io_mem_session_component : public Rpc_object * * Both parameters - base and size - must be page-aligned. */ - void _unmap_local(addr_t base, size_t size); + void _unmap_local(addr_t virt_base, size_t size, addr_t phys_base); public: diff --git a/repos/base/src/core/io_mem_session_component.cc b/repos/base/src/core/io_mem_session_component.cc index 2ff47c1623..7bf233a71d 100644 --- a/repos/base/src/core/io_mem_session_component.cc +++ b/repos/base/src/core/io_mem_session_component.cc @@ -87,7 +87,7 @@ Io_mem_session_component::~Io_mem_session_component() _ds_ep.dissolve(&_ds); /* flush local mapping of IO_MEM */ - _unmap_local(_ds.core_local_addr(), _ds.size()); + _unmap_local(_ds.core_local_addr(), _ds.size(), _ds.phys_addr()); /* * The Dataspace will remove itself from all RM sessions when its