[rtems-central commit] spec: Specify the global construction

Sebastian Huber sebh at rtems.org
Tue May 9 13:45:27 UTC 2023


Module:    rtems-central
Branch:    master
Commit:    3104df6442f0554896d81a09ccc7c150c6616608
Changeset: http://git.rtems.org/rtems-central/commit/?id=3104df6442f0554896d81a09ccc7c150c6616608

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri May  5 14:41:20 2023 +0200

spec: Specify the global construction

---

 .../global-construction-classic-before-entry.yml   | 15 ++++
 .../thread/req/global-construction-classic.yml     | 15 ++++
 .../req/global-construction-constructors.yml       | 15 ++++
 ...struction-preinit-array-before-constructors.yml | 17 +++++
 .../req/global-construction-preinit-array.yml      | 17 +++++
 spec/score/thread/req/global-construction.yml      | 14 ++++
 spec/score/thread/val/preinit-array.yml            | 85 ++++++++++++++++++++++
 spec/score/thread/val/thread.yml                   | 43 +++++++++++
 8 files changed, 221 insertions(+)

diff --git a/spec/score/thread/req/global-construction-classic-before-entry.yml b/spec/score/thread/req/global-construction-classic-before-entry.yml
new file mode 100644
index 00000000..b12efe16
--- /dev/null
+++ b/spec/score/thread/req/global-construction-classic-before-entry.yml
@@ -0,0 +1,15 @@
+SPDX-License-Identifier: CC-BY-SA-4.0
+copyrights:
+- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: global-construction
+functional-type: function
+rationale: null
+references: []
+requirement-type: functional
+text: |
+  Where the global construction is done by the Classic API user initialization
+  task, the global construction shall be done before the task entry is called.
+type: requirement
diff --git a/spec/score/thread/req/global-construction-classic.yml b/spec/score/thread/req/global-construction-classic.yml
new file mode 100644
index 00000000..2a6b8af5
--- /dev/null
+++ b/spec/score/thread/req/global-construction-classic.yml
@@ -0,0 +1,15 @@
+SPDX-License-Identifier: CC-BY-SA-4.0
+copyrights:
+- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: global-construction
+functional-type: function
+rationale: null
+references: []
+requirement-type: functional
+text: |
+  Where the Classic API user initialization task is configured, the global
+  construction shall be done by the Classic API user initialization task.
+type: requirement
diff --git a/spec/score/thread/req/global-construction-constructors.yml b/spec/score/thread/req/global-construction-constructors.yml
new file mode 100644
index 00000000..a4eb7822
--- /dev/null
+++ b/spec/score/thread/req/global-construction-constructors.yml
@@ -0,0 +1,15 @@
+SPDX-License-Identifier: CC-BY-SA-4.0
+copyrights:
+- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: global-construction
+functional-type: function
+rationale: null
+references: []
+requirement-type: functional
+text: |
+  When the global construction is done, the global constructors shall be
+  called.
+type: requirement
diff --git a/spec/score/thread/req/global-construction-preinit-array-before-constructors.yml b/spec/score/thread/req/global-construction-preinit-array-before-constructors.yml
new file mode 100644
index 00000000..094892f1
--- /dev/null
+++ b/spec/score/thread/req/global-construction-preinit-array-before-constructors.yml
@@ -0,0 +1,17 @@
+SPDX-License-Identifier: CC-BY-SA-4.0
+copyrights:
+- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by:
+- arm
+- riscv
+links:
+- role: requirement-refinement
+  uid: global-construction
+functional-type: function
+rationale: null
+references: []
+requirement-type: functional
+text: |
+  The handlers registered in the ``.preinit_array`` table shall be called
+  before the global constructors.
+type: requirement
diff --git a/spec/score/thread/req/global-construction-preinit-array.yml b/spec/score/thread/req/global-construction-preinit-array.yml
new file mode 100644
index 00000000..cbb34175
--- /dev/null
+++ b/spec/score/thread/req/global-construction-preinit-array.yml
@@ -0,0 +1,17 @@
+SPDX-License-Identifier: CC-BY-SA-4.0
+copyrights:
+- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by:
+- arm
+- riscv
+links:
+- role: requirement-refinement
+  uid: global-construction
+functional-type: function
+rationale: null
+references: []
+requirement-type: functional
+text: |
+  When the global construction is done, the handlers registered in the
+  ``.preinit_array`` table shall be called.
+type: requirement
diff --git a/spec/score/thread/req/global-construction.yml b/spec/score/thread/req/global-construction.yml
new file mode 100644
index 00000000..aef6d8d8
--- /dev/null
+++ b/spec/score/thread/req/global-construction.yml
@@ -0,0 +1,14 @@
+SPDX-License-Identifier: CC-BY-SA-4.0
+copyrights:
+- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by: true
+links:
+- role: requirement-refinement
+  uid: ../if/group
+functional-type: function
+rationale: null
+references: []
+requirement-type: functional
+text: |
+  The global construction shall be supported.
+type: requirement
diff --git a/spec/score/thread/val/preinit-array.yml b/spec/score/thread/val/preinit-array.yml
new file mode 100644
index 00000000..a7436360
--- /dev/null
+++ b/spec/score/thread/val/preinit-array.yml
@@ -0,0 +1,85 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+copyrights:
+- Copyright (C) 2022 embedded brains GmbH (http://www.embedded-brains.de)
+enabled-by:
+- arm
+- riscv
+links: []
+test-actions:
+- action-brief: |
+    Validate the ``.preinit_array`` constructor invocation.  Mark that the test
+    case executed.
+  action-code: |
+    test_case_executed = true;
+  checks:
+  - brief: |
+      Check that the ``.preinit_array`` constructor was called exactly once.
+    code: |
+      T_eq_u32( constructor_calls, 1 );
+    links:
+    - role: validation
+      uid: ../req/global-construction-preinit-array
+  - brief: |
+      Check that the ``.preeinit_array`` construction was done by the Classic
+      API user initialization task.
+    code: |
+      T_eq_u32( constructor_id, rtems_task_self() );
+    links:
+    - role: validation
+      uid: ../req/global-construction-classic
+  - brief: |
+      Check that the ``.preinit_array`` constructor was called before the
+      global constructor invocations.
+    code: |
+      T_eq_u32( constructor_counter, 1 );
+      T_eq_u32( normal_constructor_counter, 2 );
+    links:
+    - role: validation
+      uid: ../req/global-construction-preinit-array-before-constructors
+  links: []
+test-brief: |
+  Tests the ``.preinit_array`` constructor handling of the C runtime support.
+test-context: []
+test-context-support: null
+test-description: null
+test-header: null
+test-includes:
+- rtems.h
+test-local-includes: []
+test-setup: null
+test-stop: null
+test-support: |
+  static bool test_case_executed;
+
+  static bool constructor_test_case_executed;
+
+  static uint32_t counter;
+
+  static uint32_t normal_constructor_counter;
+
+  static uint32_t constructor_counter;
+
+  static uint32_t constructor_calls;
+
+  static rtems_id constructor_id;
+
+  static __attribute__(( __constructor__ )) void NormalConstructor( void )
+  {
+    ++counter;
+    normal_constructor_counter = counter;
+  }
+
+  static void Constructor( void )
+  {
+    constructor_test_case_executed = test_case_executed;
+    ++counter;
+    constructor_counter = counter;
+    ++constructor_calls;
+    constructor_id = rtems_task_self();
+  }
+
+  static RTEMS_USED RTEMS_SECTION( ".preinit_array" ) void
+    ( * const constructor_registration )( void ) = Constructor;
+test-target: testsuites/validation/tc-preinit-array.c
+test-teardown: null
+type: test-case
diff --git a/spec/score/thread/val/thread.yml b/spec/score/thread/val/thread.yml
index ca735df8..2a5d2f23 100644
--- a/spec/score/thread/val/thread.yml
+++ b/spec/score/thread/val/thread.yml
@@ -115,6 +115,34 @@ test-actions:
       RestoreRunnerPriority();
     links: []
   links: []
+- action-brief: |
+    Validate the global construction.  Mark that the test case executed.
+  action-code: |
+    test_case_executed = true;
+  checks:
+  - brief: |
+      Check that the global constructor was called exactly once.
+    code: |
+      T_eq_u32( constructor_calls, 1 );
+    links:
+    - role: validation
+      uid: ../req/global-construction-constructors
+  - brief: |
+      Check that the global construction was done by the Classic API user
+      initialization task.
+    code: |
+      T_eq_u32( constructor_id, rtems_task_self() );
+    links:
+    - role: validation
+      uid: ../req/global-construction-classic
+  - brief: |
+      Check that the global constructor was called before the task entry.
+    code: |
+      T_false( constructor_test_case_executed );
+    links:
+    - role: validation
+      uid: ../req/global-construction-classic-before-entry
+  links: []
 test-brief: |
   Tests general thread behaviour.
 test-context:
@@ -148,6 +176,21 @@ test-stop: null
 test-support: |
   typedef ${.:/test-context-type} Context;
 
+  static bool test_case_executed;
+
+  static bool constructor_test_case_executed;
+
+  static uint32_t constructor_calls;
+
+  static rtems_id constructor_id;
+
+  static __attribute__(( __constructor__ )) void Constructor( void )
+  {
+    constructor_test_case_executed = test_case_executed;
+    ++constructor_calls;
+    constructor_id = rtems_task_self();
+  }
+
   static void TaskTerminate( rtems_tcb *executing )
   {
     Context *ctx;



More information about the vc mailing list