mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-19 13:47:56 +00:00
parent
f02958b25f
commit
9453d319cb
@ -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];
|
||||
|
@ -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(); }
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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(); }
|
||||
|
@ -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)
|
||||
{
|
||||
/*
|
||||
|
@ -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(); }
|
||||
|
@ -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(); }
|
||||
|
@ -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];
|
||||
|
@ -42,6 +42,9 @@ namespace Genode {
|
||||
Pager_capability add_client(Thread_capability 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) {
|
||||
call<Rpc_fault_handler>(handler); }
|
||||
|
||||
|
@ -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);
|
||||
|
||||
/*
|
||||
|
@ -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*/
|
||||
|
@ -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(); }
|
||||
|
@ -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(); }
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -39,6 +39,9 @@ namespace Genode {
|
||||
Pager_capability add_client(Thread_capability 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) {
|
||||
call<Rpc_fault_handler>(handler); }
|
||||
|
||||
|
@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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(); }
|
||||
|
@ -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(); }
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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 ();
|
||||
};
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user