[PATCH v3 4/5] cpukit: Add signal mapping support
Kinsey Moore
kinsey.moore at oarcorp.com
Thu Oct 28 19:48:38 UTC 2021
On 10/28/2021 01:02, Sebastian Huber wrote:
> On 27/10/2021 23:44, Kinsey Moore wrote:
>> +/*
>> + * Exception handler. Map the exception class to SIGFPE, SIGSEGV
>> + * or SIGILL for Ada or other runtimes.
>> + */
>> +void _Exception_Raise_signal(
>> + Internal_errors_Source source,
>> + bool always_set_to_false,
>> + Internal_errors_t code
>> +)
>> +{
>> + CPU_Exception_frame *ef;
>> + int raise_signal;
>> +
>> + if ( source != RTEMS_FATAL_SOURCE_EXCEPTION ) {
>> + return;
>> + }
>> +
>> + ef = (rtems_exception_frame *) code;
>> + raise_signal = _CPU_Exception_frame_get_signal( ef );
>> + if ( raise_signal < 0 ) {
>> + return;
>> + }
>> +
>> + /* Disable thread dispatch */
>> + _CPU_Exception_disable_thread_dispatch();
>> +
>> + /*
>> + * While it would be preferable, the call to raise() cannot be
>> deferred to a
>> + * post-switch action because it attempts to lock the post-switch
>> action list
>> + * to add another item and the list is already locked for
>> iteration. This
>> + * causes a deadlock.
>> + */
>> + raise( raise_signal );
>
> When you get an early exception (before RTEMS is initialized), then
> you get a double exception here or some sort of undefined behaviour.
>
I can use the system state for non-SMP systems and the Per_CPU state for
SMP systems to ensure the current CPU is up for multitasking to prevent
this functionality from executing in the case of an early exception. I
find it a little odd that those are mutually exclusive (Per_CPU state
isn't updated on non-SMP systems and overall system state isn't relevant
for this on SMP systems).
Kinsey
More information about the devel
mailing list