mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-06 11:10:24 +00:00
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
This commit is contained in:
parent
fd78fb4de3
commit
1194652d20
@ -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
|
||||
|
@ -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<Address_space> locked_ptr(pt->address_space());
|
||||
if (!locked_ptr.valid()) continue;
|
||||
|
||||
Hw::Address_space * as = static_cast<Hw::Address_space*>(&*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),
|
||||
|
@ -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 <pager.h>
|
||||
#include <platform_pd.h>
|
||||
#include <platform_thread.h>
|
||||
|
||||
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<Address_space> locked_ptr(pt->address_space());
|
||||
if (!locked_ptr.valid()) continue;
|
||||
|
||||
Hw::Address_space * as = static_cast<Hw::Address_space*>(&*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 { }
|
Loading…
x
Reference in New Issue
Block a user