mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-06 19:20:09 +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 += signal_transmitter_noinit.cc
|
||||||
SRC_CC += thread_start.cc
|
SRC_CC += thread_start.cc
|
||||||
SRC_CC += env.cc
|
SRC_CC += env.cc
|
||||||
SRC_CC += region_map_support.cc
|
|
||||||
SRC_CC += pager.cc
|
SRC_CC += pager.cc
|
||||||
SRC_CC += _main.cc
|
SRC_CC += _main.cc
|
||||||
SRC_CC += kernel/cpu.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 &) { }
|
void Core::init_page_fault_handling(Rpc_entrypoint &) { }
|
||||||
|
|
||||||
|
|
||||||
|
/*************
|
||||||
|
** Mapping **
|
||||||
|
*************/
|
||||||
|
|
||||||
|
void Mapping::prepare_map_operation() const { }
|
||||||
|
|
||||||
|
|
||||||
/***************
|
/***************
|
||||||
** Ipc_pager **
|
** Ipc_pager **
|
||||||
***************/
|
***************/
|
||||||
@ -101,6 +108,77 @@ Pager_object::Pager_object(Cpu_session_capability cpu_session_cap,
|
|||||||
** Pager_entrypoint **
|
** 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)
|
Pager_entrypoint::Thread::Thread(Affinity::Location cpu)
|
||||||
:
|
:
|
||||||
Genode::Thread(Weight::DEFAULT_WEIGHT, "pager_ep", PAGER_EP_STACK_SIZE, 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