diff --git a/base-foc/include/foc_cpu_session/client.h b/base-foc/include/foc_cpu_session/client.h index f8a19def0..b95b93a37 100644 --- a/base-foc/include/foc_cpu_session/client.h +++ b/base-foc/include/foc_cpu_session/client.h @@ -34,12 +34,6 @@ namespace Genode { void kill_thread(Thread_capability thread) { call(thread); } - Thread_capability first() { - return call(); } - - Thread_capability next(Thread_capability curr) { - return call(curr); } - int set_pager(Thread_capability thread, Pager_capability pager) { return call(thread, pager); } diff --git a/base-nova/include/cpu_session/client.h b/base-nova/include/cpu_session/client.h index f0a74476a..e10662c74 100644 --- a/base-nova/include/cpu_session/client.h +++ b/base-nova/include/cpu_session/client.h @@ -38,11 +38,6 @@ namespace Genode { void kill_thread(Thread_capability thread) { call(thread); } - Thread_capability first() { - return call(); } - - Thread_capability next(Thread_capability curr) { - return call(curr); } int set_pager(Thread_capability thread, Pager_capability pager) { return call(thread, pager); } diff --git a/base-nova/src/base/thread/thread_nova.cc b/base-nova/src/base/thread/thread_nova.cc index 131d1a477..f28d8ee1f 100644 --- a/base-nova/src/base/thread/thread_nova.cc +++ b/base-nova/src/base/thread/thread_nova.cc @@ -126,7 +126,7 @@ void Thread_base::start() throw Cpu_session::Thread_creation_failed(); /* request native EC thread cap */ - Genode::Nova_cpu_connection cpu; + Genode::Cpu_session_client cpu(env()->cpu_session_cap()); Native_capability ec_cap = cpu.native_cap(_thread_cap); if (!ec_cap.valid()) throw Cpu_session::Thread_creation_failed(); diff --git a/base-nova/src/core/include/cpu_session_component.h b/base-nova/src/core/include/cpu_session_component.h index f78963d11..e279e425b 100644 --- a/base-nova/src/core/include/cpu_session_component.h +++ b/base-nova/src/core/include/cpu_session_component.h @@ -131,8 +131,6 @@ namespace Genode { Ram_dataspace_capability utcb(Thread_capability thread); void kill_thread(Thread_capability); - Thread_capability first(); - Thread_capability next(Thread_capability); int set_pager(Thread_capability, Pager_capability); int start(Thread_capability, addr_t, addr_t); void pause(Thread_capability thread_cap); diff --git a/base/include/cpu_session/client.h b/base/include/cpu_session/client.h index add914c5e..33d7bc7b6 100644 --- a/base/include/cpu_session/client.h +++ b/base/include/cpu_session/client.h @@ -33,12 +33,6 @@ namespace Genode { void kill_thread(Thread_capability thread) { call(thread); } - Thread_capability first() { - return call(); } - - Thread_capability next(Thread_capability curr) { - return call(curr); } - int set_pager(Thread_capability thread, Pager_capability pager) { return call(thread, pager); } diff --git a/base/include/cpu_session/cpu_session.h b/base/include/cpu_session/cpu_session.h index 1475485ad..aadaeb306 100644 --- a/base/include/cpu_session/cpu_session.h +++ b/base/include/cpu_session/cpu_session.h @@ -82,16 +82,6 @@ namespace Genode { */ virtual void kill_thread(Thread_capability thread) = 0; - /** - * Retrieve thread list of CPU session - * - * The next() function returns an invalid capability if the - * specified thread does not exists or if it is the last one - * of the CPU session. - */ - virtual Thread_capability first() = 0; - virtual Thread_capability next(Thread_capability curr) = 0; - /** * Set paging capabilities for thread * @@ -213,8 +203,6 @@ namespace Genode { Name const &, addr_t); GENODE_RPC(Rpc_utcb, Ram_dataspace_capability, utcb, Thread_capability); GENODE_RPC(Rpc_kill_thread, void, kill_thread, Thread_capability); - GENODE_RPC(Rpc_first, Thread_capability, first,); - GENODE_RPC(Rpc_next, Thread_capability, next, Thread_capability); GENODE_RPC(Rpc_set_pager, int, set_pager, Thread_capability, Pager_capability); GENODE_RPC(Rpc_start, int, start, Thread_capability, addr_t, addr_t); GENODE_RPC(Rpc_pause, void, pause, Thread_capability); @@ -238,8 +226,6 @@ namespace Genode { typedef Meta::Type_tuple - > > > > > > > > > > > > > > Rpc_functions; + > > > > > > > > > > > > Rpc_functions; }; } diff --git a/base/src/core/cpu_session_component.cc b/base/src/core/cpu_session_component.cc index c9b15d252..08d5c26a0 100644 --- a/base/src/core/cpu_session_component.cc +++ b/base/src/core/cpu_session_component.cc @@ -25,7 +25,8 @@ using namespace Genode; -Thread_capability Cpu_session_component::create_thread(Name const &name, addr_t utcb) +Thread_capability Cpu_session_component::create_thread(Name const &name, + addr_t utcb) { Lock::Guard thread_list_lock_guard(_thread_list_lock); Lock::Guard slab_lock_guard(_thread_alloc_lock); @@ -70,28 +71,6 @@ void Cpu_session_component::kill_thread(Thread_capability thread_cap) } -Thread_capability Cpu_session_component::first() -{ - Lock::Guard lock_guard(_thread_list_lock); - - return _thread_list.first() ? _thread_list.first()->cap() - : Thread_capability(); -} - - -Thread_capability Cpu_session_component::next(Thread_capability thread_cap) -{ - Lock::Guard lock_guard(_thread_list_lock); - - Cpu_thread_component *thread = _lookup_thread(thread_cap); - - if (!thread || !thread->next()) - return Thread_capability(); - - return Thread_capability(thread->next()->cap()); -} - - int Cpu_session_component::set_pager(Thread_capability thread_cap, Pager_capability pager_cap) { @@ -152,9 +131,9 @@ int Cpu_session_component::state(Thread_capability thread_cap, return thread->platform_thread()->state(state_dst); } - -void Cpu_session_component::exception_handler(Thread_capability thread_cap, - Signal_context_capability sigh_cap) +void +Cpu_session_component::exception_handler(Thread_capability thread_cap, + Signal_context_capability sigh_cap) { Cpu_thread_component *thread = _lookup_thread(thread_cap); if (!thread || !thread->platform_thread()->pager()) return; diff --git a/base/src/core/include/core_env.h b/base/src/core/include/core_env.h index 7c9b0fa62..d6477809c 100644 --- a/base/src/core/include/core_env.h +++ b/base/src/core/include/core_env.h @@ -159,19 +159,19 @@ namespace Genode { Cpu_session *cpu_session() { - PWRN("not implemented"); + PWRN("%s:%u not implemented", __FILE__, __LINE__); return 0; } Cpu_session_capability cpu_session_cap() { - PWRN("not implemented"); + PWRN("%s:%u not implemented", __FILE__, __LINE__); return Cpu_session_capability(); } Pd_session *pd_session() { - PWRN("not implemented"); + PWRN("%s:%u not implemented", __FILE__, __LINE__); return 0; } }; diff --git a/base/src/core/include/cpu_session_component.h b/base/src/core/include/cpu_session_component.h index 00c615bc3..6c65515cc 100644 --- a/base/src/core/include/cpu_session_component.h +++ b/base/src/core/include/cpu_session_component.h @@ -124,8 +124,6 @@ namespace Genode { Thread_capability create_thread(Name const &, addr_t utcb); Ram_dataspace_capability utcb(Thread_capability thread); void kill_thread(Thread_capability); - Thread_capability first(); - Thread_capability next(Thread_capability); int set_pager(Thread_capability, Pager_capability); int start(Thread_capability, addr_t, addr_t); void pause(Thread_capability thread_cap); diff --git a/ports-foc/src/lib/l4lx/l4lx_irq.cc b/ports-foc/src/lib/l4lx/l4lx_irq.cc index f82b939ae..835bf05b6 100644 --- a/ports-foc/src/lib/l4lx/l4lx_irq.cc +++ b/ports-foc/src/lib/l4lx/l4lx_irq.cc @@ -164,9 +164,8 @@ int l4lx_irq_dev_set_affinity(struct irq_data *data, if (target_cpu == p->cpu) return 0; - unsigned long flags; + unsigned long flags = 0; l4x_migrate_lock(&flags); - { Linux::Irq_guard guard; if (l4_error(l4_irq_detach(p->irq_cap))) diff --git a/ports-foc/src/lib/l4lx/startup.cc b/ports-foc/src/lib/l4lx/startup.cc index f6f92b9f7..aa62c9aab 100644 --- a/ports-foc/src/lib/l4lx/startup.cc +++ b/ports-foc/src/lib/l4lx/startup.cc @@ -103,9 +103,11 @@ static void prepare_l4re_env() { using namespace Fiasco; - Genode::Foc_cpu_connection cpu; - static Genode::Native_capability main_thread_cap - = cpu.native_cap(Genode::env()->cpu_session()->first()); + Genode::Foc_cpu_session_client cpu(Genode::env()->cpu_session_cap()); + + Genode::Thread_capability main_thread = Genode::env()->parent()->main_thread_cap(); + static Genode::Native_capability main_thread_cap = cpu.native_cap(main_thread); + l4re_env_t *env = l4re_env(); env->first_free_utcb = (l4_addr_t)l4_utcb() + L4_UTCB_OFFSET; env->utcb_area = l4_fpage((l4_addr_t)l4_utcb(), diff --git a/ports-okl4/src/lib/oklx/genode/genode_config.cc b/ports-okl4/src/lib/oklx/genode/genode_config.cc index 532a93096..bc187c644 100644 --- a/ports-okl4/src/lib/oklx/genode/genode_config.cc +++ b/ports-okl4/src/lib/oklx/genode/genode_config.cc @@ -108,7 +108,7 @@ extern "C" { int genode_config_audio() { try { - Genode::Xml_node _node = node("audio"); + node("audio"); return 1; } catch (Genode::Xml_node::Invalid_syntax) { PWRN("Malformed entry in Linux config."); @@ -121,7 +121,7 @@ extern "C" { int genode_config_nic() { try { - Genode::Xml_node _node = node("nic"); + node("nic"); return 1; } catch (Genode::Xml_node::Invalid_syntax) { PWRN("Malformed entry in Linux config."); @@ -133,7 +133,7 @@ extern "C" { int genode_config_block() { try { - Genode::Xml_node _node = node("block"); + node("block"); return 1; } catch (Genode::Xml_node::Invalid_syntax) { PWRN("Malformed entry in Linux config."); diff --git a/ports-okl4/src/lib/oklx/genode/genode_threads.cc b/ports-okl4/src/lib/oklx/genode/genode_threads.cc index 31365ba0e..3b5171c88 100644 --- a/ports-okl4/src/lib/oklx/genode/genode_threads.cc +++ b/ports-okl4/src/lib/oklx/genode/genode_threads.cc @@ -35,29 +35,17 @@ static Thread_capability oklx_pager_cap; /* cap to the Linux main thread */ */ static Thread_capability my_cap() { - /* - * Get the thread-list of the cpu_session containing - * all OKLinux kernel threads - */ - Thread_capability invalid, cap = - Oklx_thread_list::thread_list()->cpu()->first(); + Okl4::L4_Word_t tid = thread_myself(); - /* Get the OKL4 thread id of the active thread */ - Okl4::L4_Word_t tid = thread_myself(); - Thread_state state; - - /* - * Now, iterate through the thread-list and return the cap of the thread - * withe same OKL4 thread id as the active one - */ - while(cap.valid()) - { - Oklx_thread_list::thread_list()->cpu()->state(cap, &state); - if(tid == state.tid.raw) - return cap; - cap = Oklx_thread_list::thread_list()->cpu()->next(cap); + Oklx_kernel_thread * thread = Genode::Oklx_thread_list::thread_list()->first(); + while (thread) { + if (thread->tid().raw == tid) + return thread->cap(); + thread = thread->next(); } - return invalid; + + /* invalid cap */ + return Thread_capability(); } @@ -91,6 +79,7 @@ L4_ThreadId_t Oklx_thread_list::add() /* Get the OKL4 thread id of the new thread */ Thread_state state; _cpu.state(cap,&state); + thd->set_tid(state.tid); /* Acknowledge startup and return */ L4_Send(state.tid); diff --git a/ports-okl4/src/lib/oklx/include/oklx_threads.h b/ports-okl4/src/lib/oklx/include/oklx_threads.h index 7b5c76f6b..7d63d60d4 100644 --- a/ports-okl4/src/lib/oklx/include/oklx_threads.h +++ b/ports-okl4/src/lib/oklx/include/oklx_threads.h @@ -54,6 +54,8 @@ namespace Genode { enum { STACK_SIZE=1024 }; Thread_capability _cap; /* Genodes thread capability */ + Okl4::L4_ThreadId_t _tid; + char _stack[STACK_SIZE]; /* stack for startup code */ public: @@ -65,6 +67,11 @@ namespace Genode { void* stack_addr() { return (void*)&_stack[STACK_SIZE-1]; }; static void entry(); + + void set_tid(Okl4::L4_ThreadId_t tid) { _tid = tid; } + + Okl4::L4_ThreadId_t tid() { return _tid; } + }; @@ -88,6 +95,8 @@ namespace Genode { * Get the global list of OKLinux kernel threads */ static Oklx_thread_list *thread_list(); + + Oklx_kernel_thread * first() { return _threads.first(); } }; diff --git a/ports/src/noux/cpu_session_component.h b/ports/src/noux/cpu_session_component.h index 1776b594b..d68d90440 100644 --- a/ports/src/noux/cpu_session_component.h +++ b/ports/src/noux/cpu_session_component.h @@ -93,12 +93,6 @@ namespace Noux { void kill_thread(Thread_capability thread) { _cpu.kill_thread(thread); } - Thread_capability first() { - return _cpu.first(); } - - Thread_capability next(Thread_capability curr) { - return _cpu.next(curr); } - int set_pager(Thread_capability thread, Pager_capability pager) { return _cpu.set_pager(thread, pager); }