base: add remove_client to rm_session

Fixes #13
This commit is contained in:
Alexander Boettcher 2013-01-18 09:38:19 +01:00 committed by Norman Feske
parent f02958b25f
commit 9453d319cb
24 changed files with 99 additions and 34 deletions

View File

@ -49,6 +49,7 @@ void Thread_base::_init_platform_thread()
void Thread_base::_deinit_platform_thread() void Thread_base::_deinit_platform_thread()
{ {
env()->cpu_session()->kill_thread(_thread_cap); env()->cpu_session()->kill_thread(_thread_cap);
env()->rm_session()->remove_client(_pager_cap);
} }
@ -63,8 +64,8 @@ void Thread_base::start()
env()->pd_session()->bind_thread(_thread_cap); env()->pd_session()->bind_thread(_thread_cap);
/* create new pager object and assign it to the new thread */ /* create new pager object and assign it to the new thread */
Pager_capability pager_cap = env()->rm_session()->add_client(_thread_cap); _pager_cap = env()->rm_session()->add_client(_thread_cap);
env()->cpu_session()->set_pager(_thread_cap, pager_cap); env()->cpu_session()->set_pager(_thread_cap, _pager_cap);
/* register initial IP and SP at core */ /* register initial IP and SP at core */
addr_t thread_sp = (addr_t)&_context->stack[-4]; addr_t thread_sp = (addr_t)&_context->stack[-4];

View File

@ -42,6 +42,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability) { Pager_capability add_client(Thread_capability) {
return Pager_capability(); } return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability) { } void fault_handler(Signal_context_capability) { }
State state() { return State(); } State state() { return State(); }

View File

@ -33,6 +33,7 @@ void Thread_base::_deinit_platform_thread()
Cap_index *i = (Cap_index*)l4_utcb_tcr_u(_context->utcb)->user[UTCB_TCR_BADGE]; Cap_index *i = (Cap_index*)l4_utcb_tcr_u(_context->utcb)->user[UTCB_TCR_BADGE];
cap_map()->remove(i); cap_map()->remove(i);
env()->cpu_session()->kill_thread(_thread_cap); env()->cpu_session()->kill_thread(_thread_cap);
env()->rm_session()->remove_client(_pager_cap);
} }
} }
@ -50,8 +51,8 @@ void Thread_base::start()
env()->pd_session()->bind_thread(_thread_cap); env()->pd_session()->bind_thread(_thread_cap);
/* create new pager object and assign it to the new thread */ /* create new pager object and assign it to the new thread */
Pager_capability pager_cap = env()->rm_session()->add_client(_thread_cap); _pager_cap = env()->rm_session()->add_client(_thread_cap);
env()->cpu_session()->set_pager(_thread_cap, pager_cap); env()->cpu_session()->set_pager(_thread_cap, _pager_cap);
/* get gate-capability and badge of new thread */ /* get gate-capability and badge of new thread */
Thread_state state; Thread_state state;

View File

@ -61,6 +61,7 @@ void Thread_base::_deinit_platform_thread()
/* destroy object at the CPU session */ /* destroy object at the CPU session */
env()->cpu_session()->kill_thread(_thread_cap); env()->cpu_session()->kill_thread(_thread_cap);
env()->rm_session()->remove_client(_pager_cap);
} }
@ -76,8 +77,8 @@ void Thread_base::start()
env()->pd_session()->bind_thread(_thread_cap); env()->pd_session()->bind_thread(_thread_cap);
/* create new pager object and assign it to the new thread */ /* create new pager object and assign it to the new thread */
Pager_capability pager_cap = env()->rm_session()->add_client(_thread_cap); _pager_cap = env()->rm_session()->add_client(_thread_cap);
env()->cpu_session()->set_pager(_thread_cap, pager_cap); env()->cpu_session()->set_pager(_thread_cap, _pager_cap);
/* attach UTCB */ /* attach UTCB */
try { try {

View File

@ -252,6 +252,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) { Pager_capability add_client(Thread_capability thread) {
return Pager_capability(); } return Pager_capability(); }
void remove_client(Pager_capability pager) { }
void fault_handler(Signal_context_capability handler) { } void fault_handler(Signal_context_capability handler) { }
State state() { return State(); } State state() { return State(); }

View File

@ -46,6 +46,9 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) { Pager_capability add_client(Thread_capability thread) {
return _local()->add_client(thread); } return _local()->add_client(thread); }
void remove_client(Pager_capability pager) {
_local()->remove_client(pager); }
void fault_handler(Signal_context_capability handler) void fault_handler(Signal_context_capability handler)
{ {
/* /*

View File

@ -65,6 +65,8 @@ class Context_area_rm_session : public Genode::Rm_session
Genode::Pager_capability add_client(Genode::Thread_capability) { Genode::Pager_capability add_client(Genode::Thread_capability) {
return Genode::Pager_capability(); } return Genode::Pager_capability(); }
void remove_client(Genode::Pager_capability) { }
void fault_handler(Genode::Signal_context_capability) { } void fault_handler(Genode::Signal_context_capability) { }
State state() { return State(); } State state() { return State(); }

View File

@ -48,6 +48,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability) { Pager_capability add_client(Thread_capability) {
return Pager_capability(); } return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability) { } void fault_handler(Signal_context_capability) { }
State state() { return State(); } State state() { return State(); }

View File

@ -44,6 +44,7 @@ void Thread_base::_init_platform_thread() { }
void Thread_base::_deinit_platform_thread() void Thread_base::_deinit_platform_thread()
{ {
env()->cpu_session()->kill_thread(_thread_cap); env()->cpu_session()->kill_thread(_thread_cap);
env()->rm_session()->remove_client(_pager_cap);
} }
@ -58,8 +59,8 @@ void Thread_base::start()
env()->pd_session()->bind_thread(_thread_cap); env()->pd_session()->bind_thread(_thread_cap);
/* create new pager object and assign it to the new thread */ /* create new pager object and assign it to the new thread */
Pager_capability pager_cap = env()->rm_session()->add_client(_thread_cap); _pager_cap = env()->rm_session()->add_client(_thread_cap);
env()->cpu_session()->set_pager(_thread_cap, pager_cap); env()->cpu_session()->set_pager(_thread_cap, _pager_cap);
/* register initial IP and SP at core */ /* register initial IP and SP at core */
addr_t thread_sp = (addr_t)&_context->stack[-4]; addr_t thread_sp = (addr_t)&_context->stack[-4];

View File

@ -42,6 +42,9 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) { Pager_capability add_client(Thread_capability thread) {
return call<Rpc_add_client>(thread); } return call<Rpc_add_client>(thread); }
void remove_client(Pager_capability pager) {
call<Rpc_remove_client>(pager); }
void fault_handler(Signal_context_capability handler) { void fault_handler(Signal_context_capability handler) {
call<Rpc_fault_handler>(handler); } call<Rpc_fault_handler>(handler); }

View File

@ -213,12 +213,11 @@ Rpc_entrypoint::Rpc_entrypoint(Cap_session *cap_session, size_t stack_size,
*/ */
if (_tid.ec_sel == ~0UL) { if (_tid.ec_sel == ~0UL) {
/* create new pager object and assign it to the new thread */ /* create new pager object and assign it to the new thread */
Pager_capability pager_cap = _pager_cap = env()->rm_session()->add_client(_thread_cap);
env()->rm_session()->add_client(_thread_cap); if (!_pager_cap.valid())
if (!pager_cap.valid())
throw Cpu_session::Thread_creation_failed(); throw Cpu_session::Thread_creation_failed();
if (env()->cpu_session()->set_pager(_thread_cap, pager_cap)) if (env()->cpu_session()->set_pager(_thread_cap, _pager_cap))
throw Cpu_session::Thread_creation_failed(); throw Cpu_session::Thread_creation_failed();
addr_t thread_sp = (addr_t)&_context->stack[-4]; addr_t thread_sp = (addr_t)&_context->stack[-4];
@ -232,13 +231,13 @@ Rpc_entrypoint::Rpc_entrypoint(Cap_session *cap_session, size_t stack_size,
throw Cpu_session::Thread_creation_failed(); throw Cpu_session::Thread_creation_failed();
for (unsigned i = 0; i < Nova::PT_SEL_PARENT; i++) for (unsigned i = 0; i < Nova::PT_SEL_PARENT; i++)
request_event_portal(pager_cap, _tid.exc_pt_sel, i); request_event_portal(_pager_cap, _tid.exc_pt_sel, i);
request_event_portal(pager_cap, _tid.exc_pt_sel, request_event_portal(_pager_cap, _tid.exc_pt_sel,
Nova::PT_SEL_STARTUP); Nova::PT_SEL_STARTUP);
request_event_portal(pager_cap, _tid.exc_pt_sel, request_event_portal(_pager_cap, _tid.exc_pt_sel,
Nova::SM_SEL_EC); Nova::SM_SEL_EC);
request_event_portal(pager_cap, _tid.exc_pt_sel, request_event_portal(_pager_cap, _tid.exc_pt_sel,
Nova::PT_SEL_RECALL); Nova::PT_SEL_RECALL);
/* /*

View File

@ -90,11 +90,17 @@ void Thread_base::_deinit_platform_thread()
revoke(Mem_crd(utcb >> 12, 0, rwx)); revoke(Mem_crd(utcb >> 12, 0, rwx));
/* de-announce thread */ /* de-announce thread */
env()->cpu_session()->kill_thread(_thread_cap); if (_thread_cap.valid()) {
env()->cpu_session()->kill_thread(_thread_cap);
revoke(_thread_cap.local_name(), 0); revoke(_thread_cap.local_name(), 0);
cap_selector_allocator()->free(_thread_cap.local_name(), 0); cap_selector_allocator()->free(_thread_cap.local_name(), 0);
}
if (_pager_cap.valid()) {
env()->rm_session()->remove_client(_pager_cap);
revoke(_pager_cap.local_name(), 0);
cap_selector_allocator()->free(_pager_cap.local_name(), 0);
}
} }
@ -106,12 +112,11 @@ void Thread_base::start()
using namespace Genode; using namespace Genode;
/* create new pager object and assign it to the new thread */ /* create new pager object and assign it to the new thread */
Pager_capability pager_cap = _pager_cap = env()->rm_session()->add_client(_thread_cap);
env()->rm_session()->add_client(_thread_cap); if (!_pager_cap.valid())
if (!pager_cap.valid())
throw Cpu_session::Thread_creation_failed(); throw Cpu_session::Thread_creation_failed();
if (env()->cpu_session()->set_pager(_thread_cap, pager_cap)) if (env()->cpu_session()->set_pager(_thread_cap, _pager_cap))
throw Cpu_session::Thread_creation_failed(); throw Cpu_session::Thread_creation_failed();
/* create EC at core */ /* create EC at core */
@ -139,11 +144,11 @@ void Thread_base::start()
/* request exception portals for normal threads */ /* request exception portals for normal threads */
if (!_tid.is_vcpu) { if (!_tid.is_vcpu) {
for (unsigned i = 0; i < PT_SEL_PARENT; i++) for (unsigned i = 0; i < PT_SEL_PARENT; i++)
request_event_portal(pager_cap, _tid.exc_pt_sel, i); request_event_portal(_pager_cap, _tid.exc_pt_sel, i);
request_event_portal(pager_cap, _tid.exc_pt_sel, PT_SEL_STARTUP); request_event_portal(_pager_cap, _tid.exc_pt_sel, PT_SEL_STARTUP);
request_event_portal(pager_cap, _tid.exc_pt_sel, SM_SEL_EC); request_event_portal(_pager_cap, _tid.exc_pt_sel, SM_SEL_EC);
request_event_portal(pager_cap, _tid.exc_pt_sel, PT_SEL_RECALL); request_event_portal(_pager_cap, _tid.exc_pt_sel, PT_SEL_RECALL);
} }
/* request creation of SC to let thread run*/ /* request creation of SC to let thread run*/

View File

@ -50,6 +50,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) { Pager_capability add_client(Thread_capability thread) {
return Pager_capability(); } return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability handler) { } void fault_handler(Signal_context_capability handler) { }
State state() { return State(); } State state() { return State(); }

View File

@ -47,6 +47,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) { Pager_capability add_client(Thread_capability thread) {
return Pager_capability(); } return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability handler) { } void fault_handler(Signal_context_capability handler) { }
State state() { return State(); } State state() { return State(); }

View File

@ -92,6 +92,11 @@ namespace Genode {
return Pager_capability(); return Pager_capability();
} }
void remove_client(Pager_capability pager)
{
Rm_session_client::remove_client(pager);
}
}; };
class Expanding_ram_session_client : public Ram_session_client class Expanding_ram_session_client : public Ram_session_client

View File

@ -239,10 +239,14 @@ namespace Genode {
* Capability for this thread (set by _start()) * Capability for this thread (set by _start())
* *
* Used if thread creation involves core's CPU service. * Used if thread creation involves core's CPU service.
* Currently, this is not the case for NOVA.
*/ */
Genode::Thread_capability _thread_cap; Genode::Thread_capability _thread_cap;
/**
* Capability to pager paging this thread (created by _start())
*/
Genode::Pager_capability _pager_cap;
/** /**
* Pointer to corresponding thread context * Pointer to corresponding thread context
*/ */

View File

@ -39,6 +39,9 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) { Pager_capability add_client(Thread_capability thread) {
return call<Rpc_add_client>(thread); } return call<Rpc_add_client>(thread); }
void remove_client(Pager_capability pager) {
call<Rpc_remove_client>(pager); }
void fault_handler(Signal_context_capability handler) { void fault_handler(Signal_context_capability handler) {
call<Rpc_fault_handler>(handler); } call<Rpc_fault_handler>(handler); }

View File

@ -164,6 +164,13 @@ namespace Genode {
*/ */
virtual Pager_capability add_client(Thread_capability thread) = 0; virtual Pager_capability add_client(Thread_capability thread) = 0;
/**
* Remove client from pager
*
* \param pager pager capability of client to be removed
*/
virtual void remove_client(Pager_capability) = 0;
/** /**
* Register signal handler for region-manager faults * Register signal handler for region-manager faults
* *
@ -197,12 +204,14 @@ namespace Genode {
GENODE_RPC_THROW(Rpc_add_client, Pager_capability, add_client, GENODE_RPC_THROW(Rpc_add_client, Pager_capability, add_client,
GENODE_TYPE_LIST(Invalid_thread, Out_of_metadata), GENODE_TYPE_LIST(Invalid_thread, Out_of_metadata),
Thread_capability); Thread_capability);
GENODE_RPC(Rpc_remove_client, void, remove_client, Pager_capability);
GENODE_RPC(Rpc_fault_handler, void, fault_handler, Signal_context_capability); GENODE_RPC(Rpc_fault_handler, void, fault_handler, Signal_context_capability);
GENODE_RPC(Rpc_state, State, state); GENODE_RPC(Rpc_state, State, state);
GENODE_RPC(Rpc_dataspace, Dataspace_capability, dataspace); GENODE_RPC(Rpc_dataspace, Dataspace_capability, dataspace);
GENODE_RPC_INTERFACE(Rpc_attach, Rpc_detach, Rpc_add_client, GENODE_RPC_INTERFACE(Rpc_attach, Rpc_detach, Rpc_add_client,
Rpc_fault_handler, Rpc_state, Rpc_dataspace); Rpc_remove_client, Rpc_fault_handler, Rpc_state,
Rpc_dataspace);
}; };
} }

View File

@ -112,6 +112,8 @@ class Context_area_rm_session : public Rm_session
Pager_capability add_client(Thread_capability) { Pager_capability add_client(Thread_capability) {
return Pager_capability(); } return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability) { } void fault_handler(Signal_context_capability) { }
State state() { return State(); } State state() { return State(); }

View File

@ -54,6 +54,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) { Pager_capability add_client(Thread_capability thread) {
return Pager_capability(); } return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability handler) { } void fault_handler(Signal_context_capability handler) { }
State state() { return State(); } State state() { return State(); }

View File

@ -81,9 +81,8 @@ namespace L4lx {
env()->pd_session()->bind_thread(_thread_cap); env()->pd_session()->bind_thread(_thread_cap);
/* create new pager object and assign it to the new thread */ /* create new pager object and assign it to the new thread */
Pager_capability pager_cap = _pager_cap = env()->rm_session()->add_client(_thread_cap);
env()->rm_session()->add_client(_thread_cap); vcpu_connection()->set_pager(_thread_cap, _pager_cap);
vcpu_connection()->set_pager(_thread_cap, pager_cap);
/* get gate-capability and badge of new thread */ /* get gate-capability and badge of new thread */
Thread_state state = vcpu_connection()->state(_thread_cap); Thread_state state = vcpu_connection()->state(_thread_cap);

View File

@ -118,6 +118,15 @@ Pager_capability Rm_session_component::add_client(Thread_capability thread)
} }
void Rm_session_component::remove_client(Pager_capability pager)
{
if (verbose)
PDBG("remove_client()");
return _parent_rm_session.remove_client(pager);
}
void Rm_session_component::fault_handler(Signal_context_capability handler) void Rm_session_component::fault_handler(Signal_context_capability handler)
{ {
if (verbose) if (verbose)

View File

@ -96,7 +96,8 @@ namespace Gdb_monitor {
Genode::off_t, bool, Local_addr, bool); Genode::off_t, bool, Local_addr, bool);
void detach (Local_addr); void detach (Local_addr);
Pager_capability add_client (Thread_capability); Pager_capability add_client (Thread_capability);
void fault_handler (Signal_context_capability handler); void remove_client (Pager_capability);
void fault_handler (Signal_context_capability);
State state (); State state ();
Dataspace_capability dataspace (); Dataspace_capability dataspace ();
}; };

View File

@ -230,6 +230,11 @@ namespace Noux {
return _rm.add_client(thread); return _rm.add_client(thread);
} }
void remove_client(Pager_capability pager)
{
_rm.remove_client(pager);
}
void fault_handler(Signal_context_capability handler) void fault_handler(Signal_context_capability handler)
{ {
return _rm.fault_handler(handler); return _rm.fault_handler(handler);