[PATCH v3 1/5] cpukit: Add exception extensions

Kinsey Moore kinsey.moore at oarcorp.com
Wed Oct 27 21:44:03 UTC 2021


This adds the set of functions necessary to allow more generic handling
of machine exceptions. This initial patch offers the ability to
manipulate a CPU_Exception_frame and resume execution using that
exception information with or without thread dispatch. These functions
are gated behind the RTEMS_EXCEPTION_EXTENSIONS configuration option.
---
 .../cpu/no_cpu/include/rtems/score/cpu.h      | 78 +++++++++++++++++++
 spec/build/cpukit/cpuopts.yml                 |  2 +
 spec/build/cpukit/optexceptionextensions.yml  | 18 +++++
 3 files changed, 98 insertions(+)
 create mode 100644 spec/build/cpukit/optexceptionextensions.yml

diff --git a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
index e224a5e56e..f9afbe7243 100644
--- a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
@@ -1142,6 +1142,84 @@ typedef struct {
  */
 void _CPU_Exception_frame_print( const CPU_Exception_frame *frame );
 
+#ifdef RTEMS_EXCEPTION_EXTENSIONS
+  /**
+   * @brief Resumes normal execution using the provided exception frame.
+   *
+   * This routine helps to avoid dead code in the exception handler epilogue and
+   * does not return. This routine may assume that the provided pointer is valid
+   * for resetting the exception stack.
+   *
+   * @param exception_frame The CPU_Exception_frame describing the machine
+   * exception.
+   */
+  RTEMS_NO_RETURN void _CPU_Exception_resume( CPU_Exception_frame *ef );
+
+  /**
+   * @brief Performs thread dispatch and resumes normal execution.
+   *
+   * This routine helps to avoid dead code in the exception handler epilogue and
+   * does not return. This routine may assume that the provided pointer is valid
+   * for resetting the exception stack. This function is expected to decrement
+   * the ISR nest level and thread dispatch disable level in the Per_CPU_Control
+   * structure.
+   *
+   * @param exception_frame The CPU_Exception_frame describing the machine
+   * exception.
+   */
+  RTEMS_NO_RETURN void _CPU_Exception_dispatch_and_resume( CPU_Exception_frame *ef );
+
+  /**
+   * @brief Disables thread dispatch.
+   *
+   * This must be called before calling _CPU_Exception_dispatch_and_resume
+   * since that function is expected to reduce the levels incremented below.
+   *
+   * @param exception_frame The CPU_Exception_frame describing the machine
+   * exception.
+   */
+  void _CPU_Exception_disable_thread_dispatch( void );
+
+  /**
+   * @brief Retrieves the generic exception class of the machine exception.
+   *
+   * @param exception_frame The CPU_Exception_frame describing the machine
+   * exception.
+   * @return The signal associated with the CPU_Exception_frame.
+   */
+  int _CPU_Exception_frame_get_signal( CPU_Exception_frame *ef );
+
+  /**
+   * @brief Sets the execution address of the exception frame.
+   *
+   * @param exception_frame The CPU_Exception_frame describing the machine
+   * exception.
+   */
+  void _CPU_Exception_frame_set_resume( CPU_Exception_frame *ef, void *address );
+
+  /**
+   * @brief Sets the execution address of the exception frame to the next
+   * instruction.
+   *
+   * @param exception_frame The CPU_Exception_frame describing the machine
+   * exception.
+   */
+  void _CPU_Exception_frame_set_resume_next_instruction( CPU_Exception_frame *ef );
+
+  /**
+   * @brief Copies data to the new exception frame from the old exception frame.
+   *
+   * @param old_ef The existing CPU_Exception_frame describing the machine
+   * exception.
+   * @param new_ef The new CPU_Exception_frame describing the machine
+   * exception.
+   */
+  void _CPU_Exception_frame_copy(
+    CPU_Exception_frame *new_ef,
+    CPU_Exception_frame *old_ef
+  );
+#endif
+
 /**
  * @defgroup RTEMSScoreCPUExampleCPUEndian CPUEndian
  * 
diff --git a/spec/build/cpukit/cpuopts.yml b/spec/build/cpukit/cpuopts.yml
index 908c65d3b9..301d49ccea 100644
--- a/spec/build/cpukit/cpuopts.yml
+++ b/spec/build/cpukit/cpuopts.yml
@@ -39,6 +39,8 @@ links:
   uid: optdebug
 - role: build-dependency
   uid: optdrvmgr
+- role: build-dependency
+  uid: optexceptionextensions
 - role: build-dependency
   uid: optmpci
 - role: build-dependency
diff --git a/spec/build/cpukit/optexceptionextensions.yml b/spec/build/cpukit/optexceptionextensions.yml
new file mode 100644
index 0000000000..1bc6d8686f
--- /dev/null
+++ b/spec/build/cpukit/optexceptionextensions.yml
@@ -0,0 +1,18 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+actions:
+- get-boolean: null
+- env-enable: null
+- define-condition: null
+build-type: option
+copyrights:
+- Copyright (C) 2021 On-Line Applications Research (OAR)
+default: true
+default-by-family: []
+default-by-variant: []
+description: |
+  Enable the RTEMS Exception Extensions for manipulating and acting on exception
+  frames.
+enabled-by:
+links: []
+name: RTEMS_EXCEPTION_EXTENSIONS
+type: build
-- 
2.30.2



More information about the devel mailing list