mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-07 19:34:56 +00:00
parent
e0419b2401
commit
87da21d967
@ -133,7 +133,7 @@ class Genode::Pager_object : public Object_pool<Pager_object>::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<Pager_object>::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
|
||||
|
@ -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)
|
||||
{ }
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user