From 94f64ef464085f118ccd3bfc5e08a6e15ff10221 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 4 Sep 2015 17:01:23 +0200 Subject: [PATCH] nova: avoid sc_ctrl syscalls on invalid caps Avoids kernel log messages if TRACE_ERROR is enabled in kernel. Discovered during Turmvilla scenario #1552 and issue #1733. --- repos/base-nova/src/core/include/platform_thread.h | 6 +++--- repos/base-nova/src/core/platform_thread.cc | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/repos/base-nova/src/core/include/platform_thread.h b/repos/base-nova/src/core/include/platform_thread.h index e551c5349..a17e07f50 100644 --- a/repos/base-nova/src/core/include/platform_thread.h +++ b/repos/base-nova/src/core/include/platform_thread.h @@ -53,9 +53,9 @@ namespace Genode { addr_t _sel_sc() const { return _id_base + 2; } /* convenience function to access _feature variable */ - inline bool is_main_thread() { return _features & MAIN_THREAD; } - inline bool is_vcpu() { return _features & VCPU; } - inline bool is_worker() { return _features & WORKER; } + inline bool is_main_thread() const { return _features & MAIN_THREAD; } + inline bool is_vcpu() const { return _features & VCPU; } + inline bool is_worker() const { return _features & WORKER; } public: diff --git a/repos/base-nova/src/core/platform_thread.cc b/repos/base-nova/src/core/platform_thread.cc index 439d43552..aa375a455 100644 --- a/repos/base-nova/src/core/platform_thread.cc +++ b/repos/base-nova/src/core/platform_thread.cc @@ -324,11 +324,15 @@ unsigned long long Platform_thread::execution_time() const unsigned long long time = 0; /* - * Ignore the return value, which indicates success only for global ECs. * For local ECs, we simply return 0 as local ECs are executed with the * time of their callers. */ - (void) Nova::sc_ctrl(_sel_sc(), time); + if (is_worker()) + return time; + + uint8_t res = Nova::sc_ctrl(_sel_sc(), time); + if (res != Nova::NOVA_OK) + PDBG("sc_ctrl failed res=%x", res); return time; }