On 10/28/2021 01:00, Sebastian Huber wrote:


On 27/10/2021 23:44, Kinsey Moore wrote:
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

What is the purpose of this option? Who controls it. Who is supposed to use it?

The way this feature is implemented, an application which doesn't use it will not get it linked in. So, from my point of view we don't need an API visible option.
This is an option built similarly to RTEMS_SMP and is enabled on a per-architecture basis. It is primarily used to control whether the tests that use this functionality get built, but since it was available I applied it here, too, so warnings are generated if someone tries to use any of these functions on an architecture that doesn't support it.

+  /**
+   * @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 );

The parameter name in the function signature and the documentation should match. Also abbreviations are normally not used in the score. Maybe just use "frame".
Thanks, I'll fix this.

+
+  /**
+   * @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 );

Mabye name it _CPU_Exception_frame_make_resume_next_instruction() since there is no parameter with a value.
I'll update this name.

+
+  /**
+   * @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
+  );

If not used, then please remove it.
This is used from the assembly implementation of the thread dispatch epilogue variant to copy the exception frame on to the thread stack. I suppose it could be done with memcpy instead since that is what the AArch64 implementation compiles down to.


Kinsey

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to