From 9453d319cb6141c3a736b8af46ee769321f9984a Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 18 Jan 2013 09:38:19 +0100 Subject: [PATCH] base: add remove_client to rm_session Fixes #13 --- base-codezero/src/base/thread/thread_start.cc | 5 ++-- .../src/core/include/core_rm_session.h | 2 ++ base-foc/src/base/thread/thread_start.cc | 5 ++-- base-hw/src/base/thread_support.cc | 5 ++-- base-linux/include/base/platform_env.h | 2 ++ base-linux/include/rm_session/client.h | 3 ++ base-linux/src/core/context_area.cc | 2 ++ .../src/core/include/rm_session_component.h | 2 ++ base-mb/src/base/thread/thread_start.cc | 5 ++-- base-nova/include/rm_session/client.h | 3 ++ base-nova/src/base/server/server.cc | 15 +++++----- base-nova/src/base/thread/thread_nova.cc | 29 +++++++++++-------- base-nova/src/core/include/core_rm_session.h | 2 ++ base-okl4/src/core/include/core_rm_session.h | 2 ++ base/include/base/platform_env.h | 5 ++++ base/include/base/thread.h | 6 +++- base/include/rm_session/client.h | 3 ++ base/include/rm_session/rm_session.h | 11 ++++++- base/src/core/context_area.cc | 2 ++ base/src/core/include/core_rm_session.h | 2 ++ ports-foc/src/lib/l4lx/include/vcpu.h | 5 ++-- .../app/gdb_monitor/rm_session_component.cc | 9 ++++++ .../app/gdb_monitor/rm_session_component.h | 3 +- ports/src/noux/rm_session_component.h | 5 ++++ 24 files changed, 99 insertions(+), 34 deletions(-) diff --git a/base-codezero/src/base/thread/thread_start.cc b/base-codezero/src/base/thread/thread_start.cc index 8ee6249df..03168a03d 100644 --- a/base-codezero/src/base/thread/thread_start.cc +++ b/base-codezero/src/base/thread/thread_start.cc @@ -49,6 +49,7 @@ void Thread_base::_init_platform_thread() void Thread_base::_deinit_platform_thread() { 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); /* create new pager object and assign it to the new thread */ - Pager_capability pager_cap = env()->rm_session()->add_client(_thread_cap); - env()->cpu_session()->set_pager(_thread_cap, pager_cap); + _pager_cap = env()->rm_session()->add_client(_thread_cap); + env()->cpu_session()->set_pager(_thread_cap, _pager_cap); /* register initial IP and SP at core */ addr_t thread_sp = (addr_t)&_context->stack[-4]; diff --git a/base-codezero/src/core/include/core_rm_session.h b/base-codezero/src/core/include/core_rm_session.h index 6f0a6ece0..59b5bd82c 100644 --- a/base-codezero/src/core/include/core_rm_session.h +++ b/base-codezero/src/core/include/core_rm_session.h @@ -42,6 +42,8 @@ namespace Genode { Pager_capability add_client(Thread_capability) { return Pager_capability(); } + void remove_client(Pager_capability) { } + void fault_handler(Signal_context_capability) { } State state() { return State(); } diff --git a/base-foc/src/base/thread/thread_start.cc b/base-foc/src/base/thread/thread_start.cc index dbeff9944..04457c20c 100644 --- a/base-foc/src/base/thread/thread_start.cc +++ b/base-foc/src/base/thread/thread_start.cc @@ -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_map()->remove(i); 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); /* create new pager object and assign it to the new thread */ - Pager_capability pager_cap = env()->rm_session()->add_client(_thread_cap); - env()->cpu_session()->set_pager(_thread_cap, pager_cap); + _pager_cap = env()->rm_session()->add_client(_thread_cap); + env()->cpu_session()->set_pager(_thread_cap, _pager_cap); /* get gate-capability and badge of new thread */ Thread_state state; diff --git a/base-hw/src/base/thread_support.cc b/base-hw/src/base/thread_support.cc index 9f508b3d9..5a1056ae5 100644 --- a/base-hw/src/base/thread_support.cc +++ b/base-hw/src/base/thread_support.cc @@ -61,6 +61,7 @@ void Thread_base::_deinit_platform_thread() /* destroy object at the CPU session */ 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); /* create new pager object and assign it to the new thread */ - Pager_capability pager_cap = env()->rm_session()->add_client(_thread_cap); - env()->cpu_session()->set_pager(_thread_cap, pager_cap); + _pager_cap = env()->rm_session()->add_client(_thread_cap); + env()->cpu_session()->set_pager(_thread_cap, _pager_cap); /* attach UTCB */ try { diff --git a/base-linux/include/base/platform_env.h b/base-linux/include/base/platform_env.h index 3a4aa4489..a28a0d74f 100644 --- a/base-linux/include/base/platform_env.h +++ b/base-linux/include/base/platform_env.h @@ -252,6 +252,8 @@ namespace Genode { Pager_capability add_client(Thread_capability thread) { return Pager_capability(); } + void remove_client(Pager_capability pager) { } + void fault_handler(Signal_context_capability handler) { } State state() { return State(); } diff --git a/base-linux/include/rm_session/client.h b/base-linux/include/rm_session/client.h index b2cd16403..3f61706e4 100644 --- a/base-linux/include/rm_session/client.h +++ b/base-linux/include/rm_session/client.h @@ -46,6 +46,9 @@ namespace Genode { Pager_capability add_client(Thread_capability thread) { return _local()->add_client(thread); } + void remove_client(Pager_capability pager) { + _local()->remove_client(pager); } + void fault_handler(Signal_context_capability handler) { /* diff --git a/base-linux/src/core/context_area.cc b/base-linux/src/core/context_area.cc index 96bb60304..c5b6859b0 100644 --- a/base-linux/src/core/context_area.cc +++ b/base-linux/src/core/context_area.cc @@ -65,6 +65,8 @@ class Context_area_rm_session : public Genode::Rm_session Genode::Pager_capability add_client(Genode::Thread_capability) { return Genode::Pager_capability(); } + void remove_client(Genode::Pager_capability) { } + void fault_handler(Genode::Signal_context_capability) { } State state() { return State(); } diff --git a/base-linux/src/core/include/rm_session_component.h b/base-linux/src/core/include/rm_session_component.h index c7d1ed478..c63561bf0 100644 --- a/base-linux/src/core/include/rm_session_component.h +++ b/base-linux/src/core/include/rm_session_component.h @@ -48,6 +48,8 @@ namespace Genode { Pager_capability add_client(Thread_capability) { return Pager_capability(); } + void remove_client(Pager_capability) { } + void fault_handler(Signal_context_capability) { } State state() { return State(); } diff --git a/base-mb/src/base/thread/thread_start.cc b/base-mb/src/base/thread/thread_start.cc index 0101e33e8..34059c26d 100644 --- a/base-mb/src/base/thread/thread_start.cc +++ b/base-mb/src/base/thread/thread_start.cc @@ -44,6 +44,7 @@ void Thread_base::_init_platform_thread() { } void Thread_base::_deinit_platform_thread() { 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); /* create new pager object and assign it to the new thread */ - Pager_capability pager_cap = env()->rm_session()->add_client(_thread_cap); - env()->cpu_session()->set_pager(_thread_cap, pager_cap); + _pager_cap = env()->rm_session()->add_client(_thread_cap); + env()->cpu_session()->set_pager(_thread_cap, _pager_cap); /* register initial IP and SP at core */ addr_t thread_sp = (addr_t)&_context->stack[-4]; diff --git a/base-nova/include/rm_session/client.h b/base-nova/include/rm_session/client.h index 805bd3936..10d58a464 100644 --- a/base-nova/include/rm_session/client.h +++ b/base-nova/include/rm_session/client.h @@ -42,6 +42,9 @@ namespace Genode { Pager_capability add_client(Thread_capability thread) { return call(thread); } + void remove_client(Pager_capability pager) { + call(pager); } + void fault_handler(Signal_context_capability handler) { call(handler); } diff --git a/base-nova/src/base/server/server.cc b/base-nova/src/base/server/server.cc index d973c48b4..314059843 100644 --- a/base-nova/src/base/server/server.cc +++ b/base-nova/src/base/server/server.cc @@ -213,12 +213,11 @@ Rpc_entrypoint::Rpc_entrypoint(Cap_session *cap_session, size_t stack_size, */ if (_tid.ec_sel == ~0UL) { /* create new pager object and assign it to the new thread */ - Pager_capability pager_cap = - env()->rm_session()->add_client(_thread_cap); - if (!pager_cap.valid()) + _pager_cap = env()->rm_session()->add_client(_thread_cap); + if (!_pager_cap.valid()) 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(); 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(); 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); - request_event_portal(pager_cap, _tid.exc_pt_sel, + request_event_portal(_pager_cap, _tid.exc_pt_sel, 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); /* diff --git a/base-nova/src/base/thread/thread_nova.cc b/base-nova/src/base/thread/thread_nova.cc index 32370b3b1..f62b609ab 100644 --- a/base-nova/src/base/thread/thread_nova.cc +++ b/base-nova/src/base/thread/thread_nova.cc @@ -90,11 +90,17 @@ void Thread_base::_deinit_platform_thread() revoke(Mem_crd(utcb >> 12, 0, rwx)); /* de-announce thread */ - env()->cpu_session()->kill_thread(_thread_cap); - - revoke(_thread_cap.local_name(), 0); - cap_selector_allocator()->free(_thread_cap.local_name(), 0); + if (_thread_cap.valid()) { + env()->cpu_session()->kill_thread(_thread_cap); + revoke(_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; /* create new pager object and assign it to the new thread */ - Pager_capability pager_cap = - env()->rm_session()->add_client(_thread_cap); - if (!pager_cap.valid()) + _pager_cap = env()->rm_session()->add_client(_thread_cap); + if (!_pager_cap.valid()) 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(); /* create EC at core */ @@ -139,11 +144,11 @@ void Thread_base::start() /* request exception portals for normal threads */ if (!_tid.is_vcpu) { 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, 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_STARTUP); + 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 creation of SC to let thread run*/ diff --git a/base-nova/src/core/include/core_rm_session.h b/base-nova/src/core/include/core_rm_session.h index f957a904e..5c0642a3b 100644 --- a/base-nova/src/core/include/core_rm_session.h +++ b/base-nova/src/core/include/core_rm_session.h @@ -50,6 +50,8 @@ namespace Genode { Pager_capability add_client(Thread_capability thread) { return Pager_capability(); } + void remove_client(Pager_capability) { } + void fault_handler(Signal_context_capability handler) { } State state() { return State(); } diff --git a/base-okl4/src/core/include/core_rm_session.h b/base-okl4/src/core/include/core_rm_session.h index 5c98a3203..f89eda67a 100644 --- a/base-okl4/src/core/include/core_rm_session.h +++ b/base-okl4/src/core/include/core_rm_session.h @@ -47,6 +47,8 @@ namespace Genode { Pager_capability add_client(Thread_capability thread) { return Pager_capability(); } + void remove_client(Pager_capability) { } + void fault_handler(Signal_context_capability handler) { } State state() { return State(); } diff --git a/base/include/base/platform_env.h b/base/include/base/platform_env.h index dd64fa1b6..f35cb8616 100644 --- a/base/include/base/platform_env.h +++ b/base/include/base/platform_env.h @@ -92,6 +92,11 @@ namespace Genode { return Pager_capability(); } + + void remove_client(Pager_capability pager) + { + Rm_session_client::remove_client(pager); + } }; class Expanding_ram_session_client : public Ram_session_client diff --git a/base/include/base/thread.h b/base/include/base/thread.h index 918fc506e..469dacae5 100644 --- a/base/include/base/thread.h +++ b/base/include/base/thread.h @@ -239,10 +239,14 @@ namespace Genode { * Capability for this thread (set by _start()) * * Used if thread creation involves core's CPU service. - * Currently, this is not the case for NOVA. */ Genode::Thread_capability _thread_cap; + /** + * Capability to pager paging this thread (created by _start()) + */ + Genode::Pager_capability _pager_cap; + /** * Pointer to corresponding thread context */ diff --git a/base/include/rm_session/client.h b/base/include/rm_session/client.h index f0c507f59..4df534935 100644 --- a/base/include/rm_session/client.h +++ b/base/include/rm_session/client.h @@ -39,6 +39,9 @@ namespace Genode { Pager_capability add_client(Thread_capability thread) { return call(thread); } + void remove_client(Pager_capability pager) { + call(pager); } + void fault_handler(Signal_context_capability handler) { call(handler); } diff --git a/base/include/rm_session/rm_session.h b/base/include/rm_session/rm_session.h index 3097ec4a7..4709812bc 100644 --- a/base/include/rm_session/rm_session.h +++ b/base/include/rm_session/rm_session.h @@ -164,6 +164,13 @@ namespace Genode { */ 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 * @@ -197,12 +204,14 @@ namespace Genode { GENODE_RPC_THROW(Rpc_add_client, Pager_capability, add_client, GENODE_TYPE_LIST(Invalid_thread, Out_of_metadata), 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_state, State, state); GENODE_RPC(Rpc_dataspace, Dataspace_capability, dataspace); 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); }; } diff --git a/base/src/core/context_area.cc b/base/src/core/context_area.cc index 9ea13a85e..83ca382a1 100644 --- a/base/src/core/context_area.cc +++ b/base/src/core/context_area.cc @@ -112,6 +112,8 @@ class Context_area_rm_session : public Rm_session Pager_capability add_client(Thread_capability) { return Pager_capability(); } + void remove_client(Pager_capability) { } + void fault_handler(Signal_context_capability) { } State state() { return State(); } diff --git a/base/src/core/include/core_rm_session.h b/base/src/core/include/core_rm_session.h index aea4fee2d..52e9217ff 100644 --- a/base/src/core/include/core_rm_session.h +++ b/base/src/core/include/core_rm_session.h @@ -54,6 +54,8 @@ namespace Genode { Pager_capability add_client(Thread_capability thread) { return Pager_capability(); } + void remove_client(Pager_capability) { } + void fault_handler(Signal_context_capability handler) { } State state() { return State(); } diff --git a/ports-foc/src/lib/l4lx/include/vcpu.h b/ports-foc/src/lib/l4lx/include/vcpu.h index 0d257f289..ee343aeab 100644 --- a/ports-foc/src/lib/l4lx/include/vcpu.h +++ b/ports-foc/src/lib/l4lx/include/vcpu.h @@ -81,9 +81,8 @@ namespace L4lx { env()->pd_session()->bind_thread(_thread_cap); /* create new pager object and assign it to the new thread */ - Pager_capability pager_cap = - env()->rm_session()->add_client(_thread_cap); - vcpu_connection()->set_pager(_thread_cap, pager_cap); + _pager_cap = env()->rm_session()->add_client(_thread_cap); + vcpu_connection()->set_pager(_thread_cap, _pager_cap); /* get gate-capability and badge of new thread */ Thread_state state = vcpu_connection()->state(_thread_cap); diff --git a/ports/src/app/gdb_monitor/rm_session_component.cc b/ports/src/app/gdb_monitor/rm_session_component.cc index f43c9e590..72a253125 100644 --- a/ports/src/app/gdb_monitor/rm_session_component.cc +++ b/ports/src/app/gdb_monitor/rm_session_component.cc @@ -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) { if (verbose) diff --git a/ports/src/app/gdb_monitor/rm_session_component.h b/ports/src/app/gdb_monitor/rm_session_component.h index 92ef87c81..e99ed62e9 100644 --- a/ports/src/app/gdb_monitor/rm_session_component.h +++ b/ports/src/app/gdb_monitor/rm_session_component.h @@ -96,7 +96,8 @@ namespace Gdb_monitor { Genode::off_t, bool, Local_addr, bool); void detach (Local_addr); 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 (); Dataspace_capability dataspace (); }; diff --git a/ports/src/noux/rm_session_component.h b/ports/src/noux/rm_session_component.h index 8d0a1f84a..69b02ecda 100644 --- a/ports/src/noux/rm_session_component.h +++ b/ports/src/noux/rm_session_component.h @@ -230,6 +230,11 @@ namespace Noux { return _rm.add_client(thread); } + void remove_client(Pager_capability pager) + { + _rm.remove_client(pager); + } + void fault_handler(Signal_context_capability handler) { return _rm.fault_handler(handler);