How to catch unhandled exceptions ?
doebel at os.inf.tu-dresden.de
Sun Jun 2 12:03:58 CEST 2013
> Is there any way to catch all system unhandled exceptions (seg fault,
> fpu fault, etc.) and "transform" them into C++ exceptions ?
I'm afraid you're confusing two kinds of exceptions here.
Hardware exceptions (e.g., page faults) are raised by the CPU during
execution and are delivered to a kernel-level handler function, because
that's what the hardware specification says. Fiasco.OC being a
microkernel, we do not handle those exceptions in a kernel, but reflect
them to user-level handler threads - the page fault handler and the
exception handler. Each thread on top of Fiasco.OC has a PF handler and
an exception handler thread assigned. Whenever a CPU exception occurs
while a thread executes, the respective handler threads get a notification.
This is also what the functions you found (thread control + exc_handler)
do - they can be used to assign PF and exception handlers to a thread.
In contrast, C++ language-level exceptions are raised synchronously by
your code (or some library) using the C++ 'throw' keyword. These
language-level exceptions can be caught and handled using try/catch-blocks.
Transforming hardware exceptions into C++ exceptions appears to be
difficult: Suppose, your thread raises a page fault and you want to make
this a C++ exception - what happens if your exception handler raises
another page fault - leading to another exception that raises yet
another page fault ...
Also, C++ exceptions need to be caught in the thread that raised the
exception, otherwise the exceptions causes a call to std::terminate,
wich will abort your application. Hence, you'd need try/catch statements
for all potential hardware exceptions around all your threads' code.
I'm not saying it can't be done (I vaguely remember Choices OS  doing
this), it's just not what we are doing on Fiasco right now.
More information about the l4-hackers