[PATCH v4 4/5] cpukit: Add signal mapping support

Kinsey Moore kinsey.moore at oarcorp.com
Thu Oct 28 21:12:02 UTC 2021


This adds a confdef option allowing an application to request mapping
machine exceptions to POSIX signals. This is required for some languages
such as Ada.
---
 cpukit/doxygen/appl-config.h               |  23 +++++
 cpukit/include/rtems/confdefs/extensions.h |   7 ++
 cpukit/include/rtems/score/exception.h     |  71 ++++++++++++++
 cpukit/score/src/exceptionmapping.c        | 104 +++++++++++++++++++++
 spec/build/cpukit/librtemscpu.yml          |   3 +
 spec/build/cpukit/objexceptionmapping.yml  |  15 +++
 6 files changed, 223 insertions(+)
 create mode 100644 cpukit/include/rtems/score/exception.h
 create mode 100644 cpukit/score/src/exceptionmapping.c
 create mode 100644 spec/build/cpukit/objexceptionmapping.yml

diff --git a/cpukit/doxygen/appl-config.h b/cpukit/doxygen/appl-config.h
index c0e5b0b717..4735af8766 100644
--- a/cpukit/doxygen/appl-config.h
+++ b/cpukit/doxygen/appl-config.h
@@ -1773,6 +1773,29 @@
  */
 #define CONFIGURE_ATA_DRIVER_TASK_PRIORITY
 
+/* Generated from spec:/acfg/if/exception-to-signal-mapping */
+
+/**
+ * @brief This configuration option is a boolean feature define.
+ *
+ * In case this configuration option is defined, then the machine exception to
+ * POSIX signal mapping is configured during system initialization.
+ *
+ * @par Default Configuration
+ * If this configuration option is undefined, then the described feature is not
+ * enabled.
+ *
+ * @par Notes
+ * @parblock
+ * This device driver is responsible for setting up a mapping from machine
+ * exceptions to POSIX signals so that applications may consume them and alter
+ * task execution as necessary.
+ *
+ * This is especially useful for applications written in Ada or C++.
+ * @endparblock
+ */
+#define CONFIGURE_EXCEPTION_TO_SIGNAL_MAPPING
+
 /* Generated from spec:/acfg/if/max-drivers */
 
 /**
diff --git a/cpukit/include/rtems/confdefs/extensions.h b/cpukit/include/rtems/confdefs/extensions.h
index 83d690d50a..6492407934 100644
--- a/cpukit/include/rtems/confdefs/extensions.h
+++ b/cpukit/include/rtems/confdefs/extensions.h
@@ -93,6 +93,10 @@
   #include <rtems/stackchk.h>
 #endif
 
+#ifdef CONFIGURE_EXCEPTION_TO_SIGNAL_MAPPING
+  #include <rtems/score/exception.h>
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -103,6 +107,9 @@ extern "C" {
   || defined(CONFIGURE_INITIAL_EXTENSIONS) \
   || defined(BSP_INITIAL_EXTENSION)
   const User_extensions_Table _User_extensions_Initial_extensions[] = {
+    #ifdef CONFIGURE_EXCEPTION_TO_SIGNAL_MAPPING
+      { .fatal = _Exception_Raise_signal },
+    #endif
     #ifdef _CONFIGURE_RECORD_NEED_EXTENSION
       {
         #ifdef CONFIGURE_RECORD_EXTENSIONS_ENABLED
diff --git a/cpukit/include/rtems/score/exception.h b/cpukit/include/rtems/score/exception.h
new file mode 100644
index 0000000000..979a5aae7e
--- /dev/null
+++ b/cpukit/include/rtems/score/exception.h
@@ -0,0 +1,71 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSScoreException
+ *
+ * @brief This header file provides the interfaces for mapping
+ *   exceptions to signsls.
+ */
+
+/*
+ * Copyright (C) 2021 On-Line Applications Research Corporation (OAR)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _RTEMS_EXCEPTION_H
+#define _RTEMS_EXCEPTION_H
+
+#include <rtems/fatal.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup RTEMSScoreException Exception Mapping Interfaces
+ *
+ * @ingroup RTEMSScore
+ *
+ * @brief This group contains the interfaces for mapping machine exceptions to
+ *   signals using the fatal error handler.
+ */
+
+/**
+ * @brief Handle an exception frame for the purpose of mapping signals
+ *
+ * See CONFIGURE_EXCEPTION_TO_SIGNAL_MAPPING documentation in the
+ * "RTEMS Classic API Guide".
+ */
+void _Exception_Raise_signal(
+  Internal_errors_Source source,
+  bool                   always_set_to_false,
+  Internal_errors_t      code
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTEMS_EXCEPTION_H */
diff --git a/cpukit/score/src/exceptionmapping.c b/cpukit/score/src/exceptionmapping.c
new file mode 100644
index 0000000000..1baa047eb7
--- /dev/null
+++ b/cpukit/score/src/exceptionmapping.c
@@ -0,0 +1,104 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSScoreExceptionMapping
+ *
+ * @brief AArch64 machine exception to POSIX signal mapping.
+ */
+
+/*
+ * Copyright (C) 2021 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore at oarcorp.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <pthread.h>
+#include <signal.h>
+#include <rtems/score/exception.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadimpl.h>
+
+static _Thread_local int           raise_signal;
+static _Thread_local Thread_Action _Exception_Raise_signal_action;
+
+static void _Exception_Raise_handler(
+  Thread_Control   *executing,
+  Thread_Action    *action,
+  ISR_lock_Context *lock_context
+)
+{
+  _Thread_State_release( executing, lock_context );
+  raise( raise_signal );
+  _Thread_State_acquire( executing, lock_context );
+}
+
+/*
+ * 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;
+  Per_CPU_Control     *cpu_self = _Per_CPU_Get();
+  bool                 system_up;
+
+  if ( source != RTEMS_FATAL_SOURCE_EXCEPTION ) {
+    return;
+  }
+
+  /* If the CPU isn't UP yet, there isn't anything to send a signal to */
+#ifdef RTEMS_SMP
+  system_up = ( _Per_CPU_Get_state( cpu_self ) == PER_CPU_STATE_UP );
+#else
+  system_up = ( _System_state_Get == SYSTEM_STATE_UP );
+#endif
+
+  if ( !system_up ) {
+    return;
+  }
+
+  ef = (rtems_exception_frame *) code;
+  raise_signal = _CPU_Exception_frame_get_signal( ef );
+
+  if ( raise_signal < 0 ) {
+    return;
+  }
+
+  _Thread_Add_post_switch_action(
+    _Per_CPU_Get_executing( cpu_self ),
+    &_Exception_Raise_signal_action,
+    _Exception_Raise_handler
+  );
+
+  /* Disable thread dispatch so that dispatch can occur */
+  _CPU_Exception_disable_thread_dispatch();
+
+  /* Perform dispatch and resume execution */
+  _CPU_Exception_dispatch_and_resume( ef );
+}
diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml
index 2017ab058c..2b25b5dcce 100644
--- a/spec/build/cpukit/librtemscpu.yml
+++ b/spec/build/cpukit/librtemscpu.yml
@@ -343,6 +343,7 @@ install:
   - cpukit/include/rtems/score/coresem.h
   - cpukit/include/rtems/score/coresemimpl.h
   - cpukit/include/rtems/score/cpustdatomic.h
+  - cpukit/include/rtems/score/exception.h
   - cpukit/include/rtems/score/freechain.h
   - cpukit/include/rtems/score/hash.h
   - cpukit/include/rtems/score/heap.h
@@ -497,6 +498,8 @@ links:
   uid: objdl
 - role: build-dependency
   uid: objdrvmgr
+- role: build-dependency
+  uid: objexceptionmapping
 - role: build-dependency
   uid: objgnat
 - role: build-dependency
diff --git a/spec/build/cpukit/objexceptionmapping.yml b/spec/build/cpukit/objexceptionmapping.yml
new file mode 100644
index 0000000000..40f559c73f
--- /dev/null
+++ b/spec/build/cpukit/objexceptionmapping.yml
@@ -0,0 +1,15 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+build-type: objects
+cflags: []
+copyrights:
+- Copyright (C) 2021 On-Line Applications Research (OAR)
+cppflags: []
+cxxflags: []
+enabled-by:
+- RTEMS_EXCEPTION_EXTENSIONS
+includes: []
+install: []
+links: []
+source:
+- cpukit/score/src/exceptionmapping.c
+type: build
-- 
2.30.2



More information about the devel mailing list