diff --git a/repos/base-foc/src/lib/base/thread_start.cc b/repos/base-foc/src/lib/base/thread_start.cc index 3dfa3140fe..26b7744a17 100644 --- a/repos/base-foc/src/lib/base/thread_start.cc +++ b/repos/base-foc/src/lib/base/thread_start.cc @@ -48,9 +48,7 @@ void Thread::_deinit_platform_thread() void Thread::_init_platform_thread(size_t weight, Type type) { - /* if no cpu session is given, use it from the environment */ - if (!_cpu_session) - _cpu_session = env_deprecated()->cpu_session(); + _init_cpu_session_and_trace_control(); if (type == NORMAL) { diff --git a/repos/base-hw/src/lib/base/thread_start.cc b/repos/base-hw/src/lib/base/thread_start.cc index 9e64ec47c9..ce270866a9 100644 --- a/repos/base-hw/src/lib/base/thread_start.cc +++ b/repos/base-hw/src/lib/base/thread_start.cc @@ -37,7 +37,8 @@ namespace Hw { void Thread::_init_platform_thread(size_t weight, Type type) { - if (!_cpu_session) { _cpu_session = env_deprecated()->cpu_session(); } + _init_cpu_session_and_trace_control(); + if (type == NORMAL) { /* create server object */ diff --git a/repos/base-nova/src/lib/base/thread_start.cc b/repos/base-nova/src/lib/base/thread_start.cc index beccde0deb..a1b0bcc927 100644 --- a/repos/base-nova/src/lib/base/thread_start.cc +++ b/repos/base-nova/src/lib/base/thread_start.cc @@ -107,9 +107,8 @@ void Thread::_init_platform_thread(size_t weight, Type type) if (native_thread().exc_pt_sel == Native_thread::INVALID_INDEX) throw Cpu_session::Thread_creation_failed(); - /* if no cpu session is given, use it from the environment */ - if (!_cpu_session) - _cpu_session = env_deprecated()->cpu_session(); + + _init_cpu_session_and_trace_control(); /* create thread at core */ _thread_cap = _cpu_session->create_thread(env_deprecated()->pd_session_cap(), name(), diff --git a/repos/base/include/base/thread.h b/repos/base/include/base/thread.h index 9e5d2980b0..77e8b02236 100644 --- a/repos/base/include/base/thread.h +++ b/repos/base/include/base/thread.h @@ -172,6 +172,8 @@ class Genode::Thread */ void _init_platform_thread(size_t weight, Type type); + void _init_cpu_session_and_trace_control(); + public: /** diff --git a/repos/base/src/lib/base/thread.cc b/repos/base/src/lib/base/thread.cc index 167bded2f3..351a083274 100644 --- a/repos/base/src/lib/base/thread.cc +++ b/repos/base/src/lib/base/thread.cc @@ -207,12 +207,19 @@ Thread::Thread(size_t weight, const char *name, size_t stack_size, _join_lock(Lock::LOCKED) { _init_platform_thread(weight, type); +} - if (_cpu_session) { - Dataspace_capability ds = _cpu_session->trace_control(); - if (ds.valid()) - _trace_control = env_deprecated()->rm_session()->attach(ds); - } + +void Thread::_init_cpu_session_and_trace_control() +{ + /* if no CPU session is given, use it from the environment */ + if (!_cpu_session) { + _cpu_session = env_deprecated()->cpu_session(); } + + /* initialize trace control now that the CPU session must be valid */ + Dataspace_capability ds = _cpu_session->trace_control(); + if (ds.valid()) { + _trace_control = env_deprecated()->rm_session()->attach(ds); } } diff --git a/repos/base/src/lib/base/thread_start.cc b/repos/base/src/lib/base/thread_start.cc index 26900a45d6..b66c4b0d62 100644 --- a/repos/base/src/lib/base/thread_start.cc +++ b/repos/base/src/lib/base/thread_start.cc @@ -67,9 +67,7 @@ void Thread::_deinit_platform_thread() void Thread::start() { - /* if no CPU session is given, use it from the environment */ - if (!_cpu_session) - _cpu_session = env_deprecated()->cpu_session(); + _init_cpu_session_and_trace_control(); /* create thread at core */ addr_t const utcb = (addr_t)&_stack->utcb();