genode/repos/base-hw/src/core/region_map_support.cc
Stefan Kalkowski be4e34b6b5 hw: unify mmu fault handling
Recent work related to issue 1723 showed that there is potential
to get rid of code duplication in MMU fault handling especially
with regard to ARM cpus.
2017-11-06 13:57:22 +01:00

72 lines
1.7 KiB
C++

/*
* \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.
*/
/* core includes */
#include <pager.h>
#include <platform_pd.h>
#include <platform_thread.h>
#include <translation_table.h>
/* base-internal includes */
using namespace Genode;
/**********************
** Pager_entrypoint **
**********************/
void Pager_entrypoint::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(_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) {
Genode::warning("failed to get platform thread of faulter");
continue;
}
_fault = pt->kernel_object()->fault();
/* try to resolve fault directly via local region managers */
if (po->pager(*this)) 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);
as->insert_translation(_mapping.virt(), _mapping.phys(),
_mapping.size(), _mapping.flags());
}
/* let pager object go back to no-fault state */
po->wake_up();
}
}