From fbe9d26c47a507fc6c6c3899032cd07e801ec44d Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Mon, 2 Jul 2018 14:55:01 +0200 Subject: [PATCH] trace: initialize trace control in Thread::start Previously, the trace control of a thread was initialized in its constructor (which is generic for all components). This has the disadvantage that the CPU-session-pointer member of the thread might not be valid at this point. And it cannot be replaced by using the "deprecated_env" CPU session neither as constructing the deprecated environment in causes troubles in Core. But as the trace control shouldn't be needed in Core anyway, the initialization can be moved to the Thread::start implementation of non-core components. This code already takes care of the CPU session pointer. Fixes #2901 --- repos/base-foc/src/lib/base/thread_start.cc | 4 +--- repos/base-hw/src/lib/base/thread_start.cc | 3 ++- repos/base-nova/src/lib/base/thread_start.cc | 5 ++--- repos/base/include/base/thread.h | 2 ++ repos/base/src/lib/base/thread.cc | 17 ++++++++++++----- repos/base/src/lib/base/thread_start.cc | 4 +--- 6 files changed, 20 insertions(+), 15 deletions(-) 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();