Hello
In my environment running Genode on top of OKL4 V2.1 I occasionally observed cluttered debug output on the serial console, sometimes accompanied by a roottask page fault. A close inspection of the system showed that this happens when core writes debug output messages on its own while in parallel debug messages are sent by other protection domains. In core debug messages processed by Genode::printf() and Genode::vprintf() are processed by Okl4_console::vprintf() which infact is the call of the base class methode Console::vprintf(). The implementation in the files okl4_console.cc and console.cc shows that there is no lock to serialize trace output from different sources. The outcome is that core's trace server and any other core thread can concurrently write to OKL4's character-oriented debug interface leading to the mix-up of two debug messages.
I could solve the problem by simply copying the solution from the class Log_console used by the other protection domains:
* Adding a Lock object to the class Okl4_console private: Lock _lock;
* Substituting the call of the base class method Console::vprintf() by providing a dedicated method Okl4_console::vprintf() public: inline void vprintf(const char *format, va_list list) { Lock::Guard lock_guard(_lock); Console::vprintf(format, list); }
These two changes fix the problem w/o affecting any caller code using Okl4_console::vprintf(). It leaves the base class methode Console::vprintf() unmodified so that its usage in different derived classes is not compromised.
I'd appreciate if this or an equivalent fix could find its way into one of the next Genode baselines on Sourceforge.
Regards
Frank