diff --git a/base-hw/include/base/pager.h b/base-hw/include/base/pager.h index 7393b94b2..afeb4f354 100644 --- a/base-hw/include/base/pager.h +++ b/base-hw/include/base/pager.h @@ -133,7 +133,7 @@ class Genode::Pager_object : public Object_pool::Entry, Signal_context_capability _signal_context_cap; Thread_capability _thread_cap; char _signal_buf[sizeof(Signal)]; - unsigned const _thread_id; + unsigned const _badge; /*************** @@ -147,9 +147,9 @@ class Genode::Pager_object : public Object_pool::Entry, /** * Constructor * - * \param thread_id kernel name of faulter thread + * \param badge user identifaction of pager object */ - Pager_object(unsigned const thread_id, Affinity::Location); + Pager_object(unsigned const badge, Affinity::Location); /** * Destructor diff --git a/base-hw/src/base/pager.cc b/base-hw/src/base/pager.cc index a8a8c24e7..e49b4c7a1 100644 --- a/base-hw/src/base/pager.cc +++ b/base-hw/src/base/pager.cc @@ -72,7 +72,7 @@ void Pager_object::exception_handler(Signal_context_capability) { } void Pager_object::fault_resolved() { _signal()->~Signal(); } -unsigned Pager_object::badge() const { return _thread_id; } +unsigned Pager_object::badge() const { return _badge; } void Pager_object::fault_occured(Signal const & s) @@ -87,9 +87,9 @@ void Pager_object::cap(Native_capability const & c) } -Pager_object::Pager_object(unsigned const thread_id, Affinity::Location) +Pager_object::Pager_object(unsigned const badge, Affinity::Location) : - _thread_id(thread_id) + _badge(badge) { } diff --git a/base-hw/src/core/include/platform_thread.h b/base-hw/src/core/include/platform_thread.h index b01f5a4e1..1daeb685e 100644 --- a/base-hw/src/core/include/platform_thread.h +++ b/base-hw/src/core/include/platform_thread.h @@ -140,7 +140,7 @@ namespace Genode { /** * Return unique identification of this thread as faulter */ - unsigned pager_object_badge() { return _id; } + unsigned pager_object_badge() { return (unsigned)this; } /** * Set the executing CPU for this thread diff --git a/base-hw/src/core/rm_session_support.cc b/base-hw/src/core/rm_session_support.cc index 4c0baf9ff..69b48d282 100644 --- a/base-hw/src/core/rm_session_support.cc +++ b/base-hw/src/core/rm_session_support.cc @@ -31,14 +31,14 @@ using namespace Genode; void Rm_client::unmap(addr_t, addr_t virt_base, size_t size) { /* get software TLB of the thread that we serve */ - Platform_thread * const pt = Kernel::get_thread(badge()); + Platform_thread * const pt = (Platform_thread *)badge(); if (!pt) { - PERR("failed to get RM client-thread"); + PERR("failed to get platform thread of RM client"); return; } Tlb * const tlb = pt->tlb(); if (!tlb) { - PERR("failed to get PD of RM client-thread"); + PERR("failed to get page table of RM client"); return; } /* update all translation caches */ @@ -108,7 +108,12 @@ void Pager_activation_base::entry() PERR("unknown pager object"); } /* fetch fault data */ - unsigned const thread_id = o->badge(); + Platform_thread * const pt = (Platform_thread *)o->badge(); + if (!pt) { + PERR("failed to get platform thread of faulter"); + continue; + } + unsigned const thread_id = pt->id(); typedef Kernel::Thread_reg_id Reg_id; static addr_t const read_regs[] = { Reg_id::FAULT_TLB, Reg_id::IP, Reg_id::FAULT_ADDR, @@ -118,7 +123,7 @@ void Pager_activation_base::entry() memcpy(utcb, read_regs, sizeof(read_regs)); addr_t * const read_values = (addr_t *)&_fault; if (Kernel::access_thread_regs(thread_id, READS, 0, read_values, 0)) { - PERR("failed to read page-fault data"); + PERR("failed to read fault data"); continue; } /* handle fault */