From 1194652d2097301148c6596b7ce197035dea63fa Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Mon, 19 Aug 2024 10:07:18 +0200 Subject: [PATCH] hw: move remaining pager code to pager.cc Consolidate core's ha-specific pager code in one and the same compilation unit. Ref genodelabs/genode#5318 --- repos/base-hw/lib/mk/core-hw.inc | 1 - repos/base-hw/src/core/pager.cc | 78 ++++++++++++++++ repos/base-hw/src/core/region_map_support.cc | 94 -------------------- 3 files changed, 78 insertions(+), 95 deletions(-) delete mode 100644 repos/base-hw/src/core/region_map_support.cc diff --git a/repos/base-hw/lib/mk/core-hw.inc b/repos/base-hw/lib/mk/core-hw.inc index 87cf4dffd5..26f3711358 100644 --- a/repos/base-hw/lib/mk/core-hw.inc +++ b/repos/base-hw/lib/mk/core-hw.inc @@ -46,7 +46,6 @@ SRC_CC += ram_dataspace_factory.cc SRC_CC += signal_transmitter_noinit.cc SRC_CC += thread_start.cc SRC_CC += env.cc -SRC_CC += region_map_support.cc SRC_CC += pager.cc SRC_CC += _main.cc SRC_CC += kernel/cpu.cc diff --git a/repos/base-hw/src/core/pager.cc b/repos/base-hw/src/core/pager.cc index 0043158c79..276bfcb32f 100644 --- a/repos/base-hw/src/core/pager.cc +++ b/repos/base-hw/src/core/pager.cc @@ -36,6 +36,13 @@ void Core::init_pager_thread_per_cpu_memory(unsigned const cpus, void * mem) void Core::init_page_fault_handling(Rpc_entrypoint &) { } +/************* + ** Mapping ** + *************/ + +void Mapping::prepare_map_operation() const { } + + /*************** ** Ipc_pager ** ***************/ @@ -101,6 +108,77 @@ Pager_object::Pager_object(Cpu_session_capability cpu_session_cap, ** Pager_entrypoint ** **********************/ +void Pager_entrypoint::Thread::entry() +{ + Untyped_capability cap; + + while (1) { + + if (cap.valid()) Kernel::ack_signal(Capability_space::capid(cap)); + + /* receive fault */ + if (Kernel::await_signal(Capability_space::capid(_kobj.cap()))) continue; + + Pager_object *po = *(Pager_object**)Thread::myself()->utcb()->data(); + cap = po->cap(); + + if (!po) continue; + + /* fetch fault data */ + Platform_thread * const pt = (Platform_thread *)po->badge(); + if (!pt) { + warning("failed to get platform thread of faulter"); + continue; + } + + if (pt->exception_state() == + Kernel::Thread::Exception_state::EXCEPTION) { + if (!po->submit_exception_signal()) + warning("unresolvable exception: " + "pd='", pt->pd().label(), "', " + "thread='", pt->label(), "', " + "ip=", Hex(pt->state().cpu.ip)); + continue; + } + + _fault = pt->fault_info(); + + /* try to resolve fault directly via local region managers */ + if (po->pager(*this) == Pager_object::Pager_result::STOP) + continue; + + /* apply mapping that was determined by the local region managers */ + { + Locked_ptr locked_ptr(pt->address_space()); + if (!locked_ptr.valid()) continue; + + Hw::Address_space * as = static_cast(&*locked_ptr); + + Cache cacheable = Genode::CACHED; + if (!_mapping.cached) + cacheable = Genode::UNCACHED; + if (_mapping.write_combined) + cacheable = Genode::WRITE_COMBINED; + + Hw::Page_flags const flags { + .writeable = _mapping.writeable ? Hw::RW : Hw::RO, + .executable = _mapping.executable ? Hw::EXEC : Hw::NO_EXEC, + .privileged = Hw::USER, + .global = Hw::NO_GLOBAL, + .type = _mapping.io_mem ? Hw::DEVICE : Hw::RAM, + .cacheable = cacheable + }; + + as->insert_translation(_mapping.dst_addr, _mapping.src_addr, + 1UL << _mapping.size_log2, flags); + } + + /* let pager object go back to no-fault state */ + po->wake_up(); + } +} + + Pager_entrypoint::Thread::Thread(Affinity::Location cpu) : Genode::Thread(Weight::DEFAULT_WEIGHT, "pager_ep", PAGER_EP_STACK_SIZE, cpu), diff --git a/repos/base-hw/src/core/region_map_support.cc b/repos/base-hw/src/core/region_map_support.cc deleted file mode 100644 index e69bc7ddb0..0000000000 --- a/repos/base-hw/src/core/region_map_support.cc +++ /dev/null @@ -1,94 +0,0 @@ -/* - * \brief RM- and pager implementations specific for base-hw and core - * \author Martin Stein - * \author Stefan Kalkowski - * \date 2012-02-12 - */ - -/* - * Copyright (C) 2012-2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -/* base-hw core includes */ -#include -#include -#include - -using namespace Core; - - -void Pager_entrypoint::Thread::entry() -{ - Untyped_capability cap; - - while (1) { - - if (cap.valid()) Kernel::ack_signal(Capability_space::capid(cap)); - - /* receive fault */ - if (Kernel::await_signal(Capability_space::capid(_kobj.cap()))) continue; - - Pager_object *po = *(Pager_object**)Thread::myself()->utcb()->data(); - cap = po->cap(); - - if (!po) continue; - - /* fetch fault data */ - Platform_thread * const pt = (Platform_thread *)po->badge(); - if (!pt) { - warning("failed to get platform thread of faulter"); - continue; - } - - if (pt->exception_state() == - Kernel::Thread::Exception_state::EXCEPTION) { - if (!po->submit_exception_signal()) - warning("unresolvable exception: " - "pd='", pt->pd().label(), "', " - "thread='", pt->label(), "', " - "ip=", Hex(pt->state().cpu.ip)); - continue; - } - - _fault = pt->fault_info(); - - /* try to resolve fault directly via local region managers */ - if (po->pager(*this) == Pager_object::Pager_result::STOP) - continue; - - /* apply mapping that was determined by the local region managers */ - { - Locked_ptr locked_ptr(pt->address_space()); - if (!locked_ptr.valid()) continue; - - Hw::Address_space * as = static_cast(&*locked_ptr); - - Cache cacheable = Genode::CACHED; - if (!_mapping.cached) - cacheable = Genode::UNCACHED; - if (_mapping.write_combined) - cacheable = Genode::WRITE_COMBINED; - - Hw::Page_flags const flags { - .writeable = _mapping.writeable ? Hw::RW : Hw::RO, - .executable = _mapping.executable ? Hw::EXEC : Hw::NO_EXEC, - .privileged = Hw::USER, - .global = Hw::NO_GLOBAL, - .type = _mapping.io_mem ? Hw::DEVICE : Hw::RAM, - .cacheable = cacheable - }; - - as->insert_translation(_mapping.dst_addr, _mapping.src_addr, - 1UL << _mapping.size_log2, flags); - } - - /* let pager object go back to no-fault state */ - po->wake_up(); - } -} - - -void Mapping::prepare_map_operation() const { }