summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--spec/build/testsuites/validation/grp.yml2
-rw-r--r--spec/build/testsuites/validation/performance-no-clock-0.yml1
-rw-r--r--spec/build/testsuites/validation/validation-0.yml2
-rw-r--r--spec/build/testsuites/validation/validation-1.yml3
-rw-r--r--spec/build/testsuites/validation/validation-no-clock-0.yml20
-rw-r--r--spec/build/testsuites/validation/validation-one-cpu-0.yml5
-rw-r--r--spec/build/testsuites/validation/validation-one-cpu-1.yml20
-rw-r--r--testsuites/validation/tc-task-construct-errors.c1207
-rw-r--r--testsuites/validation/tc-task-construct.c4950
-rw-r--r--testsuites/validation/tc-task-create-errors.c10
-rw-r--r--testsuites/validation/tc-task-delete.c4870
-rw-r--r--testsuites/validation/tc-task-exit.c979
-rw-r--r--testsuites/validation/tc-task-get-affinity.c520
-rw-r--r--testsuites/validation/tc-task-get-priority.c620
-rw-r--r--testsuites/validation/tc-task-get-scheduler.c420
-rw-r--r--testsuites/validation/tc-task-ident.c359
-rw-r--r--testsuites/validation/tc-task-is-suspended.c430
-rw-r--r--testsuites/validation/tc-task-mode.c2019
-rw-r--r--testsuites/validation/tc-task-performance.c1066
-rw-r--r--testsuites/validation/tc-task-restart.c2760
-rw-r--r--testsuites/validation/tc-task-resume.c411
-rw-r--r--testsuites/validation/tc-task-set-affinity.c684
-rw-r--r--testsuites/validation/tc-task-set-priority.c816
-rw-r--r--testsuites/validation/tc-task-set-scheduler.c1492
-rw-r--r--testsuites/validation/tc-task-start.c859
-rw-r--r--testsuites/validation/tc-task-storage-size.c428
-rw-r--r--testsuites/validation/tc-task-suspend.c411
-rw-r--r--testsuites/validation/tc-task-wake-after.c574
-rw-r--r--testsuites/validation/tc-task-wake-when.c665
-rw-r--r--testsuites/validation/tc-task.c305
-rw-r--r--testsuites/validation/ts-validation-one-cpu-1.c80
31 files changed, 25772 insertions, 1216 deletions
diff --git a/spec/build/testsuites/validation/grp.yml b/spec/build/testsuites/validation/grp.yml
index 019cbf027e..6aea4b4153 100644
--- a/spec/build/testsuites/validation/grp.yml
+++ b/spec/build/testsuites/validation/grp.yml
@@ -51,6 +51,8 @@ links:
- role: build-dependency
uid: validation-one-cpu-0
- role: build-dependency
+ uid: validation-one-cpu-1
+- role: build-dependency
uid: validation-smp-only-0
- role: build-dependency
uid: validation-smp-only-1
diff --git a/spec/build/testsuites/validation/performance-no-clock-0.yml b/spec/build/testsuites/validation/performance-no-clock-0.yml
index c8821d5cd4..5102bbb7e3 100644
--- a/spec/build/testsuites/validation/performance-no-clock-0.yml
+++ b/spec/build/testsuites/validation/performance-no-clock-0.yml
@@ -16,6 +16,7 @@ source:
- testsuites/validation/tc-message-performance.c
- testsuites/validation/tc-part-performance.c
- testsuites/validation/tc-sem-performance.c
+- testsuites/validation/tc-task-performance.c
- testsuites/validation/ts-performance-no-clock-0.c
stlib: []
target: testsuites/validation/ts-performance-no-clock-0.exe
diff --git a/spec/build/testsuites/validation/validation-0.yml b/spec/build/testsuites/validation/validation-0.yml
index b56f031b4c..c8e6d3b588 100644
--- a/spec/build/testsuites/validation/validation-0.yml
+++ b/spec/build/testsuites/validation/validation-0.yml
@@ -14,8 +14,6 @@ source:
- testsuites/validation/tc-acfg-appl-needs-clock-driver.c
- testsuites/validation/tc-event-send-receive.c
- testsuites/validation/tc-object.c
-- testsuites/validation/tc-task-construct-errors.c
-- testsuites/validation/tc-task-create-errors.c
- testsuites/validation/tr-event-send-receive.c
- testsuites/validation/ts-validation-0.c
stlib: []
diff --git a/spec/build/testsuites/validation/validation-1.yml b/spec/build/testsuites/validation/validation-1.yml
index e98a5b86f6..4306f71c00 100644
--- a/spec/build/testsuites/validation/validation-1.yml
+++ b/spec/build/testsuites/validation/validation-1.yml
@@ -11,8 +11,7 @@ includes: []
ldflags: []
links: []
source:
-- testsuites/validation/tc-task-construct-errors.c
-- testsuites/validation/tc-task-create-errors.c
+- testsuites/validation/tc-task-construct.c
- testsuites/validation/ts-validation-1.c
stlib: []
target: testsuites/validation/ts-validation-1.exe
diff --git a/spec/build/testsuites/validation/validation-no-clock-0.yml b/spec/build/testsuites/validation/validation-no-clock-0.yml
index a90366900c..1e05048e7e 100644
--- a/spec/build/testsuites/validation/validation-no-clock-0.yml
+++ b/spec/build/testsuites/validation/validation-no-clock-0.yml
@@ -73,6 +73,26 @@ source:
- testsuites/validation/tc-signal-catch.c
- testsuites/validation/tc-signals.c
- testsuites/validation/tc-signal-send.c
+- testsuites/validation/tc-task.c
+- testsuites/validation/tc-task-create-errors.c
+- testsuites/validation/tc-task-delete.c
+- testsuites/validation/tc-task-exit.c
+- testsuites/validation/tc-task-get-affinity.c
+- testsuites/validation/tc-task-get-priority.c
+- testsuites/validation/tc-task-get-scheduler.c
+- testsuites/validation/tc-task-ident.c
+- testsuites/validation/tc-task-is-suspended.c
+- testsuites/validation/tc-task-mode.c
+- testsuites/validation/tc-task-restart.c
+- testsuites/validation/tc-task-resume.c
+- testsuites/validation/tc-task-set-affinity.c
+- testsuites/validation/tc-task-set-priority.c
+- testsuites/validation/tc-task-set-scheduler.c
+- testsuites/validation/tc-task-start.c
+- testsuites/validation/tc-task-storage-size.c
+- testsuites/validation/tc-task-suspend.c
+- testsuites/validation/tc-task-wake-after.c
+- testsuites/validation/tc-task-wake-when.c
- testsuites/validation/tr-event-constant.c
- testsuites/validation/tr-mtx-seize-try.c
- testsuites/validation/tr-mtx-seize-wait.c
diff --git a/spec/build/testsuites/validation/validation-one-cpu-0.yml b/spec/build/testsuites/validation/validation-one-cpu-0.yml
index bcea57fee9..6219dcde3e 100644
--- a/spec/build/testsuites/validation/validation-one-cpu-0.yml
+++ b/spec/build/testsuites/validation/validation-one-cpu-0.yml
@@ -22,6 +22,11 @@ source:
- testsuites/validation/tc-signal-catch.c
- testsuites/validation/tc-signal-send.c
- testsuites/validation/tc-score-fatal.c
+- testsuites/validation/tc-task-create-errors.c
+- testsuites/validation/tc-task-mode.c
+- testsuites/validation/tc-task-set-affinity.c
+- testsuites/validation/tc-task-set-priority.c
+- testsuites/validation/tc-task-wake-after.c
- testsuites/validation/ts-validation-one-cpu-0.c
stlib: []
target: testsuites/validation/ts-validation-one-cpu-0.exe
diff --git a/spec/build/testsuites/validation/validation-one-cpu-1.yml b/spec/build/testsuites/validation/validation-one-cpu-1.yml
new file mode 100644
index 0000000000..e081dab660
--- /dev/null
+++ b/spec/build/testsuites/validation/validation-one-cpu-1.yml
@@ -0,0 +1,20 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+build-type: test-program
+cflags: []
+copyrights:
+- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+cppflags: []
+cxxflags: []
+enabled-by: true
+features: c cprogram
+includes: []
+ldflags: []
+links: []
+source:
+- testsuites/validation/tc-task-construct.c
+- testsuites/validation/ts-validation-one-cpu-1.c
+stlib: []
+target: testsuites/validation/ts-validation-one-cpu-1.exe
+type: build
+use-after: []
+use-before: []
diff --git a/testsuites/validation/tc-task-construct-errors.c b/testsuites/validation/tc-task-construct-errors.c
deleted file mode 100644
index e6f8c5faa5..0000000000
--- a/testsuites/validation/tc-task-construct-errors.c
+++ /dev/null
@@ -1,1207 +0,0 @@
-/* SPDX-License-Identifier: BSD-2-Clause */
-
-/**
- * @file
- *
- * @ingroup RTEMSTestCaseRtemsTaskReqConstructErrors
- */
-
-/*
- * Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de)
- *
- * 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.
- */
-
-/*
- * This file is part of the RTEMS quality process and was automatically
- * generated. If you find something that needs to be fixed or
- * worded better please post a report or patch to an RTEMS mailing list
- * or raise a bug report:
- *
- * https://www.rtems.org/bugs.html
- *
- * For information on updating and regenerating please refer to the How-To
- * section in the Software Requirements Engineering chapter of the
- * RTEMS Software Engineering manual. The manual is provided as a part of
- * a release. For development sources please refer to the online
- * documentation at:
- *
- * https://docs.rtems.org
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <rtems.h>
-#include <string.h>
-#include <rtems/score/apimutex.h>
-#include <rtems/score/threadimpl.h>
-
-#include <rtems/test.h>
-
-/**
- * @defgroup RTEMSTestCaseRtemsTaskReqConstructErrors \
- * spec:/rtems/task/req/construct-errors
- *
- * @ingroup RTEMSTestSuiteTestsuitesValidation0
- * @ingroup RTEMSTestSuiteTestsuitesValidation1
- *
- * @{
- */
-
-typedef enum {
- RtemsTaskReqConstructErrors_Pre_Config_Valid,
- RtemsTaskReqConstructErrors_Pre_Config_Null,
- RtemsTaskReqConstructErrors_Pre_Config_NA
-} RtemsTaskReqConstructErrors_Pre_Config;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Pre_Name_Valid,
- RtemsTaskReqConstructErrors_Pre_Name_Inv,
- RtemsTaskReqConstructErrors_Pre_Name_NA
-} RtemsTaskReqConstructErrors_Pre_Name;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Pre_Id_Valid,
- RtemsTaskReqConstructErrors_Pre_Id_Null,
- RtemsTaskReqConstructErrors_Pre_Id_NA
-} RtemsTaskReqConstructErrors_Pre_Id;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Pre_SysTsk_Yes,
- RtemsTaskReqConstructErrors_Pre_SysTsk_No,
- RtemsTaskReqConstructErrors_Pre_SysTsk_NA
-} RtemsTaskReqConstructErrors_Pre_SysTsk;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Pre_Prio_Valid,
- RtemsTaskReqConstructErrors_Pre_Prio_Zero,
- RtemsTaskReqConstructErrors_Pre_Prio_Inv,
- RtemsTaskReqConstructErrors_Pre_Prio_NA
-} RtemsTaskReqConstructErrors_Pre_Prio;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Pre_Free_Yes,
- RtemsTaskReqConstructErrors_Pre_Free_No,
- RtemsTaskReqConstructErrors_Pre_Free_NA
-} RtemsTaskReqConstructErrors_Pre_Free;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Pre_TLS_Enough,
- RtemsTaskReqConstructErrors_Pre_TLS_Small,
- RtemsTaskReqConstructErrors_Pre_TLS_NA
-} RtemsTaskReqConstructErrors_Pre_TLS;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Pre_Stack_Enough,
- RtemsTaskReqConstructErrors_Pre_Stack_Small,
- RtemsTaskReqConstructErrors_Pre_Stack_NA
-} RtemsTaskReqConstructErrors_Pre_Stack;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Pre_Ext_Ok,
- RtemsTaskReqConstructErrors_Pre_Ext_Err,
- RtemsTaskReqConstructErrors_Pre_Ext_NA
-} RtemsTaskReqConstructErrors_Pre_Ext;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Post_Status_Ok,
- RtemsTaskReqConstructErrors_Post_Status_InvAddr,
- RtemsTaskReqConstructErrors_Post_Status_InvName,
- RtemsTaskReqConstructErrors_Post_Status_InvPrio,
- RtemsTaskReqConstructErrors_Post_Status_InvSize,
- RtemsTaskReqConstructErrors_Post_Status_TooMany,
- RtemsTaskReqConstructErrors_Post_Status_Unsat,
- RtemsTaskReqConstructErrors_Post_Status_NA
-} RtemsTaskReqConstructErrors_Post_Status;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Post_Name_Valid,
- RtemsTaskReqConstructErrors_Post_Name_Invalid,
- RtemsTaskReqConstructErrors_Post_Name_NA
-} RtemsTaskReqConstructErrors_Post_Name;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Post_IdVar_Set,
- RtemsTaskReqConstructErrors_Post_IdVar_Nop,
- RtemsTaskReqConstructErrors_Post_IdVar_NA
-} RtemsTaskReqConstructErrors_Post_IdVar;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Post_CreateExt_Yes,
- RtemsTaskReqConstructErrors_Post_CreateExt_No,
- RtemsTaskReqConstructErrors_Post_CreateExt_NA
-} RtemsTaskReqConstructErrors_Post_CreateExt;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Post_DelExt_Yes,
- RtemsTaskReqConstructErrors_Post_DelExt_No,
- RtemsTaskReqConstructErrors_Post_DelExt_NA
-} RtemsTaskReqConstructErrors_Post_DelExt;
-
-typedef enum {
- RtemsTaskReqConstructErrors_Post_StoFree_Yes,
- RtemsTaskReqConstructErrors_Post_StoFree_No,
- RtemsTaskReqConstructErrors_Post_StoFree_NA
-} RtemsTaskReqConstructErrors_Post_StoFree;
-
-/**
- * @brief Test context for spec:/rtems/task/req/construct-errors test case.
- */
-typedef struct {
- rtems_status_code status;
-
- const rtems_task_config *config;
-
- rtems_task_config config_value;
-
- rtems_id *id;
-
- rtems_id id_value;
-
- bool create_extension_status;
-
- uint32_t create_extension_calls;
-
- uint32_t delete_extension_calls;
-
- uint32_t storage_free_calls;
-
- size_t stack_size;
-
- rtems_id extension_id;
-
- void *seized_objects;
-
- /**
- * @brief This member defines the pre-condition states for the next action.
- */
- size_t pcs[ 9 ];
-
- /**
- * @brief This member indicates if the test action loop is currently
- * executed.
- */
- bool in_action_loop;
-} RtemsTaskReqConstructErrors_Context;
-
-static RtemsTaskReqConstructErrors_Context
- RtemsTaskReqConstructErrors_Instance;
-
-static const char * const RtemsTaskReqConstructErrors_PreDesc_Config[] = {
- "Valid",
- "Null",
- "NA"
-};
-
-static const char * const RtemsTaskReqConstructErrors_PreDesc_Name[] = {
- "Valid",
- "Inv",
- "NA"
-};
-
-static const char * const RtemsTaskReqConstructErrors_PreDesc_Id[] = {
- "Valid",
- "Null",
- "NA"
-};
-
-static const char * const RtemsTaskReqConstructErrors_PreDesc_SysTsk[] = {
- "Yes",
- "No",
- "NA"
-};
-
-static const char * const RtemsTaskReqConstructErrors_PreDesc_Prio[] = {
- "Valid",
- "Zero",
- "Inv",
- "NA"
-};
-
-static const char * const RtemsTaskReqConstructErrors_PreDesc_Free[] = {
- "Yes",
- "No",
- "NA"
-};
-
-static const char * const RtemsTaskReqConstructErrors_PreDesc_TLS[] = {
- "Enough",
- "Small",
- "NA"
-};
-
-static const char * const RtemsTaskReqConstructErrors_PreDesc_Stack[] = {
- "Enough",
- "Small",
- "NA"
-};
-
-static const char * const RtemsTaskReqConstructErrors_PreDesc_Ext[] = {
- "Ok",
- "Err",
- "NA"
-};
-
-static const char * const * const RtemsTaskReqConstructErrors_PreDesc[] = {
- RtemsTaskReqConstructErrors_PreDesc_Config,
- RtemsTaskReqConstructErrors_PreDesc_Name,
- RtemsTaskReqConstructErrors_PreDesc_Id,
- RtemsTaskReqConstructErrors_PreDesc_SysTsk,
- RtemsTaskReqConstructErrors_PreDesc_Prio,
- RtemsTaskReqConstructErrors_PreDesc_Free,
- RtemsTaskReqConstructErrors_PreDesc_TLS,
- RtemsTaskReqConstructErrors_PreDesc_Stack,
- RtemsTaskReqConstructErrors_PreDesc_Ext,
- NULL
-};
-
-#define NAME rtems_build_name( 'T', 'E', 'S', 'T' )
-
-#define INVALID_ID 0xffffffff
-
-typedef RtemsTaskReqConstructErrors_Context Context;
-
-static _Thread_local int tls_variable;
-
-#define MAX_TLS_SIZE RTEMS_ALIGN_UP( 128, RTEMS_TASK_STORAGE_ALIGNMENT )
-
-RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char task_storage[
- RTEMS_TASK_STORAGE_SIZE(
- MAX_TLS_SIZE + RTEMS_MINIMUM_STACK_SIZE,
- RTEMS_FLOATING_POINT
- )
-];
-
-static const rtems_task_config seize_task_config = {
- .name = rtems_build_name( 'S', 'I', 'Z', 'E' ),
- .initial_priority = 1,
- .storage_area = task_storage,
- .storage_size = sizeof( task_storage ),
- .maximum_thread_local_storage_size = MAX_TLS_SIZE,
- .initial_modes = RTEMS_DEFAULT_MODES,
- .attributes = RTEMS_DEFAULT_MODES
-};
-
-static void StorageFree( void *ptr )
-{
- T_eq_ptr( ptr, task_storage );
- ++RtemsTaskReqConstructErrors_Instance.storage_free_calls;
-}
-
-static rtems_status_code Create( void *arg, uint32_t *id )
-{
- Context *ctx;
- bool create_extension_status;
- rtems_status_code sc;
-
- ctx = arg;
- create_extension_status = ctx->create_extension_status;
- ctx->create_extension_status = true;
- sc = rtems_task_construct( &seize_task_config, id );
- ctx->create_extension_status = create_extension_status;
-
- return sc;
-}
-
-static bool ThreadCreate( rtems_tcb *executing, rtems_tcb *created )
-{
- (void) executing;
- (void) created;
-
- ++RtemsTaskReqConstructErrors_Instance.create_extension_calls;
- return RtemsTaskReqConstructErrors_Instance.create_extension_status;
-}
-
-static void ThreadDelete( rtems_tcb *executing, rtems_tcb *deleted )
-{
- (void) executing;
- (void) deleted;
-
- ++RtemsTaskReqConstructErrors_Instance.delete_extension_calls;
-}
-
-static const rtems_extensions_table extensions = {
- .thread_create = ThreadCreate,
- .thread_delete = ThreadDelete
-};
-
-static void RtemsTaskReqConstructErrors_Pre_Config_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Pre_Config state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Pre_Config_Valid: {
- /*
- * While the ``config`` parameter references an object of type
- * rtems_task_config.
- */
- ctx->config = &ctx->config_value;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Config_Null: {
- /*
- * While the ``config`` parameter is NULL.
- */
- ctx->config = NULL;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Config_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Pre_Name_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Pre_Name state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Pre_Name_Valid: {
- /*
- * While the name of the task configuration is valid.
- */
- ctx->config_value.name = NAME;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Name_Inv: {
- /*
- * While the name of the task configuration is invalid.
- */
- ctx->config_value.name = 0;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Name_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Pre_Id_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Pre_Id state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Pre_Id_Valid: {
- /*
- * While the ``id`` parameter references an object of type rtems_id.
- */
- ctx->id = &ctx->id_value;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Id_Null: {
- /*
- * While the ``id`` parameter is NULL.
- */
- ctx->id = NULL;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Id_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Pre_SysTsk_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Pre_SysTsk state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Pre_SysTsk_Yes: {
- /*
- * While the attributes of the task configuration specifies a system
- * task.
- */
- ctx->config_value.attributes |= RTEMS_SYSTEM_TASK;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_SysTsk_No: {
- /*
- * While the attributes of the task configuration specifies an
- * application task.
- */
- /* Nothing to do */
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_SysTsk_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Pre_Prio_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Pre_Prio state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Pre_Prio_Valid: {
- /*
- * While the initial priority of the task configuration is valid and
- * non-zero.
- */
- ctx->config_value.initial_priority = 254;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Prio_Zero: {
- /*
- * While the initial priority of the task configuration is zero.
- */
- ctx->config_value.initial_priority = 0;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Prio_Inv: {
- /*
- * While the initial priority of the task configuration is invalid.
- */
- ctx->config_value.initial_priority = 0xffffffff;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Prio_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Pre_Free_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Pre_Free state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Pre_Free_Yes: {
- /*
- * While the system has at least one inactive task object available.
- */
- /* Nothing to do */
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Free_No: {
- /*
- * While the system has no inactive task object available.
- */
- ctx->seized_objects = T_seize_objects( Create, ctx );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Free_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Pre_TLS_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Pre_TLS state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Pre_TLS_Enough: {
- /*
- * While the maximum thread-local storage size of the task configuration
- * is greater than or equal to the thread-local storage size.
- */
- ctx->config_value.maximum_thread_local_storage_size = MAX_TLS_SIZE;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_TLS_Small: {
- /*
- * While the maximum thread-local storage size of the task configuration
- * is less than the thread-local storage size.
- */
- ctx->config_value.maximum_thread_local_storage_size = 0;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_TLS_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Pre_Stack_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Pre_Stack state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Pre_Stack_Enough: {
- /*
- * While the task stack size of the task configuration is greater than or
- * equal to the configured minimum size.
- */
- ctx->stack_size = RTEMS_MINIMUM_STACK_SIZE;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Stack_Small: {
- /*
- * While the task stack size of the task configuration is less than the
- * configured minimum size.
- */
- ctx->stack_size = 0;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Stack_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Pre_Ext_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Pre_Ext state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Pre_Ext_Ok: {
- /*
- * While none of the task create extensions fails.
- */
- ctx->create_extension_status = true;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Ext_Err: {
- /*
- * While at least one of the task create extensions fails.
- */
- ctx->create_extension_status = false;
- break;
- }
-
- case RtemsTaskReqConstructErrors_Pre_Ext_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Post_Status_Check(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Post_Status state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Post_Status_Ok: {
- /*
- * The return status of rtems_task_construct() shall be RTEMS_SUCCESSFUL.
- */
- T_rsc_success( ctx->status );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_Status_InvAddr: {
- /*
- * The return status of rtems_task_construct() shall be
- * RTEMS_INVALID_ADDRESS.
- */
- T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_Status_InvName: {
- /*
- * The return status of rtems_task_construct() shall be
- * RTEMS_INVALID_NAME.
- */
- T_rsc( ctx->status, RTEMS_INVALID_NAME );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_Status_InvPrio: {
- /*
- * The return status of rtems_task_construct() shall be
- * RTEMS_INVALID_PRIORITY.
- */
- T_rsc( ctx->status, RTEMS_INVALID_PRIORITY );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_Status_InvSize: {
- /*
- * The return status of rtems_task_construct() shall be
- * RTEMS_INVALID_SIZE.
- */
- T_rsc( ctx->status, RTEMS_INVALID_SIZE );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_Status_TooMany: {
- /*
- * The return status of rtems_task_construct() shall be RTEMS_TOO_MANY.
- */
- T_rsc( ctx->status, RTEMS_TOO_MANY );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_Status_Unsat: {
- /*
- * The return status of rtems_task_construct() shall be
- * RTEMS_UNSATISFIED.
- */
- T_rsc( ctx->status, RTEMS_UNSATISFIED );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_Status_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Post_Name_Check(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Post_Name state
-)
-{
- rtems_status_code sc;
- rtems_id id;
-
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Post_Name_Valid: {
- /*
- * The unique object name shall identify the task constructed by the
- * rtems_task_construct() call.
- */
- id = 0;
- sc = rtems_task_ident( NAME, RTEMS_SEARCH_LOCAL_NODE, &id );
- T_rsc_success( sc );
- T_eq_u32( id, ctx->id_value );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_Name_Invalid: {
- /*
- * The unique object name shall not identify a task.
- */
- sc = rtems_task_ident( NAME, RTEMS_SEARCH_LOCAL_NODE, &id );
- T_rsc( sc, RTEMS_INVALID_NAME );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_Name_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Post_IdVar_Check(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Post_IdVar state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Post_IdVar_Set: {
- /*
- * The value of the object referenced by the ``id`` parameter shall be
- * set to the object identifier of the constructed task after the return
- * of the rtems_task_construct() call.
- */
- T_eq_ptr( ctx->id, &ctx->id_value );
- T_ne_u32( ctx->id_value, INVALID_ID );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_IdVar_Nop: {
- /*
- * Objects referenced by the ``id`` parameter in past calls to
- * rtems_task_construct() shall not be accessed by the
- * rtems_task_construct() call.
- */
- T_eq_u32( ctx->id_value, INVALID_ID );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_IdVar_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Post_CreateExt_Check(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Post_CreateExt state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Post_CreateExt_Yes: {
- /*
- * The create user extensions shall be invoked during the
- * rtems_task_construct() call.
- */
- T_eq_u32( ctx->create_extension_calls, 1 );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_CreateExt_No: {
- /*
- * The create user extensions shall not be invoked during the
- * rtems_task_construct() call.
- */
- T_eq_u32( ctx->create_extension_calls, 0 );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_CreateExt_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Post_DelExt_Check(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Post_DelExt state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Post_DelExt_Yes: {
- /*
- * The delete user extensions shall be invoked during the
- * rtems_task_construct() call.
- */
- T_eq_u32( ctx->delete_extension_calls, 1 );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_DelExt_No: {
- /*
- * The delete user extensions shall not be invoked during the
- * rtems_task_construct() call.
- */
- T_eq_u32( ctx->delete_extension_calls, 0 );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_DelExt_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Post_StoFree_Check(
- RtemsTaskReqConstructErrors_Context *ctx,
- RtemsTaskReqConstructErrors_Post_StoFree state
-)
-{
- switch ( state ) {
- case RtemsTaskReqConstructErrors_Post_StoFree_Yes: {
- /*
- * The storage free handler of the task configuration shall be invoked
- * during the rtems_task_construct() call.
- */
- T_eq_u32( ctx->storage_free_calls, 1 );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_StoFree_No: {
- /*
- * The storage free handler of the task configuration shall not be
- * invoked during the rtems_task_construct() call.
- */
- T_eq_u32( ctx->storage_free_calls, 0 );
- break;
- }
-
- case RtemsTaskReqConstructErrors_Post_StoFree_NA:
- break;
- }
-}
-
-static void RtemsTaskReqConstructErrors_Setup(
- RtemsTaskReqConstructErrors_Context *ctx
-)
-{
- rtems_status_code sc;
- int var;
-
- var = tls_variable;
- RTEMS_OBFUSCATE_VARIABLE( var );
- tls_variable = var;
-
- sc = rtems_extension_create(
- rtems_build_name( 'T', 'E', 'X', 'T' ),
- &extensions,
- &ctx->extension_id
- );
- T_rsc_success( sc );
-}
-
-static void RtemsTaskReqConstructErrors_Setup_Wrap( void *arg )
-{
- RtemsTaskReqConstructErrors_Context *ctx;
-
- ctx = arg;
- ctx->in_action_loop = false;
- RtemsTaskReqConstructErrors_Setup( ctx );
-}
-
-static void RtemsTaskReqConstructErrors_Teardown(
- RtemsTaskReqConstructErrors_Context *ctx
-)
-{
- rtems_status_code sc;
-
- sc = rtems_extension_delete( ctx->extension_id );
- T_rsc_success( sc );
-}
-
-static void RtemsTaskReqConstructErrors_Teardown_Wrap( void *arg )
-{
- RtemsTaskReqConstructErrors_Context *ctx;
-
- ctx = arg;
- ctx->in_action_loop = false;
- RtemsTaskReqConstructErrors_Teardown( ctx );
-}
-
-static void RtemsTaskReqConstructErrors_Prepare(
- RtemsTaskReqConstructErrors_Context *ctx
-)
-{
- _RTEMS_Lock_allocator();
- _Thread_Kill_zombies();
- _RTEMS_Unlock_allocator();
-
- ctx->id_value = INVALID_ID;
- memset( &ctx->config_value, 0, sizeof( ctx->config_value ) );
- ctx->config_value.storage_area = task_storage,
- ctx->config_value.storage_free = StorageFree;
-}
-
-static void RtemsTaskReqConstructErrors_Action(
- RtemsTaskReqConstructErrors_Context *ctx
-)
-{
- ctx->create_extension_calls = 0;
- ctx->delete_extension_calls = 0;
- ctx->storage_free_calls = 0;
- ctx->config_value.storage_size = RTEMS_TASK_STORAGE_SIZE(
- ctx->config_value.maximum_thread_local_storage_size + ctx->stack_size,
- ctx->config_value.attributes
- );
- ctx->status = rtems_task_construct( ctx->config, ctx->id );
-}
-
-static void RtemsTaskReqConstructErrors_Cleanup(
- RtemsTaskReqConstructErrors_Context *ctx
-)
-{
- if ( ctx->id_value != INVALID_ID ) {
- rtems_status_code sc;
-
- sc = rtems_task_delete( ctx->id_value );
- T_rsc_success( sc );
-
- ctx->id_value = INVALID_ID;
- }
-
- T_surrender_objects( &ctx->seized_objects, rtems_task_delete );
-}
-
-typedef struct {
- uint32_t Skip : 1;
- uint32_t Pre_Config_NA : 1;
- uint32_t Pre_Name_NA : 1;
- uint32_t Pre_Id_NA : 1;
- uint32_t Pre_SysTsk_NA : 1;
- uint32_t Pre_Prio_NA : 1;
- uint32_t Pre_Free_NA : 1;
- uint32_t Pre_TLS_NA : 1;
- uint32_t Pre_Stack_NA : 1;
- uint32_t Pre_Ext_NA : 1;
- uint32_t Post_Status : 3;
- uint32_t Post_Name : 2;
- uint32_t Post_IdVar : 2;
- uint32_t Post_CreateExt : 2;
- uint32_t Post_DelExt : 2;
- uint32_t Post_StoFree : 2;
-} RtemsTaskReqConstructErrors_Entry;
-
-static const RtemsTaskReqConstructErrors_Entry
-RtemsTaskReqConstructErrors_Entries[] = {
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- RtemsTaskReqConstructErrors_Post_Status_InvAddr,
- RtemsTaskReqConstructErrors_Post_Name_Invalid,
- RtemsTaskReqConstructErrors_Post_IdVar_Nop,
- RtemsTaskReqConstructErrors_Post_CreateExt_No,
- RtemsTaskReqConstructErrors_Post_DelExt_No,
- RtemsTaskReqConstructErrors_Post_StoFree_No },
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- RtemsTaskReqConstructErrors_Post_Status_InvName,
- RtemsTaskReqConstructErrors_Post_Name_Invalid,
- RtemsTaskReqConstructErrors_Post_IdVar_Nop,
- RtemsTaskReqConstructErrors_Post_CreateExt_No,
- RtemsTaskReqConstructErrors_Post_DelExt_No,
- RtemsTaskReqConstructErrors_Post_StoFree_No },
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- RtemsTaskReqConstructErrors_Post_Status_InvPrio,
- RtemsTaskReqConstructErrors_Post_Name_Invalid,
- RtemsTaskReqConstructErrors_Post_IdVar_Nop,
- RtemsTaskReqConstructErrors_Post_CreateExt_No,
- RtemsTaskReqConstructErrors_Post_DelExt_No,
- RtemsTaskReqConstructErrors_Post_StoFree_No },
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- RtemsTaskReqConstructErrors_Post_Status_TooMany,
- RtemsTaskReqConstructErrors_Post_Name_Invalid,
- RtemsTaskReqConstructErrors_Post_IdVar_Nop,
- RtemsTaskReqConstructErrors_Post_CreateExt_No,
- RtemsTaskReqConstructErrors_Post_DelExt_No,
- RtemsTaskReqConstructErrors_Post_StoFree_No },
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- RtemsTaskReqConstructErrors_Post_Status_InvSize,
- RtemsTaskReqConstructErrors_Post_Name_Invalid,
- RtemsTaskReqConstructErrors_Post_IdVar_Nop,
- RtemsTaskReqConstructErrors_Post_CreateExt_No,
- RtemsTaskReqConstructErrors_Post_DelExt_No,
- RtemsTaskReqConstructErrors_Post_StoFree_No },
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqConstructErrors_Post_Status_Ok,
- RtemsTaskReqConstructErrors_Post_Name_Valid,
- RtemsTaskReqConstructErrors_Post_IdVar_Set,
- RtemsTaskReqConstructErrors_Post_CreateExt_Yes,
- RtemsTaskReqConstructErrors_Post_DelExt_No,
- RtemsTaskReqConstructErrors_Post_StoFree_No },
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- RtemsTaskReqConstructErrors_Post_Status_Unsat,
- RtemsTaskReqConstructErrors_Post_Name_Invalid,
- RtemsTaskReqConstructErrors_Post_IdVar_Nop,
- RtemsTaskReqConstructErrors_Post_CreateExt_Yes,
- RtemsTaskReqConstructErrors_Post_DelExt_Yes,
- RtemsTaskReqConstructErrors_Post_StoFree_Yes }
-};
-
-static const uint8_t
-RtemsTaskReqConstructErrors_Map[] = {
- 5, 6, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 5, 6, 4, 4, 4, 4, 4, 4, 3, 3,
- 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 4, 4,
- 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-static size_t RtemsTaskReqConstructErrors_Scope(
- void *arg,
- char *buf,
- size_t n
-)
-{
- RtemsTaskReqConstructErrors_Context *ctx;
-
- ctx = arg;
-
- if ( ctx->in_action_loop ) {
- return T_get_scope(
- RtemsTaskReqConstructErrors_PreDesc,
- buf,
- n,
- ctx->pcs
- );
- }
-
- return 0;
-}
-
-static T_fixture RtemsTaskReqConstructErrors_Fixture = {
- .setup = RtemsTaskReqConstructErrors_Setup_Wrap,
- .stop = NULL,
- .teardown = RtemsTaskReqConstructErrors_Teardown_Wrap,
- .scope = RtemsTaskReqConstructErrors_Scope,
- .initial_context = &RtemsTaskReqConstructErrors_Instance
-};
-
-static inline RtemsTaskReqConstructErrors_Entry
-RtemsTaskReqConstructErrors_GetEntry( size_t index )
-{
- return RtemsTaskReqConstructErrors_Entries[
- RtemsTaskReqConstructErrors_Map[ index ]
- ];
-}
-
-/**
- * @fn void T_case_body_RtemsTaskReqConstructErrors( void )
- */
-T_TEST_CASE_FIXTURE(
- RtemsTaskReqConstructErrors,
- &RtemsTaskReqConstructErrors_Fixture
-)
-{
- RtemsTaskReqConstructErrors_Context *ctx;
- size_t index;
-
- ctx = T_fixture_context();
- ctx->in_action_loop = true;
- index = 0;
-
- for (
- ctx->pcs[ 0 ] = RtemsTaskReqConstructErrors_Pre_Config_Valid;
- ctx->pcs[ 0 ] < RtemsTaskReqConstructErrors_Pre_Config_NA;
- ++ctx->pcs[ 0 ]
- ) {
- for (
- ctx->pcs[ 1 ] = RtemsTaskReqConstructErrors_Pre_Name_Valid;
- ctx->pcs[ 1 ] < RtemsTaskReqConstructErrors_Pre_Name_NA;
- ++ctx->pcs[ 1 ]
- ) {
- for (
- ctx->pcs[ 2 ] = RtemsTaskReqConstructErrors_Pre_Id_Valid;
- ctx->pcs[ 2 ] < RtemsTaskReqConstructErrors_Pre_Id_NA;
- ++ctx->pcs[ 2 ]
- ) {
- for (
- ctx->pcs[ 3 ] = RtemsTaskReqConstructErrors_Pre_SysTsk_Yes;
- ctx->pcs[ 3 ] < RtemsTaskReqConstructErrors_Pre_SysTsk_NA;
- ++ctx->pcs[ 3 ]
- ) {
- for (
- ctx->pcs[ 4 ] = RtemsTaskReqConstructErrors_Pre_Prio_Valid;
- ctx->pcs[ 4 ] < RtemsTaskReqConstructErrors_Pre_Prio_NA;
- ++ctx->pcs[ 4 ]
- ) {
- for (
- ctx->pcs[ 5 ] = RtemsTaskReqConstructErrors_Pre_Free_Yes;
- ctx->pcs[ 5 ] < RtemsTaskReqConstructErrors_Pre_Free_NA;
- ++ctx->pcs[ 5 ]
- ) {
- for (
- ctx->pcs[ 6 ] = RtemsTaskReqConstructErrors_Pre_TLS_Enough;
- ctx->pcs[ 6 ] < RtemsTaskReqConstructErrors_Pre_TLS_NA;
- ++ctx->pcs[ 6 ]
- ) {
- for (
- ctx->pcs[ 7 ] = RtemsTaskReqConstructErrors_Pre_Stack_Enough;
- ctx->pcs[ 7 ] < RtemsTaskReqConstructErrors_Pre_Stack_NA;
- ++ctx->pcs[ 7 ]
- ) {
- for (
- ctx->pcs[ 8 ] = RtemsTaskReqConstructErrors_Pre_Ext_Ok;
- ctx->pcs[ 8 ] < RtemsTaskReqConstructErrors_Pre_Ext_NA;
- ++ctx->pcs[ 8 ]
- ) {
- RtemsTaskReqConstructErrors_Entry entry;
-
- entry = RtemsTaskReqConstructErrors_GetEntry( index );
- ++index;
-
- RtemsTaskReqConstructErrors_Prepare( ctx );
- RtemsTaskReqConstructErrors_Pre_Config_Prepare(
- ctx,
- ctx->pcs[ 0 ]
- );
- RtemsTaskReqConstructErrors_Pre_Name_Prepare(
- ctx,
- ctx->pcs[ 1 ]
- );
- RtemsTaskReqConstructErrors_Pre_Id_Prepare(
- ctx,
- ctx->pcs[ 2 ]
- );
- RtemsTaskReqConstructErrors_Pre_SysTsk_Prepare(
- ctx,
- ctx->pcs[ 3 ]
- );
- RtemsTaskReqConstructErrors_Pre_Prio_Prepare(
- ctx,
- ctx->pcs[ 4 ]
- );
- RtemsTaskReqConstructErrors_Pre_Free_Prepare(
- ctx,
- ctx->pcs[ 5 ]
- );
- RtemsTaskReqConstructErrors_Pre_TLS_Prepare(
- ctx,
- ctx->pcs[ 6 ]
- );
- RtemsTaskReqConstructErrors_Pre_Stack_Prepare(
- ctx,
- ctx->pcs[ 7 ]
- );
- RtemsTaskReqConstructErrors_Pre_Ext_Prepare(
- ctx,
- ctx->pcs[ 8 ]
- );
- RtemsTaskReqConstructErrors_Action( ctx );
- RtemsTaskReqConstructErrors_Post_Status_Check(
- ctx,
- entry.Post_Status
- );
- RtemsTaskReqConstructErrors_Post_Name_Check(
- ctx,
- entry.Post_Name
- );
- RtemsTaskReqConstructErrors_Post_IdVar_Check(
- ctx,
- entry.Post_IdVar
- );
- RtemsTaskReqConstructErrors_Post_CreateExt_Check(
- ctx,
- entry.Post_CreateExt
- );
- RtemsTaskReqConstructErrors_Post_DelExt_Check(
- ctx,
- entry.Post_DelExt
- );
- RtemsTaskReqConstructErrors_Post_StoFree_Check(
- ctx,
- entry.Post_StoFree
- );
- RtemsTaskReqConstructErrors_Cleanup( ctx );
- }
- }
- }
- }
- }
- }
- }
- }
- }
-}
-
-/** @} */
diff --git a/testsuites/validation/tc-task-construct.c b/testsuites/validation/tc-task-construct.c
new file mode 100644
index 0000000000..2b0c75daa1
--- /dev/null
+++ b/testsuites/validation/tc-task-construct.c
@@ -0,0 +1,4950 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqConstruct
+ */
+
+/*
+ * Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <string.h>
+#include <rtems/score/atomic.h>
+#include <rtems/score/percpu.h>
+#include <rtems/score/threadimpl.h>
+
+#include "ts-config.h"
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqConstruct spec:/rtems/task/req/construct
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidation1
+ * @ingroup RTEMSTestSuiteTestsuitesValidationOneCpu1
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_CPUs_One,
+ RtemsTaskReqConstruct_Pre_CPUs_More,
+ RtemsTaskReqConstruct_Pre_CPUs_NA
+} RtemsTaskReqConstruct_Pre_CPUs;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_Config_Valid,
+ RtemsTaskReqConstruct_Pre_Config_Null,
+ RtemsTaskReqConstruct_Pre_Config_NA
+} RtemsTaskReqConstruct_Pre_Config;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_Name_Valid,
+ RtemsTaskReqConstruct_Pre_Name_Invalid,
+ RtemsTaskReqConstruct_Pre_Name_NA
+} RtemsTaskReqConstruct_Pre_Name;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_Id_Valid,
+ RtemsTaskReqConstruct_Pre_Id_Null,
+ RtemsTaskReqConstruct_Pre_Id_NA
+} RtemsTaskReqConstruct_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_SystemTask_Yes,
+ RtemsTaskReqConstruct_Pre_SystemTask_No,
+ RtemsTaskReqConstruct_Pre_SystemTask_NA
+} RtemsTaskReqConstruct_Pre_SystemTask;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_Priority_Valid,
+ RtemsTaskReqConstruct_Pre_Priority_Zero,
+ RtemsTaskReqConstruct_Pre_Priority_Invalid,
+ RtemsTaskReqConstruct_Pre_Priority_NA
+} RtemsTaskReqConstruct_Pre_Priority;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_Free_Yes,
+ RtemsTaskReqConstruct_Pre_Free_No,
+ RtemsTaskReqConstruct_Pre_Free_NA
+} RtemsTaskReqConstruct_Pre_Free;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_TLS_Enough,
+ RtemsTaskReqConstruct_Pre_TLS_TooSmall,
+ RtemsTaskReqConstruct_Pre_TLS_NA
+} RtemsTaskReqConstruct_Pre_TLS;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_Stack_Enough,
+ RtemsTaskReqConstruct_Pre_Stack_TooSmall,
+ RtemsTaskReqConstruct_Pre_Stack_NA
+} RtemsTaskReqConstruct_Pre_Stack;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_Create_Ok,
+ RtemsTaskReqConstruct_Pre_Create_Error,
+ RtemsTaskReqConstruct_Pre_Create_NA
+} RtemsTaskReqConstruct_Pre_Create;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Pre_FloatingPoint_No,
+ RtemsTaskReqConstruct_Pre_FloatingPoint_NA
+} RtemsTaskReqConstruct_Pre_FloatingPoint;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_Preempt_Yes,
+ RtemsTaskReqConstruct_Pre_Preempt_No,
+ RtemsTaskReqConstruct_Pre_Preempt_NA
+} RtemsTaskReqConstruct_Pre_Preempt;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_Timeslice_Yes,
+ RtemsTaskReqConstruct_Pre_Timeslice_No,
+ RtemsTaskReqConstruct_Pre_Timeslice_NA
+} RtemsTaskReqConstruct_Pre_Timeslice;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_ASR_Yes,
+ RtemsTaskReqConstruct_Pre_ASR_No,
+ RtemsTaskReqConstruct_Pre_ASR_NA
+} RtemsTaskReqConstruct_Pre_ASR;
+
+typedef enum {
+ RtemsTaskReqConstruct_Pre_IntLvl_Zero,
+ RtemsTaskReqConstruct_Pre_IntLvl_Positive,
+ RtemsTaskReqConstruct_Pre_IntLvl_NA
+} RtemsTaskReqConstruct_Pre_IntLvl;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Status_InvAddr,
+ RtemsTaskReqConstruct_Post_Status_InvName,
+ RtemsTaskReqConstruct_Post_Status_InvPrio,
+ RtemsTaskReqConstruct_Post_Status_InvSize,
+ RtemsTaskReqConstruct_Post_Status_TooMany,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Status_NA
+} RtemsTaskReqConstruct_Post_Status;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_Name_NA
+} RtemsTaskReqConstruct_Post_Name;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_IdObj_NA
+} RtemsTaskReqConstruct_Post_IdObj;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_CreateNew_UpToFailing,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_NA
+} RtemsTaskReqConstruct_Post_CreateNew;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA
+} RtemsTaskReqConstruct_Post_DeleteNew;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_KillZombies_No,
+ RtemsTaskReqConstruct_Post_KillZombies_NA
+} RtemsTaskReqConstruct_Post_KillZombies;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_StorageFree_NA
+} RtemsTaskReqConstruct_Post_StorageFree;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA
+} RtemsTaskReqConstruct_Post_FloatingPoint;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Preempt_NA
+} RtemsTaskReqConstruct_Post_Preempt;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_Timeslice_NA
+} RtemsTaskReqConstruct_Post_Timeslice;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_ASR_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_ASR_NA
+} RtemsTaskReqConstruct_Post_ASR;
+
+typedef enum {
+ RtemsTaskReqConstruct_Post_IntLvl_Zero,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive,
+ RtemsTaskReqConstruct_Post_IntLvl_NA
+} RtemsTaskReqConstruct_Post_IntLvl;
+
+typedef struct {
+ uint64_t Skip : 1;
+ uint64_t Pre_CPUs_NA : 1;
+ uint64_t Pre_Config_NA : 1;
+ uint64_t Pre_Name_NA : 1;
+ uint64_t Pre_Id_NA : 1;
+ uint64_t Pre_SystemTask_NA : 1;
+ uint64_t Pre_Priority_NA : 1;
+ uint64_t Pre_Free_NA : 1;
+ uint64_t Pre_TLS_NA : 1;
+ uint64_t Pre_Stack_NA : 1;
+ uint64_t Pre_Create_NA : 1;
+ uint64_t Pre_FloatingPoint_NA : 1;
+ uint64_t Pre_Preempt_NA : 1;
+ uint64_t Pre_Timeslice_NA : 1;
+ uint64_t Pre_ASR_NA : 1;
+ uint64_t Pre_IntLvl_NA : 1;
+ uint64_t Post_Status : 3;
+ uint64_t Post_Name : 2;
+ uint64_t Post_IdObj : 2;
+ uint64_t Post_CreateNew : 2;
+ uint64_t Post_DeleteNew : 2;
+ uint64_t Post_KillZombies : 2;
+ uint64_t Post_StorageFree : 2;
+ uint64_t Post_FloatingPoint : 2;
+ uint64_t Post_Preempt : 2;
+ uint64_t Post_Timeslice : 2;
+ uint64_t Post_ASR : 2;
+ uint64_t Post_IntLvl : 2;
+} RtemsTaskReqConstruct_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/construct test case.
+ */
+typedef struct {
+ /**
+ * @brief This member contains the scheduler B identifier.
+ */
+ rtems_id scheduler_b_id;
+
+ /**
+ * @brief This member contains the thread zombie registry ticket right before
+ * the task exit of the zombie task.
+ */
+ unsigned int thread_zombie_ticket;
+
+ /**
+ * @brief If this member is true, then the zombie thread is ready to get
+ * killed.
+ */
+ volatile bool zombie_ready;;
+
+ /**
+ * @brief This member contains the actual modes of the constructed task.
+ */
+ rtems_mode actual_modes;
+
+ rtems_status_code status;
+
+ const rtems_task_config *config;
+
+ rtems_task_config config_obj;
+
+ rtems_id zombie_id;
+
+ rtems_id *id;
+
+ rtems_id id_obj;
+
+ bool create_extension_status;
+
+ uint32_t create_extension_calls;
+
+ uint32_t delete_extension_calls;
+
+ uint32_t delete_zombie_extension_calls;
+
+ uint32_t storage_free_calls;
+
+ size_t stack_size;
+
+ rtems_id extension_ids[ 2 ];
+
+ void *seized_objects;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 15 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqConstruct_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqConstruct_Context;
+
+static RtemsTaskReqConstruct_Context
+ RtemsTaskReqConstruct_Instance;
+
+static const char * const RtemsTaskReqConstruct_PreDesc_CPUs[] = {
+ "One",
+ "More",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_Config[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_Name[] = {
+ "Valid",
+ "Invalid",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_Id[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_SystemTask[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_Priority[] = {
+ "Valid",
+ "Zero",
+ "Invalid",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_Free[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_TLS[] = {
+ "Enough",
+ "TooSmall",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_Stack[] = {
+ "Enough",
+ "TooSmall",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_Create[] = {
+ "Ok",
+ "Error",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_FloatingPoint[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_Preempt[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_Timeslice[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_ASR[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqConstruct_PreDesc_IntLvl[] = {
+ "Zero",
+ "Positive",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqConstruct_PreDesc[] = {
+ RtemsTaskReqConstruct_PreDesc_CPUs,
+ RtemsTaskReqConstruct_PreDesc_Config,
+ RtemsTaskReqConstruct_PreDesc_Name,
+ RtemsTaskReqConstruct_PreDesc_Id,
+ RtemsTaskReqConstruct_PreDesc_SystemTask,
+ RtemsTaskReqConstruct_PreDesc_Priority,
+ RtemsTaskReqConstruct_PreDesc_Free,
+ RtemsTaskReqConstruct_PreDesc_TLS,
+ RtemsTaskReqConstruct_PreDesc_Stack,
+ RtemsTaskReqConstruct_PreDesc_Create,
+ RtemsTaskReqConstruct_PreDesc_FloatingPoint,
+ RtemsTaskReqConstruct_PreDesc_Preempt,
+ RtemsTaskReqConstruct_PreDesc_Timeslice,
+ RtemsTaskReqConstruct_PreDesc_ASR,
+ RtemsTaskReqConstruct_PreDesc_IntLvl,
+ NULL
+};
+
+#define NAME rtems_build_name( 'T', 'E', 'S', 'T' )
+
+typedef RtemsTaskReqConstruct_Context Context;
+
+static volatile _Thread_local int tls_object;
+
+#define MAX_TLS_SIZE RTEMS_ALIGN_UP( 128, RTEMS_TASK_STORAGE_ALIGNMENT )
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char task_storage[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ RTEMS_FLOATING_POINT
+ )
+];
+
+static const rtems_task_config seize_task_config = {
+ .name = rtems_build_name( 'S', 'I', 'Z', 'E' ),
+ .initial_priority = 1,
+ .storage_area = task_storage,
+ .storage_size = sizeof( task_storage ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = RTEMS_DEFAULT_MODES
+};
+
+static void StorageFree( void *ptr )
+{
+ T_eq_ptr( ptr, task_storage );
+ ++RtemsTaskReqConstruct_Instance.storage_free_calls;
+}
+
+static rtems_status_code Create( void *arg, uint32_t *id )
+{
+ Context *ctx;
+ bool create_extension_status;
+ rtems_status_code sc;
+
+ ctx = arg;
+ create_extension_status = ctx->create_extension_status;
+ ctx->create_extension_status = true;
+ sc = rtems_task_construct( &seize_task_config, id );
+ ctx->create_extension_status = create_extension_status;
+
+ return sc;
+}
+
+static bool ThreadCreate( rtems_tcb *executing, rtems_tcb *created )
+{
+ (void) executing;
+ (void) created;
+
+ ++RtemsTaskReqConstruct_Instance.create_extension_calls;
+ return RtemsTaskReqConstruct_Instance.create_extension_status;
+}
+
+static bool SecondThreadCreate( rtems_tcb *executing, rtems_tcb *created )
+{
+ (void) executing;
+ (void) created;
+
+ ++RtemsTaskReqConstruct_Instance.create_extension_calls;
+ return true;
+}
+
+static void ThreadDelete( rtems_tcb *executing, rtems_tcb *deleted )
+{
+ Context *ctx;
+
+ (void) executing;
+
+ ctx = &RtemsTaskReqConstruct_Instance;
+
+ if ( deleted->Object.id == ctx->zombie_id ) {
+ ++ctx->delete_zombie_extension_calls;
+ } else {
+ ++ctx->delete_extension_calls;
+ }
+}
+
+#if defined(RTEMS_SMP)
+static void PreemptionIntervention( void *arg )
+{
+ Context *ctx;
+ unsigned int ticket;
+
+ ctx = arg;
+ T_false( ctx->zombie_ready );
+ ctx->zombie_ready = true;
+
+ do {
+ ticket = _Atomic_Load_uint(
+ &_Thread_Zombies.Lock.Lock.Ticket_lock.now_serving,
+ ATOMIC_ORDER_RELAXED
+ );
+ } while ( ( ticket - ctx->thread_zombie_ticket ) < 2 );
+
+ T_busy( 100 );
+}
+
+static void ThreadTerminate( rtems_tcb *executing )
+{
+ Context *ctx;
+
+ ctx = &RtemsTaskReqConstruct_Instance;
+
+ if (
+ ctx->scheduler_b_id != INVALID_ID &&
+ ctx->zombie_id == executing->Object.id
+ ) {
+ /*
+ * We use the ticket lock of the thread zombie registry to delay the thread
+ * dispatch and provoke an executing thread in
+ * _Thread_Kill_zombies(). The first acquire is done in the
+ * rtems_task_exit() below. The second acquire is done in
+ * _Thread_Kill_zombies().
+ */
+ ctx->thread_zombie_ticket = _Atomic_Fetch_add_uint(
+ &_Thread_Zombies.Lock.Lock.Ticket_lock.now_serving,
+ 0,
+ ATOMIC_ORDER_RELAXED
+ );
+ SetPreemptionIntervention(
+ _Per_CPU_Get_snapshot(),
+ PreemptionIntervention,
+ ctx
+ );
+ }
+}
+#endif
+
+static const rtems_extensions_table extensions[] = {
+ {
+#if defined(RTEMS_SMP)
+ .thread_terminate = ThreadTerminate,
+#endif
+ .thread_create = ThreadCreate,
+ .thread_delete = ThreadDelete
+ }, {
+ .thread_create = SecondThreadCreate,
+ .thread_delete = ThreadDelete
+ }
+};
+
+static void ZombieTask( rtems_task_argument arg )
+{
+ (void) arg;
+ rtems_task_exit();
+}
+
+static void PrepareZombie( Context *ctx )
+{
+ bool create_extension_status;
+
+ create_extension_status = ctx->create_extension_status;
+ ctx->create_extension_status = true;
+ ctx->zombie_id = CreateTask( "ZOMB", PRIO_HIGH );
+ ctx->create_extension_status = create_extension_status;
+#if defined(RTEMS_SMP)
+ if ( ctx->scheduler_b_id != INVALID_ID ) {
+ ctx->zombie_ready = false;
+ SetScheduler( ctx->zombie_id, ctx->scheduler_b_id, PRIO_NORMAL );
+ }
+#endif
+ StartTask( ctx->zombie_id, ZombieTask, ctx );
+#if defined(RTEMS_SMP)
+ while ( !ctx->zombie_ready ) {
+ /* Wait */
+ }
+#endif
+}
+
+static volatile double double_object;
+
+static RTEMS_NO_INLINE void UseFloatingPointUnit( void )
+{
+ double_object = ( 123.0 * double_object + double_object / 123.0 ) / 2.0;
+}
+
+static void WorkerTask( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = (Context *) arg;
+ ctx->actual_modes = GetMode();
+
+ /*
+ * We don't validate here that we cannot use the floating-point unit if the
+ * RTEMS_FLOATING_POINT attribute is not set. This is done elsewhere.
+ * Using the floating-point unit if the RTEMS_FLOATING_POINT attribute is
+ * not set may result in unrecoverable fatal errors.
+ */
+ if ( ( ctx->config_obj.attributes & RTEMS_FLOATING_POINT ) != 0 ) {
+ UseFloatingPointUnit();
+ }
+
+ SuspendSelf();
+}
+
+static void RtemsTaskReqConstruct_Pre_CPUs_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_CPUs state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_CPUs_One: {
+ /*
+ * Where the system does not need inter-processor interrupts, where the
+ * scheduler does support the no-preempt mode.
+ */
+ if ( rtems_scheduler_get_processor_maximum() != 1 ) {
+ ctx->Map.skip = true;
+ }
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_CPUs_More: {
+ /*
+ * Where the system needs inter-processor interrupts, where the scheduler
+ * does not support the no-preempt mode.
+ */
+ if ( rtems_scheduler_get_processor_maximum() == 1 ) {
+ ctx->Map.skip = true;
+ }
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_CPUs_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_Config_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_Config state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_Config_Valid: {
+ /*
+ * While the ``config`` parameter references an object of type
+ * rtems_task_config.
+ */
+ ctx->config = &ctx->config_obj;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Config_Null: {
+ /*
+ * While the ``config`` parameter is NULL.
+ */
+ ctx->config = NULL;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Config_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_Name_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_Name state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_Name_Valid: {
+ /*
+ * While the name of the task configuration is valid.
+ */
+ ctx->config_obj.name = NAME;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Name_Invalid: {
+ /*
+ * While the name of the task configuration is invalid.
+ */
+ ctx->config_obj.name = 0;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Name_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_Id_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_Id_Valid: {
+ /*
+ * While the ``id`` parameter references an object of type rtems_id.
+ */
+ ctx->id = &ctx->id_obj;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Id_Null: {
+ /*
+ * While the ``id`` parameter is NULL.
+ */
+ ctx->id = NULL;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_SystemTask_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_SystemTask state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_SystemTask_Yes: {
+ /*
+ * While the attributes of the task configuration specifies a system
+ * task.
+ */
+ ctx->config_obj.attributes |= RTEMS_SYSTEM_TASK;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_SystemTask_No: {
+ /*
+ * While the attributes of the task configuration specifies an
+ * application task.
+ */
+ ctx->config_obj.attributes |= RTEMS_APPLICATION_TASK;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_SystemTask_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_Priority_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_Priority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_Priority_Valid: {
+ /*
+ * While the initial priority of the task configuration is valid and
+ * non-zero.
+ */
+ ctx->config_obj.initial_priority = PRIO_HIGH;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Priority_Zero: {
+ /*
+ * While the initial priority of the task configuration is zero.
+ */
+ ctx->config_obj.initial_priority = 0;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Priority_Invalid: {
+ /*
+ * While the initial priority of the task configuration is invalid.
+ */
+ ctx->config_obj.initial_priority = 0xffffffff;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Priority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_Free_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_Free state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_Free_Yes: {
+ /*
+ * While the system has at least one inactive task object available.
+ */
+ /* Nothing to do */
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Free_No: {
+ /*
+ * While the system has no inactive task object available.
+ */
+ ctx->seized_objects = T_seize_objects( Create, ctx );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Free_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_TLS_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_TLS state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_TLS_Enough: {
+ /*
+ * While the maximum thread-local storage size of the task configuration
+ * is greater than or equal to the thread-local storage size.
+ */
+ ctx->config_obj.maximum_thread_local_storage_size = MAX_TLS_SIZE;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_TLS_TooSmall: {
+ /*
+ * While the maximum thread-local storage size of the task configuration
+ * is less than the thread-local storage size.
+ */
+ ctx->config_obj.maximum_thread_local_storage_size = 0;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_TLS_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_Stack_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_Stack state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_Stack_Enough: {
+ /*
+ * While the task stack size of the task configuration is greater than or
+ * equal to the configured minimum size.
+ */
+ ctx->stack_size = TEST_MINIMUM_STACK_SIZE;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Stack_TooSmall: {
+ /*
+ * While the task stack size of the task configuration is less than the
+ * configured minimum size.
+ */
+ ctx->stack_size = 0;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Stack_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_Create_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_Create state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_Create_Ok: {
+ /*
+ * While none of the thread create user extensions fails.
+ */
+ ctx->create_extension_status = true;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Create_Error: {
+ /*
+ * While at least one of the thread create user extensions fails.
+ */
+ ctx->create_extension_status = false;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Create_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_FloatingPoint_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_FloatingPoint state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_FloatingPoint_Yes: {
+ /*
+ * While the attributes of the task configuration specifies a
+ * floating-point task.
+ */
+ ctx->config_obj.attributes |= RTEMS_FLOATING_POINT;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_FloatingPoint_No: {
+ /*
+ * While the attributes of the task configuration specifies a
+ * non-floating-point task.
+ */
+ ctx->config_obj.attributes |= RTEMS_NO_FLOATING_POINT;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_FloatingPoint_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_Preempt_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_Preempt state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_Preempt_Yes: {
+ /*
+ * While the initial modes of the task configuration specify that
+ * preemption is enabled.
+ */
+ ctx->config_obj.initial_modes |= RTEMS_PREEMPT;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Preempt_No: {
+ /*
+ * While the initial modes of the task configuration specify that
+ * preemption is disabled.
+ */
+ ctx->config_obj.initial_modes |= RTEMS_NO_PREEMPT;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Preempt_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_Timeslice_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_Timeslice state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_Timeslice_Yes: {
+ /*
+ * While the initial modes of the task configuration specify that
+ * timeslicing is enabled.
+ */
+ ctx->config_obj.initial_modes |= RTEMS_TIMESLICE;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Timeslice_No: {
+ /*
+ * While the initial modes of the task configuration specify that
+ * timeslicing is disabled.
+ */
+ ctx->config_obj.initial_modes |= RTEMS_NO_TIMESLICE;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_Timeslice_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_ASR_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_ASR state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_ASR_Yes: {
+ /*
+ * While the initial modes of the task configuration specify that ASR
+ * processing is enabled.
+ */
+ ctx->config_obj.initial_modes |= RTEMS_ASR;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_ASR_No: {
+ /*
+ * While the initial modes of the task configuration specify that ASR
+ * processing is disabled.
+ */
+ ctx->config_obj.initial_modes |= RTEMS_NO_ASR;
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_ASR_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Pre_IntLvl_Prepare(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Pre_IntLvl state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Pre_IntLvl_Zero: {
+ /*
+ * While the initial modes of the task configuration specify an interrupt
+ * level of zero.
+ */
+ ctx->config_obj.initial_modes |= RTEMS_INTERRUPT_LEVEL( 0 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_IntLvl_Positive: {
+ /*
+ * While the initial modes of the task configuration specify an interrupt
+ * level greater than zero and less than or equal to
+ * CPU_MODES_INTERRUPT_MASK.
+ */
+ ctx->config_obj.initial_modes |= RTEMS_INTERRUPT_LEVEL( 1 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Pre_IntLvl_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_Status_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_construct() shall be RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_construct() shall be
+ * RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Status_InvName: {
+ /*
+ * The return status of rtems_task_construct() shall be
+ * RTEMS_INVALID_NAME.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_NAME );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Status_InvPrio: {
+ /*
+ * The return status of rtems_task_construct() shall be
+ * RTEMS_INVALID_PRIORITY.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_PRIORITY );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Status_InvSize: {
+ /*
+ * The return status of rtems_task_construct() shall be
+ * RTEMS_INVALID_SIZE.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_SIZE );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Status_TooMany: {
+ /*
+ * The return status of rtems_task_construct() shall be RTEMS_TOO_MANY.
+ */
+ T_rsc( ctx->status, RTEMS_TOO_MANY );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Status_Unsat: {
+ /*
+ * The return status of rtems_task_construct() shall be
+ * RTEMS_UNSATISFIED.
+ */
+ T_rsc( ctx->status, RTEMS_UNSATISFIED );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_Name_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_Name state
+)
+{
+ rtems_status_code sc;
+ rtems_id id;
+
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_Name_Valid: {
+ /*
+ * The unique object name shall identify the task constructed by the
+ * rtems_task_construct() call.
+ */
+ id = 0;
+ sc = rtems_task_ident( NAME, RTEMS_SEARCH_LOCAL_NODE, &id );
+ T_rsc_success( sc );
+ T_eq_u32( id, ctx->id_obj );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Name_Invalid: {
+ /*
+ * The unique object name shall not identify a task.
+ */
+ sc = rtems_task_ident( NAME, RTEMS_SEARCH_LOCAL_NODE, &id );
+ T_rsc( sc, RTEMS_INVALID_NAME );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Name_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_IdObj_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_IdObj state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_IdObj_Set: {
+ /*
+ * The value of the object referenced by the ``id`` parameter shall be
+ * set to the object identifier of the constructed task after the return
+ * of the rtems_task_construct() call.
+ */
+ T_eq_ptr( ctx->id, &ctx->id_obj );
+ T_ne_u32( ctx->id_obj, INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_IdObj_Nop: {
+ /*
+ * Objects referenced by the ``id`` parameter in past calls to
+ * rtems_task_construct() shall not be accessed by the
+ * rtems_task_construct() call.
+ */
+ T_eq_u32( ctx->id_obj, INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_IdObj_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_CreateNew_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_CreateNew state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_CreateNew_All: {
+ /*
+ * The thread create user extensions shall be invoked for the task under
+ * construction during the rtems_task_construct() call.
+ */
+ T_eq_u32( ctx->create_extension_calls, 2 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_CreateNew_UpToFailing: {
+ /*
+ * The thread create user extensions up to the failing extension shall be
+ * invoked for the task under construction during the
+ * rtems_task_construct() call.
+ */
+ T_eq_u32( ctx->create_extension_calls, 1 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_CreateNew_Nop: {
+ /*
+ * The thread create user extensions shall not be invoked for the task
+ * under construction during the rtems_task_construct() call.
+ */
+ T_eq_u32( ctx->create_extension_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_CreateNew_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_DeleteNew_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_DeleteNew state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_DeleteNew_All: {
+ /*
+ * The thread delete user extensions shall be invoked for the task under
+ * construction during the rtems_task_construct() call.
+ */
+ T_eq_u32( ctx->delete_extension_calls, 2 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_DeleteNew_Nop: {
+ /*
+ * The thread delete user extensions shall not be invoked for the task
+ * under construction during the rtems_task_construct() call.
+ */
+ T_eq_u32( ctx->delete_extension_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_DeleteNew_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_KillZombies_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_KillZombies state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_KillZombies_Yes: {
+ /*
+ * The registered zombie threads shall be killed before an attempt to
+ * allocate a TCB is made by the rtems_task_construct() call.
+ */
+ /*
+ * We cannot check the zombie delete extension calls if we should call
+ * rtems_task_construct() without an inactive TCB available. Killing
+ * a zombie would make one inactive TCB available.
+ */
+ if ( ctx->seized_objects == NULL ) {
+ T_eq_u32( ctx->delete_zombie_extension_calls, 2 );
+ }
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_KillZombies_No: {
+ /*
+ * The registered zombie threads shall not be killed by the
+ * rtems_task_construct() call.
+ */
+ T_eq_u32( ctx->delete_zombie_extension_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_KillZombies_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_StorageFree_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_StorageFree state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_StorageFree_Yes: {
+ /*
+ * The storage free handler of the task configuration shall be invoked
+ * during the rtems_task_construct() call.
+ */
+ T_eq_u32( ctx->storage_free_calls, 1 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_StorageFree_No: {
+ /*
+ * The storage free handler of the task configuration shall not be
+ * invoked during the rtems_task_construct() call.
+ */
+ T_eq_u32( ctx->storage_free_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_StorageFree_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_FloatingPoint_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_FloatingPoint state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_FloatingPoint_Yes: {
+ /*
+ * Where threads have a dedicated floating-point context, the task
+ * constructed by the rtems_task_construct() call shall be able to use
+ * the floating-point unit.
+ */
+ /* Validated by WorkerTask() */
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_FloatingPoint_No: {
+ /*
+ * Where threads have a dedicated floating-point context, the task
+ * constructed by the rtems_task_construct() call shall not be able to
+ * use the floating-point unit.
+ */
+ /* Validated by WorkerTask() */
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_FloatingPoint_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_Preempt_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_Preempt state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_Preempt_Yes: {
+ /*
+ * Task preemption in the initial modes of the task constructed by the
+ * rtems_task_construct() call shall be enabled.
+ */
+ T_eq_u32( ctx->actual_modes & RTEMS_PREEMPT, RTEMS_PREEMPT );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Preempt_No: {
+ /*
+ * Task preemption in the initial modes of the task constructed by the
+ * rtems_task_construct() call shall be disabled.
+ */
+ T_eq_u32( ctx->actual_modes & RTEMS_PREEMPT, 0 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Preempt_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_Timeslice_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_Timeslice state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_Timeslice_Yes: {
+ /*
+ * Timeslicing in the initial modes of the task constructed by the
+ * rtems_task_construct() call shall be enabled.
+ */
+ T_eq_u32( ctx->actual_modes & RTEMS_TIMESLICE, RTEMS_TIMESLICE );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Timeslice_No: {
+ /*
+ * Timeslicing in the initial modes of the task constructed by the
+ * rtems_task_construct() call shall be disabled.
+ */
+ T_eq_u32( ctx->actual_modes & RTEMS_TIMESLICE, 0 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_Timeslice_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_ASR_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_ASR state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_ASR_Yes: {
+ /*
+ * ASR processing in the initial modes of the task constructed by the
+ * rtems_task_construct() call shall be enabled.
+ */
+ T_eq_u32( ctx->actual_modes & RTEMS_ASR, RTEMS_ASR );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_ASR_No: {
+ /*
+ * ASR processing in the initial modes of the task constructed by the
+ * rtems_task_construct() call shall be disabled.
+ */
+ T_eq_u32( ctx->actual_modes & RTEMS_ASR, 0 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_ASR_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Post_IntLvl_Check(
+ RtemsTaskReqConstruct_Context *ctx,
+ RtemsTaskReqConstruct_Post_IntLvl state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqConstruct_Post_IntLvl_Zero: {
+ /*
+ * The interrupt level in the initial modes of the task constructed by
+ * the rtems_task_construct() call shall be zero.
+ */
+ T_eq_u32( ctx->actual_modes & RTEMS_INTERRUPT_MASK, 0 );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_IntLvl_Positive: {
+ /*
+ * The interrupt level in the initial modes of the task constructed by
+ * the rtems_task_construct() call shall be the interrupt level specified
+ * by the initial modes of the task configuration mapped to an target
+ * architecture-specific positive value.
+ */
+ T_eq_u32(
+ ctx->actual_modes & RTEMS_INTERRUPT_MASK,
+ ctx->config_obj.initial_modes & RTEMS_INTERRUPT_MASK
+ );
+ break;
+ }
+
+ case RtemsTaskReqConstruct_Post_IntLvl_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqConstruct_Setup( RtemsTaskReqConstruct_Context *ctx )
+{
+ rtems_status_code sc;
+ int var;
+
+ var = tls_object;
+ RTEMS_OBFUSCATE_VARIABLE( var );
+ tls_object = var;
+
+ ctx->scheduler_b_id = INVALID_ID;
+ #if defined(RTEMS_SMP)
+ ctx->zombie_ready = true;
+ if ( rtems_scheduler_get_processor_maximum() > 1 ) {
+ sc = rtems_scheduler_ident(
+ TEST_SCHEDULER_B_NAME,
+ &ctx->scheduler_b_id
+ );
+ T_rsc_success( sc );
+ }
+ #endif
+
+ sc = rtems_extension_create(
+ rtems_build_name( 'E', 'X', 'T', '1' ),
+ &extensions[ 0 ],
+ &ctx->extension_ids[ 0 ]
+ );
+ T_rsc_success( sc );
+
+ sc = rtems_extension_create(
+ rtems_build_name( 'E', 'X', 'T', '2' ),
+ &extensions[ 1 ],
+ &ctx->extension_ids[ 1 ]
+ );
+ T_rsc_success( sc );
+
+ SetSelfPriority( PRIO_NORMAL );
+}
+
+static void RtemsTaskReqConstruct_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqConstruct_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqConstruct_Setup( ctx );
+}
+
+static void RtemsTaskReqConstruct_Teardown(
+ RtemsTaskReqConstruct_Context *ctx
+)
+{
+ rtems_status_code sc;
+
+ sc = rtems_extension_delete( ctx->extension_ids[ 0 ] );
+ T_rsc_success( sc );
+
+ sc = rtems_extension_delete( ctx->extension_ids[ 1 ] );
+ T_rsc_success( sc );
+
+ RestoreRunnerPriority();
+}
+
+static void RtemsTaskReqConstruct_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqConstruct_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqConstruct_Teardown( ctx );
+}
+
+static void RtemsTaskReqConstruct_Prepare( RtemsTaskReqConstruct_Context *ctx )
+{
+ KillZombies();
+ ctx->id_obj = INVALID_ID;
+ memset( &ctx->config_obj, 0, sizeof( ctx->config_obj ) );
+ ctx->config_obj.storage_area = task_storage,
+ ctx->config_obj.storage_free = StorageFree;
+}
+
+static void RtemsTaskReqConstruct_Action( RtemsTaskReqConstruct_Context *ctx )
+{
+ if ( ctx->seized_objects == NULL ) {
+ PrepareZombie( ctx );
+ }
+
+ ctx->actual_modes = UINT32_MAX;
+ ctx->create_extension_calls = 0;
+ ctx->delete_extension_calls = 0;
+ ctx->delete_zombie_extension_calls = 0;
+ ctx->storage_free_calls = 0;
+ ctx->config_obj.storage_size = RTEMS_TASK_STORAGE_SIZE(
+ ctx->config_obj.maximum_thread_local_storage_size + ctx->stack_size,
+ ctx->config_obj.attributes
+ );
+ ctx->status = rtems_task_construct( ctx->config, ctx->id );
+
+ if ( ctx->status == RTEMS_SUCCESSFUL ) {
+ StartTask( ctx->id_obj, WorkerTask, ctx );
+ }
+}
+
+static void RtemsTaskReqConstruct_Cleanup( RtemsTaskReqConstruct_Context *ctx )
+{
+ if ( ctx->id_obj != INVALID_ID ) {
+ rtems_status_code sc;
+
+ sc = rtems_task_delete( ctx->id_obj );
+ T_rsc_success( sc );
+
+ ctx->id_obj = INVALID_ID;
+ }
+
+ T_surrender_objects( &ctx->seized_objects, rtems_task_delete );
+}
+
+static const RtemsTaskReqConstruct_Entry
+RtemsTaskReqConstruct_Entries[] = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_InvAddr,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_No,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_InvAddr,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_No,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_InvName,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_No,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_InvName,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_No,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_InvPrio,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_No,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_InvPrio,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_No,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_TooMany,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_TooMany,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_InvSize,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_InvSize,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_UpToFailing,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_UpToFailing,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_UpToFailing,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Unsat,
+ RtemsTaskReqConstruct_Post_Name_Invalid,
+ RtemsTaskReqConstruct_Post_IdObj_Nop,
+ RtemsTaskReqConstruct_Post_CreateNew_Nop,
+ RtemsTaskReqConstruct_Post_DeleteNew_All,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_Yes,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_No,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Positive },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_Yes,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_Yes,
+ RtemsTaskReqConstruct_Post_ASR_No, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No,
+ RtemsTaskReqConstruct_Post_ASR_Yes, RtemsTaskReqConstruct_Post_IntLvl_Zero },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_Ok,
+ RtemsTaskReqConstruct_Post_Name_Valid,
+ RtemsTaskReqConstruct_Post_IdObj_Set,
+ RtemsTaskReqConstruct_Post_CreateNew_All,
+ RtemsTaskReqConstruct_Post_DeleteNew_Nop,
+ RtemsTaskReqConstruct_Post_KillZombies_Yes,
+ RtemsTaskReqConstruct_Post_StorageFree_No,
+ RtemsTaskReqConstruct_Post_FloatingPoint_No,
+ RtemsTaskReqConstruct_Post_Preempt_Yes,
+ RtemsTaskReqConstruct_Post_Timeslice_No, RtemsTaskReqConstruct_Post_ASR_No,
+ RtemsTaskReqConstruct_Post_IntLvl_Zero }
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqConstruct_Post_Status_NA, RtemsTaskReqConstruct_Post_Name_NA,
+ RtemsTaskReqConstruct_Post_IdObj_NA,
+ RtemsTaskReqConstruct_Post_CreateNew_NA,
+ RtemsTaskReqConstruct_Post_DeleteNew_NA,
+ RtemsTaskReqConstruct_Post_KillZombies_NA,
+ RtemsTaskReqConstruct_Post_StorageFree_NA,
+ RtemsTaskReqConstruct_Post_FloatingPoint_NA,
+ RtemsTaskReqConstruct_Post_Preempt_NA,
+ RtemsTaskReqConstruct_Post_Timeslice_NA, RtemsTaskReqConstruct_Post_ASR_NA,
+ RtemsTaskReqConstruct_Post_IntLvl_NA }
+#endif
+};
+
+static const uint8_t
+RtemsTaskReqConstruct_Map[] = {
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 11, 12, 11, 12, 11, 12,
+ 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11,
+ 12, 11, 12, 11, 12, 11, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11,
+ 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 11, 12, 11, 12, 11, 12, 11,
+ 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12, 11, 12,
+ 11, 12, 11, 12, 11, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 46, 10, 47, 10, 48, 10, 49, 10, 10, 10, 10, 10, 10, 10, 10, 10, 50, 10, 51,
+ 10, 52, 10, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10,
+ 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 46, 10, 47, 10, 48, 10, 49,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 50, 10, 51, 10, 52, 10, 53, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 46,
+ 10, 47, 10, 48, 10, 49, 10, 10, 10, 10, 10, 10, 10, 10, 10, 50, 10, 51, 10,
+ 52, 10, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 10, 13, 10, 13, 10, 13, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static size_t RtemsTaskReqConstruct_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqConstruct_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqConstruct_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqConstruct_Fixture = {
+ .setup = RtemsTaskReqConstruct_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqConstruct_Teardown_Wrap,
+ .scope = RtemsTaskReqConstruct_Scope,
+ .initial_context = &RtemsTaskReqConstruct_Instance
+};
+
+static const uint16_t RtemsTaskReqConstruct_Weights[] = {
+ 24576, 12288, 6144, 3072, 1536, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1
+};
+
+static void RtemsTaskReqConstruct_Skip(
+ RtemsTaskReqConstruct_Context *ctx,
+ size_t index
+)
+{
+ switch ( index + 1 ) {
+ case 1:
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqConstruct_Pre_Config_NA - 1;
+ /* Fall through */
+ case 2:
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqConstruct_Pre_Name_NA - 1;
+ /* Fall through */
+ case 3:
+ ctx->Map.pcs[ 3 ] = RtemsTaskReqConstruct_Pre_Id_NA - 1;
+ /* Fall through */
+ case 4:
+ ctx->Map.pcs[ 4 ] = RtemsTaskReqConstruct_Pre_SystemTask_NA - 1;
+ /* Fall through */
+ case 5:
+ ctx->Map.pcs[ 5 ] = RtemsTaskReqConstruct_Pre_Priority_NA - 1;
+ /* Fall through */
+ case 6:
+ ctx->Map.pcs[ 6 ] = RtemsTaskReqConstruct_Pre_Free_NA - 1;
+ /* Fall through */
+ case 7:
+ ctx->Map.pcs[ 7 ] = RtemsTaskReqConstruct_Pre_TLS_NA - 1;
+ /* Fall through */
+ case 8:
+ ctx->Map.pcs[ 8 ] = RtemsTaskReqConstruct_Pre_Stack_NA - 1;
+ /* Fall through */
+ case 9:
+ ctx->Map.pcs[ 9 ] = RtemsTaskReqConstruct_Pre_Create_NA - 1;
+ /* Fall through */
+ case 10:
+ ctx->Map.pcs[ 10 ] = RtemsTaskReqConstruct_Pre_FloatingPoint_NA - 1;
+ /* Fall through */
+ case 11:
+ ctx->Map.pcs[ 11 ] = RtemsTaskReqConstruct_Pre_Preempt_NA - 1;
+ /* Fall through */
+ case 12:
+ ctx->Map.pcs[ 12 ] = RtemsTaskReqConstruct_Pre_Timeslice_NA - 1;
+ /* Fall through */
+ case 13:
+ ctx->Map.pcs[ 13 ] = RtemsTaskReqConstruct_Pre_ASR_NA - 1;
+ /* Fall through */
+ case 14:
+ ctx->Map.pcs[ 14 ] = RtemsTaskReqConstruct_Pre_IntLvl_NA - 1;
+ break;
+ }
+}
+
+static inline RtemsTaskReqConstruct_Entry RtemsTaskReqConstruct_PopEntry(
+ RtemsTaskReqConstruct_Context *ctx
+)
+{
+ size_t index;
+
+ if ( ctx->Map.skip ) {
+ size_t i;
+
+ ctx->Map.skip = false;
+ index = 0;
+
+ for ( i = 0; i < 15; ++i ) {
+ index += RtemsTaskReqConstruct_Weights[ i ] * ctx->Map.pcs[ i ];
+ }
+ } else {
+ index = ctx->Map.index;
+ }
+
+ ctx->Map.index = index + 1;
+
+ return RtemsTaskReqConstruct_Entries[
+ RtemsTaskReqConstruct_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqConstruct_TestVariant(
+ RtemsTaskReqConstruct_Context *ctx
+)
+{
+ RtemsTaskReqConstruct_Pre_CPUs_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+
+ if ( ctx->Map.skip ) {
+ RtemsTaskReqConstruct_Skip( ctx, 0 );
+ return;
+ }
+
+ RtemsTaskReqConstruct_Pre_Config_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqConstruct_Pre_Name_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqConstruct_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqConstruct_Pre_SystemTask_Prepare( ctx, ctx->Map.pcs[ 4 ] );
+ RtemsTaskReqConstruct_Pre_Priority_Prepare( ctx, ctx->Map.pcs[ 5 ] );
+ RtemsTaskReqConstruct_Pre_Free_Prepare( ctx, ctx->Map.pcs[ 6 ] );
+ RtemsTaskReqConstruct_Pre_TLS_Prepare( ctx, ctx->Map.pcs[ 7 ] );
+ RtemsTaskReqConstruct_Pre_Stack_Prepare( ctx, ctx->Map.pcs[ 8 ] );
+ RtemsTaskReqConstruct_Pre_Create_Prepare( ctx, ctx->Map.pcs[ 9 ] );
+ RtemsTaskReqConstruct_Pre_FloatingPoint_Prepare( ctx, ctx->Map.pcs[ 10 ] );
+ RtemsTaskReqConstruct_Pre_Preempt_Prepare( ctx, ctx->Map.pcs[ 11 ] );
+ RtemsTaskReqConstruct_Pre_Timeslice_Prepare( ctx, ctx->Map.pcs[ 12 ] );
+ RtemsTaskReqConstruct_Pre_ASR_Prepare( ctx, ctx->Map.pcs[ 13 ] );
+ RtemsTaskReqConstruct_Pre_IntLvl_Prepare( ctx, ctx->Map.pcs[ 14 ] );
+ RtemsTaskReqConstruct_Action( ctx );
+ RtemsTaskReqConstruct_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqConstruct_Post_Name_Check( ctx, ctx->Map.entry.Post_Name );
+ RtemsTaskReqConstruct_Post_IdObj_Check( ctx, ctx->Map.entry.Post_IdObj );
+ RtemsTaskReqConstruct_Post_CreateNew_Check(
+ ctx,
+ ctx->Map.entry.Post_CreateNew
+ );
+ RtemsTaskReqConstruct_Post_DeleteNew_Check(
+ ctx,
+ ctx->Map.entry.Post_DeleteNew
+ );
+ RtemsTaskReqConstruct_Post_KillZombies_Check(
+ ctx,
+ ctx->Map.entry.Post_KillZombies
+ );
+ RtemsTaskReqConstruct_Post_StorageFree_Check(
+ ctx,
+ ctx->Map.entry.Post_StorageFree
+ );
+ RtemsTaskReqConstruct_Post_FloatingPoint_Check(
+ ctx,
+ ctx->Map.entry.Post_FloatingPoint
+ );
+ RtemsTaskReqConstruct_Post_Preempt_Check( ctx, ctx->Map.entry.Post_Preempt );
+ RtemsTaskReqConstruct_Post_Timeslice_Check(
+ ctx,
+ ctx->Map.entry.Post_Timeslice
+ );
+ RtemsTaskReqConstruct_Post_ASR_Check( ctx, ctx->Map.entry.Post_ASR );
+ RtemsTaskReqConstruct_Post_IntLvl_Check( ctx, ctx->Map.entry.Post_IntLvl );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqConstruct( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqConstruct, &RtemsTaskReqConstruct_Fixture )
+{
+ RtemsTaskReqConstruct_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+ ctx->Map.skip = false;
+
+ for (
+ ctx->Map.pcs[ 0 ] = RtemsTaskReqConstruct_Pre_CPUs_One;
+ ctx->Map.pcs[ 0 ] < RtemsTaskReqConstruct_Pre_CPUs_NA;
+ ++ctx->Map.pcs[ 0 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqConstruct_Pre_Config_Valid;
+ ctx->Map.pcs[ 1 ] < RtemsTaskReqConstruct_Pre_Config_NA;
+ ++ctx->Map.pcs[ 1 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqConstruct_Pre_Name_Valid;
+ ctx->Map.pcs[ 2 ] < RtemsTaskReqConstruct_Pre_Name_NA;
+ ++ctx->Map.pcs[ 2 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 3 ] = RtemsTaskReqConstruct_Pre_Id_Valid;
+ ctx->Map.pcs[ 3 ] < RtemsTaskReqConstruct_Pre_Id_NA;
+ ++ctx->Map.pcs[ 3 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 4 ] = RtemsTaskReqConstruct_Pre_SystemTask_Yes;
+ ctx->Map.pcs[ 4 ] < RtemsTaskReqConstruct_Pre_SystemTask_NA;
+ ++ctx->Map.pcs[ 4 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 5 ] = RtemsTaskReqConstruct_Pre_Priority_Valid;
+ ctx->Map.pcs[ 5 ] < RtemsTaskReqConstruct_Pre_Priority_NA;
+ ++ctx->Map.pcs[ 5 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 6 ] = RtemsTaskReqConstruct_Pre_Free_Yes;
+ ctx->Map.pcs[ 6 ] < RtemsTaskReqConstruct_Pre_Free_NA;
+ ++ctx->Map.pcs[ 6 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 7 ] = RtemsTaskReqConstruct_Pre_TLS_Enough;
+ ctx->Map.pcs[ 7 ] < RtemsTaskReqConstruct_Pre_TLS_NA;
+ ++ctx->Map.pcs[ 7 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 8 ] = RtemsTaskReqConstruct_Pre_Stack_Enough;
+ ctx->Map.pcs[ 8 ] < RtemsTaskReqConstruct_Pre_Stack_NA;
+ ++ctx->Map.pcs[ 8 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 9 ] = RtemsTaskReqConstruct_Pre_Create_Ok;
+ ctx->Map.pcs[ 9 ] < RtemsTaskReqConstruct_Pre_Create_NA;
+ ++ctx->Map.pcs[ 9 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 10 ] = RtemsTaskReqConstruct_Pre_FloatingPoint_Yes;
+ ctx->Map.pcs[ 10 ] < RtemsTaskReqConstruct_Pre_FloatingPoint_NA;
+ ++ctx->Map.pcs[ 10 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 11 ] = RtemsTaskReqConstruct_Pre_Preempt_Yes;
+ ctx->Map.pcs[ 11 ] < RtemsTaskReqConstruct_Pre_Preempt_NA;
+ ++ctx->Map.pcs[ 11 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 12 ] = RtemsTaskReqConstruct_Pre_Timeslice_Yes;
+ ctx->Map.pcs[ 12 ] < RtemsTaskReqConstruct_Pre_Timeslice_NA;
+ ++ctx->Map.pcs[ 12 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 13 ] = RtemsTaskReqConstruct_Pre_ASR_Yes;
+ ctx->Map.pcs[ 13 ] < RtemsTaskReqConstruct_Pre_ASR_NA;
+ ++ctx->Map.pcs[ 13 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 14 ] = RtemsTaskReqConstruct_Pre_IntLvl_Zero;
+ ctx->Map.pcs[ 14 ] < RtemsTaskReqConstruct_Pre_IntLvl_NA;
+ ++ctx->Map.pcs[ 14 ]
+ ) {
+ ctx->Map.entry =
+ RtemsTaskReqConstruct_PopEntry( ctx );
+
+ if ( ctx->Map.entry.Skip ) {
+ continue;
+ }
+
+ RtemsTaskReqConstruct_Prepare( ctx );
+ RtemsTaskReqConstruct_TestVariant( ctx );
+ RtemsTaskReqConstruct_Cleanup( ctx );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-create-errors.c b/testsuites/validation/tc-task-create-errors.c
index 1159773eed..590fe47cb7 100644
--- a/testsuites/validation/tc-task-create-errors.c
+++ b/testsuites/validation/tc-task-create-errors.c
@@ -57,14 +57,16 @@
#include <rtems/score/apimutex.h>
#include <rtems/score/threadimpl.h>
+#include "tx-support.h"
+
#include <rtems/test.h>
/**
* @defgroup RTEMSTestCaseRtemsTaskReqCreateErrors \
* spec:/rtems/task/req/create-errors
*
- * @ingroup RTEMSTestSuiteTestsuitesValidation0
- * @ingroup RTEMSTestSuiteTestsuitesValidation1
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ * @ingroup RTEMSTestSuiteTestsuitesValidationOneCpu0
*
* @{
*/
@@ -280,8 +282,6 @@ static const char * const * const RtemsTaskReqCreateErrors_PreDesc[] = {
#define NAME rtems_build_name( 'T', 'E', 'S', 'T' )
-#define INVALID_ID 0xffffffff
-
typedef RtemsTaskReqCreateErrors_Context Context;
static rtems_status_code Create( void *arg, uint32_t *id )
@@ -419,7 +419,7 @@ static void RtemsTaskReqCreateErrors_Pre_Prio_Prepare(
/*
* While the ``initial_priority`` parameter is valid and non-zero.
*/
- ctx->initial_priority = 254;
+ ctx->initial_priority = RTEMS_MAXIMUM_PRIORITY - 1;
break;
}
diff --git a/testsuites/validation/tc-task-delete.c b/testsuites/validation/tc-task-delete.c
new file mode 100644
index 0000000000..a12a060852
--- /dev/null
+++ b/testsuites/validation/tc-task-delete.c
@@ -0,0 +1,4870 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqDelete
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <limits.h>
+#include <rtems.h>
+#include <setjmp.h>
+#include <rtems/bspIo.h>
+#include <rtems/test-scheduler.h>
+#include <rtems/score/io.h>
+#include <rtems/score/statesimpl.h>
+#include <rtems/score/threaddispatch.h>
+#include <rtems/score/threadimpl.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqDelete spec:/rtems/task/req/delete
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_Id_Executing,
+ RtemsTaskReqDelete_Pre_Id_Other,
+ RtemsTaskReqDelete_Pre_Id_Invalid,
+ RtemsTaskReqDelete_Pre_Id_NA
+} RtemsTaskReqDelete_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_Context_Task,
+ RtemsTaskReqDelete_Pre_Context_Interrupt,
+ RtemsTaskReqDelete_Pre_Context_NA
+} RtemsTaskReqDelete_Pre_Context;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_ThreadDispatch_Disabled,
+ RtemsTaskReqDelete_Pre_ThreadDispatch_Enabled,
+ RtemsTaskReqDelete_Pre_ThreadDispatch_NA
+} RtemsTaskReqDelete_Pre_ThreadDispatch;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_CallerPriority_Higher,
+ RtemsTaskReqDelete_Pre_CallerPriority_LowerEqual,
+ RtemsTaskReqDelete_Pre_CallerPriority_NA
+} RtemsTaskReqDelete_Pre_CallerPriority;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_Dormant_No,
+ RtemsTaskReqDelete_Pre_Dormant_Yes,
+ RtemsTaskReqDelete_Pre_Dormant_NA
+} RtemsTaskReqDelete_Pre_Dormant;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_Suspended_Yes,
+ RtemsTaskReqDelete_Pre_Suspended_No,
+ RtemsTaskReqDelete_Pre_Suspended_NA
+} RtemsTaskReqDelete_Pre_Suspended;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_Restarting_No,
+ RtemsTaskReqDelete_Pre_Restarting_Yes,
+ RtemsTaskReqDelete_Pre_Restarting_NA
+} RtemsTaskReqDelete_Pre_Restarting;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_Terminating_No,
+ RtemsTaskReqDelete_Pre_Terminating_Yes,
+ RtemsTaskReqDelete_Pre_Terminating_NA
+} RtemsTaskReqDelete_Pre_Terminating;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_Protected_Yes,
+ RtemsTaskReqDelete_Pre_Protected_No,
+ RtemsTaskReqDelete_Pre_Protected_NA
+} RtemsTaskReqDelete_Pre_Protected;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_State_Enqueued,
+ RtemsTaskReqDelete_Pre_State_Ready,
+ RtemsTaskReqDelete_Pre_State_Blocked,
+ RtemsTaskReqDelete_Pre_State_NA
+} RtemsTaskReqDelete_Pre_State;
+
+typedef enum {
+ RtemsTaskReqDelete_Pre_Timer_Inactive,
+ RtemsTaskReqDelete_Pre_Timer_Active,
+ RtemsTaskReqDelete_Pre_Timer_NA
+} RtemsTaskReqDelete_Pre_Timer;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_Status_InvId,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_Status_NA
+} RtemsTaskReqDelete_Post_Status;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_FatalError_Yes,
+ RtemsTaskReqDelete_Post_FatalError_Nop,
+ RtemsTaskReqDelete_Post_FatalError_NA
+} RtemsTaskReqDelete_Post_FatalError;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_Zombie_Yes,
+ RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_Zombie_NA
+} RtemsTaskReqDelete_Post_Zombie;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RealPriority_NA
+} RtemsTaskReqDelete_Post_RealPriority;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_NA
+} RtemsTaskReqDelete_Post_RestartExtensions;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_TerminateExtensions_Yes,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_NA
+} RtemsTaskReqDelete_Post_TerminateExtensions;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_Dormant_Yes,
+ RtemsTaskReqDelete_Post_Dormant_No,
+ RtemsTaskReqDelete_Post_Dormant_NA
+} RtemsTaskReqDelete_Post_Dormant;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Suspended_NA
+} RtemsTaskReqDelete_Post_Suspended;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Restarting_NA
+} RtemsTaskReqDelete_Post_Restarting;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Terminating_NA
+} RtemsTaskReqDelete_Post_Terminating;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_Protected_NA
+} RtemsTaskReqDelete_Post_Protected;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_State_NA
+} RtemsTaskReqDelete_Post_State;
+
+typedef enum {
+ RtemsTaskReqDelete_Post_Timer_Active,
+ RtemsTaskReqDelete_Post_Timer_Inactive,
+ RtemsTaskReqDelete_Post_Timer_NA
+} RtemsTaskReqDelete_Post_Timer;
+
+typedef struct {
+ uint64_t Skip : 1;
+ uint64_t Pre_Id_NA : 1;
+ uint64_t Pre_Context_NA : 1;
+ uint64_t Pre_ThreadDispatch_NA : 1;
+ uint64_t Pre_CallerPriority_NA : 1;
+ uint64_t Pre_Dormant_NA : 1;
+ uint64_t Pre_Suspended_NA : 1;
+ uint64_t Pre_Restarting_NA : 1;
+ uint64_t Pre_Terminating_NA : 1;
+ uint64_t Pre_Protected_NA : 1;
+ uint64_t Pre_State_NA : 1;
+ uint64_t Pre_Timer_NA : 1;
+ uint64_t Post_Status : 3;
+ uint64_t Post_FatalError : 2;
+ uint64_t Post_Zombie : 2;
+ uint64_t Post_RealPriority : 2;
+ uint64_t Post_RestartExtensions : 1;
+ uint64_t Post_TerminateExtensions : 2;
+ uint64_t Post_Dormant : 2;
+ uint64_t Post_Suspended : 2;
+ uint64_t Post_Restarting : 2;
+ uint64_t Post_Terminating : 2;
+ uint64_t Post_Protected : 2;
+ uint64_t Post_State : 2;
+ uint64_t Post_Timer : 2;
+} RtemsTaskReqDelete_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/delete test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides the scheduler operation records.
+ */
+ T_scheduler_log_10 scheduler_log;
+
+ /**
+ * @brief This member provides a jump context to resume a thread dispatch.
+ */
+ jmp_buf thread_dispatch_context;;
+
+ /**
+ * @brief This member contains the identifier of the runner scheduler.
+ */
+ rtems_id scheduler_id;
+
+ /**
+ * @brief This member contains the identifier of the runner task.
+ */
+ rtems_id runner_id;
+
+ /**
+ * @brief This member references the TCB of the runner task.
+ */
+ rtems_tcb *runner_tcb;
+
+ /**
+ * @brief This member contains the identifier of the mutex.
+ */
+ rtems_id mutex_id;
+
+ /**
+ * @brief This member provides an event set used to set up the blocking
+ * conditions of the task to delete.
+ */
+ rtems_event_set events;
+
+ /**
+ * @brief This member contains the identifier of the worker task.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief This member references the TCB of the worker task.
+ */
+ rtems_tcb *worker_tcb;
+
+ /**
+ * @brief This member contains the worker state at the end of the
+ * rtems_task_delete() call.
+ */
+ States_Control worker_state;
+
+ /**
+ * @brief This member contains the worker timer info at the end of the
+ * rtems_task_delete() call.
+ */
+ TaskTimerInfo worker_timer_info;;
+
+ /**
+ * @brief This member contains the worker thread queue at the end of the
+ * rtems_task_delete() call.
+ */
+ const Thread_queue_Queue *worker_wait_queue;;
+
+ /**
+ * @brief This member contains the worker thread life state at the end of the
+ * rtems_task_delete() call.
+ */
+ Thread_Life_state worker_life_state;
+
+ /**
+ * @brief This member contains the worker priority at the end of the
+ * rtems_task_delete() call.
+ */
+ rtems_task_priority worker_priority;
+
+ /**
+ * @brief This member contains the identifier of the deleter task.
+ */
+ rtems_id deleter_id;
+
+ /**
+ * @brief This member references the TCB of the deleter task.
+ */
+ rtems_tcb *deleter_tcb;
+
+ /**
+ * @brief This member contains the identifier of the second deleter task.
+ */
+ rtems_id deleter_2_id;
+
+ /**
+ * @brief This member references the TCB of the second deleter task.
+ */
+ rtems_tcb *deleter_2_tcb;
+
+ /**
+ * @brief This member contains the identifier of the test user extensions.
+ */
+ rtems_id extension_id;
+
+ /**
+ * @brief This member contains extension calls.
+ */
+ ExtensionCalls calls;;
+
+ /**
+ * @brief This member contains extension calls after the rtems_task_delete()
+ * call.
+ */
+ ExtensionCalls calls_after_restart;;
+
+ /**
+ * @brief This member contains the delete counter.
+ */
+ uint32_t restart_counter;
+
+ /**
+ * @brief If this member is true, then the worker shall be dormant before the
+ * rtems_task_delete() call.
+ */
+ bool dormant;
+
+ /**
+ * @brief If this member is true, then the worker shall be suspended before
+ * the rtems_task_delete() call.
+ */
+ bool suspended;
+
+ /**
+ * @brief If this member is true, then the thread life of the worker shall be
+ * protected before the rtems_task_delete() call.
+ */
+ bool protected;
+
+ /**
+ * @brief If this member is true, then the worker shall be restarting before
+ * the rtems_task_delete() call.
+ */
+ bool restarting;
+
+ /**
+ * @brief If this member is true, then the worker shall be terminating before
+ * the rtems_task_delete() call.
+ */
+ bool terminating;
+
+ /**
+ * @brief If this member is true, then the rtems_task_delete() shall be
+ * called from within interrupt context.
+ */
+ bool interrupt;
+
+ /**
+ * @brief If this member is true, then the worker shall be blocked before the
+ * rtems_task_delete() call.
+ */
+ bool blocked;
+
+ /**
+ * @brief If this member is true, then the worker shall be enqueued on a wait
+ * queue before the rtems_task_delete() call.
+ */
+ bool enqueued;
+
+ /**
+ * @brief If this member is true, then the worker obtained a mutex.
+ */
+ bool worker_is_mutex_owner;
+
+ /**
+ * @brief If this member is true, then the timer of the worker shall be
+ * active before the rtems_task_delete() call.
+ */
+ bool timer_active;
+
+ /**
+ * @brief If this member is true, then the deleter shall have a higher
+ * current priority than the real priority of the worker.
+ */
+ bool deleter_has_higher_priority;
+
+ /**
+ * @brief If this member is true, then thread dispatching is disabled by the
+ * worker task before the rtems_task_delete() call.
+ */
+ bool dispatch_disabled;
+
+ /**
+ * @brief If this member is true, then it is expected to delete the worker.
+ */
+ bool delete_worker_expected;
+
+ /**
+ * @brief This member contains the return value of the rtems_task_delete()
+ * call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 11 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 11 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqDelete_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqDelete_Context;
+
+static RtemsTaskReqDelete_Context
+ RtemsTaskReqDelete_Instance;
+
+static const char * const RtemsTaskReqDelete_PreDesc_Id[] = {
+ "Executing",
+ "Other",
+ "Invalid",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_Context[] = {
+ "Task",
+ "Interrupt",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_ThreadDispatch[] = {
+ "Disabled",
+ "Enabled",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_CallerPriority[] = {
+ "Higher",
+ "LowerEqual",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_Dormant[] = {
+ "No",
+ "Yes",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_Suspended[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_Restarting[] = {
+ "No",
+ "Yes",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_Terminating[] = {
+ "No",
+ "Yes",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_Protected[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_State[] = {
+ "Enqueued",
+ "Ready",
+ "Blocked",
+ "NA"
+};
+
+static const char * const RtemsTaskReqDelete_PreDesc_Timer[] = {
+ "Inactive",
+ "Active",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqDelete_PreDesc[] = {
+ RtemsTaskReqDelete_PreDesc_Id,
+ RtemsTaskReqDelete_PreDesc_Context,
+ RtemsTaskReqDelete_PreDesc_ThreadDispatch,
+ RtemsTaskReqDelete_PreDesc_CallerPriority,
+ RtemsTaskReqDelete_PreDesc_Dormant,
+ RtemsTaskReqDelete_PreDesc_Suspended,
+ RtemsTaskReqDelete_PreDesc_Restarting,
+ RtemsTaskReqDelete_PreDesc_Terminating,
+ RtemsTaskReqDelete_PreDesc_Protected,
+ RtemsTaskReqDelete_PreDesc_State,
+ RtemsTaskReqDelete_PreDesc_Timer,
+ NULL
+};
+
+typedef RtemsTaskReqDelete_Context Context;
+
+static void CaptureWorkerState( Context *ctx )
+{
+ T_scheduler_log *log;
+
+ log = T_scheduler_record( NULL );
+
+ if ( log != NULL ) {
+ T_eq_ptr( &log->header, &ctx->scheduler_log.header );
+
+ ctx->worker_wait_queue = ctx->worker_tcb->Wait.queue;
+ ctx->worker_state = ctx->worker_tcb->current_state;
+ ctx->worker_life_state = ctx->worker_tcb->Life.state;
+ ctx->worker_priority =
+ SCHEDULER_PRIORITY_UNMAP( ctx->worker_tcb->Real_priority.priority );
+ CopyExtensionCalls( &ctx->calls, &ctx->calls_after_restart );
+ GetTaskTimerInfoByThread( ctx->worker_tcb, &ctx->worker_timer_info );
+ }
+}
+
+static void TaskSwitch( rtems_tcb *executing, rtems_tcb *heir )
+{
+ (void) executing;
+ (void) heir;
+ CaptureWorkerState( T_fixture_context() );
+}
+
+static void VerifyTaskPreparation( const Context *ctx )
+{
+ if ( ctx->id != INVALID_ID ) {
+ States_Control state;
+ Thread_Life_state life_state;
+
+ state = STATES_READY;
+ life_state = ctx->worker_tcb->Life.state;
+
+ if ( ctx->suspended ) {
+ state |= STATES_SUSPENDED;
+ }
+
+ if ( ctx->dormant ) {
+ T_eq_int( life_state, 0 );
+ state |= STATES_DORMANT;
+ } else {
+ T_eq( ctx->protected, ( life_state & THREAD_LIFE_PROTECTED ) != 0 );
+ T_eq( ctx->restarting, ( life_state & THREAD_LIFE_RESTARTING ) != 0 );
+ T_eq( ctx->terminating, ( life_state & THREAD_LIFE_TERMINATING ) != 0 );
+
+ if ( ctx->blocked ) {
+ if ( ctx->enqueued ) {
+ state |= STATES_WAITING_FOR_MUTEX;
+ } else {
+ state |= STATES_WAITING_FOR_EVENT;
+ }
+ }
+ }
+
+ T_eq_u32( ctx->worker_tcb->current_state, state );
+ }
+}
+
+static void Fatal(
+ rtems_fatal_source source,
+ rtems_fatal_code code,
+ void *arg
+)
+{
+ Context *ctx;
+
+ T_eq_int( source, INTERNAL_ERROR_CORE );
+ T_eq_ulong( code, INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL );
+
+ ctx = arg;
+ ++ctx->calls.fatal;
+ T_assert_eq_int( ctx->calls.fatal, 1 );
+ longjmp( ctx->thread_dispatch_context, 1 );
+}
+
+static void ResumeThreadDispatch(
+ rtems_fatal_source source,
+ rtems_fatal_code code,
+ void *arg
+)
+{
+ Context *ctx;
+
+ T_eq_int( source, INTERNAL_ERROR_CORE );
+ T_eq_ulong( code, INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL );
+
+ ctx = arg;
+ SetFatalHandler( Fatal, ctx );
+ longjmp( ctx->thread_dispatch_context, 1 );
+}
+
+static void Delete( void *arg )
+{
+ Context *ctx;
+ T_scheduler_log *log;
+
+ ctx = arg;
+
+ if ( ctx->suspended && ctx->id != INVALID_ID ) {
+ if ( ctx->id != RTEMS_SELF || ctx->interrupt ) {
+ SuspendTask( ctx->worker_id );
+ } else {
+ Per_CPU_Control *cpu_self;
+
+ /*
+ * Where the system was built with SMP support enabled, a suspended
+ * executing thread during the rtems_task_delete() call can happen
+ * if the thread was suspended by another processor and the
+ * inter-processor interrupt did not yet arrive. Where the system was
+ * built with SMP support disabled, this state cannot happen with the
+ * current implementation. However, we still specify and validate this
+ * behaviour unconditionally since there exist alternative
+ * implementations which would lead to such a state if the executing
+ * thread is suspended by an ISR.
+ */
+ cpu_self = _Thread_Dispatch_disable();
+ SuspendSelf();
+ cpu_self->dispatch_necessary = false;
+ _Thread_Dispatch_enable( cpu_self );
+ }
+ }
+
+ if ( ctx->dispatch_disabled ) {
+ _Thread_Dispatch_disable();
+ }
+
+ VerifyTaskPreparation( ctx );
+ ClearExtensionCalls( &ctx->calls );
+
+ log = T_scheduler_record_10( &ctx->scheduler_log );
+ T_null( log );
+
+ if ( setjmp( ctx->thread_dispatch_context ) == 0 ) {
+ ctx->status = rtems_task_delete( ctx->id );
+ } else {
+ _Thread_Dispatch_unnest( _Per_CPU_Get() );
+ }
+
+ CaptureWorkerState( ctx );
+
+ if ( ctx->dispatch_disabled ) {
+ _Thread_Dispatch_enable( _Per_CPU_Get() );
+ }
+}
+
+static void Block( Context *ctx )
+{
+ rtems_interval ticks;
+
+ if ( ctx->timer_active ) {
+ ticks = UINT32_MAX;
+ } else {
+ ticks = RTEMS_NO_TIMEOUT;
+ }
+
+ if ( ctx->enqueued ) {
+ ObtainMutexTimed( ctx->mutex_id, ticks );
+ ctx->worker_is_mutex_owner = true;
+ } else {
+ /*
+ * Do not use a stack variable for the event set, since we may jump out
+ * of the directive call.
+ */
+ (void) rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_EVENT_ANY | RTEMS_WAIT,
+ ticks,
+ &ctx->events
+ );
+ }
+}
+
+static void BlockDone( Context *ctx )
+{
+ if ( ctx->enqueued ) {
+ ReleaseMutex( ctx->mutex_id );
+ }
+}
+
+static void Signal( rtems_signal_set signals )
+{
+ Context *ctx;
+
+ (void) signals;
+ ctx = T_fixture_context();
+
+ if ( ctx->id == RTEMS_SELF ) {
+ SetPriority( ctx->runner_id, PRIO_LOW );
+
+ if ( ctx->interrupt ) {
+ if ( ctx->blocked ) {
+ Per_CPU_Control *cpu_self;
+
+ SetFatalHandler( ResumeThreadDispatch, ctx );
+ cpu_self = _Thread_Dispatch_disable();
+
+ if ( setjmp( ctx->thread_dispatch_context ) == 0 ) {
+ Block( ctx );
+ } else {
+ _Thread_Dispatch_unnest( cpu_self );
+ }
+
+ CallWithinISR( Delete, ctx );
+
+ _Thread_Dispatch_direct( cpu_self );
+ BlockDone( ctx );
+ } else {
+ CallWithinISR( Delete, ctx );
+ }
+ } else {
+ Delete( ctx );
+ }
+ } else {
+ if ( ctx->blocked ) {
+ Block( ctx );
+ BlockDone( ctx );
+ } else {
+ SetPriority( ctx->runner_id, PRIO_HIGH );
+ }
+ }
+
+ if ( ctx->protected ) {
+ _Thread_Set_life_protection( 0 );
+ }
+}
+
+static void Deleter( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = (Context *) arg;
+
+ if ( ctx != NULL ) {
+ /* We have to prevent the priority boost in the task delete below */
+ SetPriority( ctx->runner_id, PRIO_LOW );
+ SetSelfPriorityNoYield( PRIO_NORMAL );
+
+ DeleteTask( ctx->worker_id );
+ }
+
+ SuspendSelf();
+}
+
+static void SecondDeleter( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = (Context *) arg;
+
+ if ( ctx != NULL ) {
+ if ( !ctx->deleter_has_higher_priority ) {
+ SetPriority( ctx->runner_id, PRIO_LOW );
+ SetSelfPriorityNoYield( PRIO_NORMAL );
+ }
+
+ Delete( ctx );
+ }
+
+ SuspendSelf();
+}
+
+static void Worker( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+
+ if ( arg != 0 ) {
+ rtems_status_code sc;
+
+ sc = rtems_signal_catch( Signal, RTEMS_NO_ASR );
+ T_rsc_success( sc );
+
+ if ( ctx->protected ) {
+ _Thread_Set_life_protection( THREAD_LIFE_PROTECTED );
+ }
+
+ Yield();
+ }
+
+ if ( IsMutexOwner( ctx->mutex_id ) ) {
+ ReleaseMutex( ctx->mutex_id );
+ }
+
+ rtems_task_exit();
+}
+
+static void ThreadDelete( rtems_tcb *executing, rtems_tcb *deleted )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->calls.thread_delete;
+
+ T_eq_u32( executing->Object.id, ctx->runner_id );
+
+ if ( ctx->delete_worker_expected ) {
+ T_eq_u32( deleted->Object.id, ctx->worker_id );
+ }
+}
+
+static void ThreadRestart( rtems_tcb *executing, rtems_tcb *restarted )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->calls.thread_restart;
+}
+
+static void ThreadTerminate( rtems_tcb *executing )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->calls.thread_terminate;
+
+ T_eq_u32( executing->Object.id, ctx->worker_id );
+
+ if ( IsMutexOwner( ctx->mutex_id ) ) {
+ ReleaseMutex( ctx->mutex_id );
+ }
+}
+
+static void Cleanup( Context *ctx )
+{
+ SetSelfPriority( PRIO_VERY_LOW );
+
+ if ( ( ctx->id == RTEMS_SELF || ctx->interrupt ) && ctx->suspended ) {
+ ResumeTask( ctx->worker_id );
+ }
+
+ if ( ctx->protected && ctx->blocked ) {
+ if ( ctx->enqueued ) {
+ ReleaseMutex( ctx->mutex_id );
+ ObtainMutex( ctx->mutex_id );
+ } else {
+ SendEvents( ctx->worker_id, RTEMS_EVENT_0 );
+ }
+ }
+
+ if (
+ ctx->id == INVALID_ID ||
+ ( ctx->calls.thread_terminate == 0 &&
+ !( ctx->dormant && ctx->status != RTEMS_CALLED_FROM_ISR ) )
+ ) {
+ DeleteTask( ctx->worker_id );
+ }
+
+ SetSelfPriority( PRIO_NORMAL );
+}
+
+static const rtems_extensions_table extensions = {
+ .thread_delete = ThreadDelete,
+ .thread_restart = ThreadRestart,
+ .thread_terminate = ThreadTerminate
+};
+
+static void RtemsTaskReqDelete_Pre_Id_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_Id_Executing: {
+ /*
+ * While the ``id`` parameter is associated with the calling task.
+ */
+ ctx->id = RTEMS_SELF;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Id_Other: {
+ /*
+ * While the ``id`` parameter is associated with a task other than the
+ * calling task.
+ */
+ ctx->id = ctx->worker_id;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_Context_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_Context state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_Context_Task: {
+ /*
+ * While the rtems_task_delete() directive is called from within task
+ * context.
+ */
+ ctx->interrupt = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Context_Interrupt: {
+ /*
+ * While the rtems_task_delete() directive is called from within
+ * interrupt context.
+ */
+ ctx->interrupt = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Context_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_ThreadDispatch_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_ThreadDispatch state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_ThreadDispatch_Disabled: {
+ /*
+ * While thread dispatching is disabled for the calling task.
+ */
+ ctx->dispatch_disabled = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_ThreadDispatch_Enabled: {
+ /*
+ * While thread dispatching is enabled for the calling task.
+ */
+ ctx->dispatch_disabled = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_ThreadDispatch_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_CallerPriority_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_CallerPriority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_CallerPriority_Higher: {
+ /*
+ * While the current priority of the task calling rtems_task_delete() is
+ * higher than the real priority of the task specified by the ``id``
+ * parameter.
+ */
+ ctx->deleter_has_higher_priority = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_CallerPriority_LowerEqual: {
+ /*
+ * While the current priority of the task calling rtems_task_delete() is
+ * lower than or equal to the real priority of the task specified by the
+ * ``id`` parameter.
+ */
+ ctx->deleter_has_higher_priority = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_CallerPriority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_Dormant_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_Dormant state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_Dormant_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not dormant.
+ */
+ ctx->dormant = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Dormant_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is dormant.
+ */
+ ctx->dormant = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Dormant_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_Suspended_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_Suspended state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_Suspended_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is suspended.
+ */
+ ctx->suspended = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Suspended_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not suspended.
+ */
+ ctx->suspended = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Suspended_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_Restarting_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_Restarting state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_Restarting_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not restarting.
+ */
+ ctx->restarting = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Restarting_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is restarting.
+ */
+ ctx->restarting = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Restarting_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_Terminating_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_Terminating state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_Terminating_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not terminating.
+ */
+ ctx->terminating = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Terminating_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is terminating.
+ */
+ ctx->terminating = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Terminating_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_Protected_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_Protected state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_Protected_Yes: {
+ /*
+ * While thread life of the task specified by the ``id`` parameter is
+ * protected.
+ */
+ ctx->protected = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Protected_No: {
+ /*
+ * While thread life of the task specified by the ``id`` parameter is not
+ * protected.
+ */
+ ctx->protected = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Protected_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_State_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_State state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_State_Enqueued: {
+ /*
+ * While the task specified by the ``id`` parameter is enqueued on a wait
+ * queue.
+ */
+ ctx->blocked = true;
+ ctx->enqueued = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_State_Ready: {
+ /*
+ * While the task specified by the ``id`` parameter is a ready task or a
+ * scheduled task.
+ */
+ ctx->blocked = false;
+ ctx->enqueued = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_State_Blocked: {
+ /*
+ * While the task specified by the ``id`` parameter is blocked.
+ */
+ ctx->blocked = true;
+ ctx->enqueued = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_State_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Pre_Timer_Prepare(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Pre_Timer state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Pre_Timer_Inactive: {
+ /*
+ * While timer of the task specified by the ``id`` parameter is inactive.
+ */
+ ctx->timer_active = false;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Timer_Active: {
+ /*
+ * While timer of the task specified by the ``id`` parameter is active.
+ */
+ ctx->timer_active = true;
+ break;
+ }
+
+ case RtemsTaskReqDelete_Pre_Timer_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_Status_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_delete() shall be RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_delete() shall be RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Status_CalledFromISR: {
+ /*
+ * The return status of rtems_task_delete() shall be
+ * RTEMS_CALLED_FROM_ISR.
+ */
+ T_rsc( ctx->status, RTEMS_CALLED_FROM_ISR );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Status_NoReturn: {
+ /*
+ * The rtems_task_delete() call shall not return.
+ */
+ T_rsc( ctx->status, RTEMS_NOT_IMPLEMENTED );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_FatalError_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_FatalError state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_FatalError_Yes: {
+ /*
+ * The fatal error with a fatal source of INTERNAL_ERROR_CORE and a fatal
+ * code of INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL shall occur
+ * through the rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->calls.fatal, 1 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_FatalError_Nop: {
+ /*
+ * No fatal error shall occur through the rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->calls.fatal, 0 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_FatalError_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_Zombie_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_Zombie state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_Zombie_Yes: {
+ /*
+ * The task specified by the ``id`` parameter shall be in the zombie
+ * state after the rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->worker_state & STATES_ZOMBIE, STATES_ZOMBIE )
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Zombie_No: {
+ /*
+ * The task specified by the ``id`` parameter shall not be in the zombie
+ * state after the rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->worker_state & STATES_ZOMBIE, 0 )
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Zombie_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_RealPriority_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_RealPriority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_RealPriority_Raised: {
+ /*
+ * The real priority of the task specified by the ``id`` parameter shall
+ * be raised to the current priority of the caller of
+ * rtems_task_delete().
+ */
+ T_eq_u32( ctx->worker_priority, PRIO_ULTRA_HIGH );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_RealPriority_Nop: {
+ /*
+ * The real priority of the task specified by the ``id`` parameter shall
+ * not be changed by the rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->worker_priority, PRIO_NORMAL );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_RealPriority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_RestartExtensions_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_RestartExtensions state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_RestartExtensions_Nop: {
+ /*
+ * The thread delete user extensions shall not be invoked by the
+ * rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->calls_after_restart.thread_restart, 0 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_RestartExtensions_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_TerminateExtensions_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_TerminateExtensions state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_TerminateExtensions_Yes: {
+ /*
+ * The thread terminate user extensions shall be invoked by the
+ * rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->calls_after_restart.thread_terminate, 1 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_TerminateExtensions_Nop: {
+ /*
+ * The thread terminate user extensions shall not be invoked by the
+ * rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->calls_after_restart.thread_terminate, 0 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_TerminateExtensions_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_Dormant_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_Dormant state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_Dormant_Yes: {
+ /*
+ * The task specified by the ``id`` parameter shall be dormant after the
+ * rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->worker_state & STATES_DORMANT, STATES_DORMANT )
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Dormant_No: {
+ /*
+ * The task specified by the ``id`` parameter shall not be dormant after
+ * the rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->worker_state & STATES_DORMANT, 0 )
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Dormant_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_Suspended_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_Suspended state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_Suspended_Yes: {
+ /*
+ * The task specified by the ``id`` parameter shall be suspended after
+ * the rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->worker_state & STATES_SUSPENDED, STATES_SUSPENDED )
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Suspended_No: {
+ /*
+ * The task specified by the ``id`` parameter shall not be suspended
+ * after the rtems_task_delete() call.
+ */
+ T_eq_u32( ctx->worker_state & STATES_SUSPENDED, 0 )
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Suspended_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_Restarting_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_Restarting state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_Restarting_Yes: {
+ /*
+ * The task specified by the ``id`` parameter shall be restarting after
+ * the rtems_task_delete() call.
+ */
+ T_ne_int( ctx->worker_life_state & THREAD_LIFE_RESTARTING, 0 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Restarting_No: {
+ /*
+ * The task specified by the ``id`` parameter shall not be restarting
+ * after the rtems_task_delete() call.
+ */
+ T_eq_int( ctx->worker_life_state & THREAD_LIFE_RESTARTING, 0 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Restarting_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_Terminating_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_Terminating state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_Terminating_Yes: {
+ /*
+ * The task specified by the ``id`` parameter shall be terminating after
+ * the rtems_task_delete() call.
+ */
+ T_ne_int( ctx->worker_life_state & THREAD_LIFE_TERMINATING, 0 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Terminating_No: {
+ /*
+ * The task specified by the ``id`` parameter shall not be terminating
+ * after the rtems_task_delete() call.
+ */
+ T_eq_int( ctx->worker_life_state & THREAD_LIFE_TERMINATING, 0 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Terminating_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_Protected_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_Protected state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_Protected_Yes: {
+ /*
+ * The thread life of the task specified by the ``id`` parameter be
+ * protected after the rtems_task_delete() call.
+ */
+ T_ne_int( ctx->worker_life_state & THREAD_LIFE_PROTECTED, 0 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Protected_No: {
+ /*
+ * The thread life of the task specified by the ``id`` parameter shall
+ * not be protected after the rtems_task_delete() call.
+ */
+ T_eq_int( ctx->worker_life_state & THREAD_LIFE_PROTECTED, 0 );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Protected_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_State_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_State state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_State_Enqueued: {
+ /*
+ * The task specified by the ``id`` parameter shall be enqueued on a wait
+ * queue and blocked.
+ */
+ T_ne_u32( ctx->worker_state & STATES_BLOCKED, 0 )
+ T_not_null( ctx->worker_wait_queue );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_State_Ready: {
+ /*
+ * The task specified by the ``id`` parameter shall not be enqueued on a
+ * wait queue and not blocked.
+ */
+ T_eq_u32( ctx->worker_state & STATES_BLOCKED, 0 )
+ T_null( ctx->worker_wait_queue );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_State_Blocked: {
+ /*
+ * The task specified by the ``id`` parameter shall be not enqueued on a
+ * wait queue and blocked.
+ */
+ T_ne_u32( ctx->worker_state & STATES_BLOCKED, 0 )
+ T_null( ctx->worker_wait_queue );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_State_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Post_Timer_Check(
+ RtemsTaskReqDelete_Context *ctx,
+ RtemsTaskReqDelete_Post_Timer state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqDelete_Post_Timer_Active: {
+ /*
+ * The timer of the task specified by the ``id`` parameter shall be
+ * active after the rtems_task_delete() call.
+ */
+ T_eq_int( ctx->worker_timer_info.state, TASK_TIMER_TICKS );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Timer_Inactive: {
+ /*
+ * The timer of the task specified by the ``id`` parameter shall be
+ * inactive after the rtems_task_delete() call.
+ */
+ T_eq_int( ctx->worker_timer_info.state, TASK_TIMER_INACTIVE );
+ break;
+ }
+
+ case RtemsTaskReqDelete_Post_Timer_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqDelete_Setup( RtemsTaskReqDelete_Context *ctx )
+{
+ rtems_status_code sc;
+
+ ctx->runner_id = rtems_task_self();
+ ctx->runner_tcb = GetThread( ctx->runner_id );
+ ctx->scheduler_id = GetSelfScheduler();
+ ctx->mutex_id = CreateMutexNoProtocol();
+ ObtainMutex( ctx->mutex_id );
+
+ sc = rtems_extension_create(
+ rtems_build_name( 'T', 'E', 'S', 'T' ),
+ &extensions,
+ &ctx->extension_id
+ );
+ T_rsc_success( sc );
+
+ SetFatalHandler( Fatal, ctx );
+ SetTaskSwitchExtension( TaskSwitch );
+ SetSelfPriority( PRIO_NORMAL );
+
+ ctx->deleter_id = CreateTask( "DELE", PRIO_HIGH );
+ ctx->deleter_tcb = GetThread( ctx->deleter_id );
+ StartTask( ctx->deleter_id, Deleter, NULL );
+
+ ctx->deleter_2_id = CreateTask( "DEL2", PRIO_ULTRA_HIGH );
+ ctx->deleter_2_tcb = GetThread( ctx->deleter_2_id );
+ StartTask( ctx->deleter_2_id, SecondDeleter, NULL );
+}
+
+static void RtemsTaskReqDelete_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqDelete_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqDelete_Setup( ctx );
+}
+
+static void RtemsTaskReqDelete_Teardown( RtemsTaskReqDelete_Context *ctx )
+{
+ rtems_status_code sc;
+
+ sc = rtems_extension_delete( ctx->extension_id );
+ T_rsc_success( sc );
+
+ SetFatalHandler( NULL, NULL );
+ SetTaskSwitchExtension( NULL );
+ DeleteTask( ctx->deleter_id );
+ DeleteTask( ctx->deleter_2_id );
+ ReleaseMutex( ctx->mutex_id );
+ DeleteMutex( ctx->mutex_id );
+ RestoreRunnerASR();
+ RestoreRunnerPriority();
+}
+
+static void RtemsTaskReqDelete_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqDelete_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqDelete_Teardown( ctx );
+}
+
+static void RtemsTaskReqDelete_Prepare( RtemsTaskReqDelete_Context *ctx )
+{
+ ctx->status = RTEMS_NOT_IMPLEMENTED;
+ ctx->restart_counter = 0;
+
+ ctx->delete_worker_expected = false;
+ ctx->worker_id = CreateTask( "WORK", PRIO_NORMAL );
+ ctx->delete_worker_expected = true;
+
+ ctx->worker_tcb = GetThread( ctx->worker_id );
+ ctx->worker_state = UINT32_MAX;
+ ctx->worker_life_state = INT_MAX;
+ ctx->worker_priority = UINT32_MAX;
+}
+
+static void RtemsTaskReqDelete_Action( RtemsTaskReqDelete_Context *ctx )
+{
+ rtems_status_code sc;
+
+ if ( ctx->id != INVALID_ID && !ctx->dormant ) {
+ ctx->worker_is_mutex_owner = false;
+ StartTask( ctx->worker_id, Worker, ctx );
+
+ /* Let the worker catch signals and set the thread life protection state */
+ Yield();
+
+ sc = rtems_signal_send( ctx->worker_id, RTEMS_SIGNAL_0 );
+ T_rsc_success( sc );
+
+ if ( ctx->restarting ) {
+ sc = rtems_task_restart( ctx->worker_id, 0 );
+ T_rsc_success( sc );
+ }
+
+ if ( ctx->terminating ) {
+ sc = rtems_task_restart( ctx->deleter_id, (rtems_task_argument) ctx );
+ T_rsc_success( sc );
+ } else {
+ Yield();
+ }
+ }
+
+ if ( ctx->id != RTEMS_SELF ) {
+ if ( ctx->interrupt ) {
+ CallWithinISR( Delete, ctx );
+ } else {
+ sc = rtems_task_restart( ctx->deleter_2_id, (rtems_task_argument) ctx );
+ T_rsc_success( sc );
+ }
+ }
+
+ Cleanup( ctx );
+}
+
+static const RtemsTaskReqDelete_Entry
+RtemsTaskReqDelete_Entries[] = {
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_NA,
+ RtemsTaskReqDelete_Post_FatalError_NA, RtemsTaskReqDelete_Post_Zombie_NA,
+ RtemsTaskReqDelete_Post_RealPriority_NA,
+ RtemsTaskReqDelete_Post_RestartExtensions_NA,
+ RtemsTaskReqDelete_Post_TerminateExtensions_NA,
+ RtemsTaskReqDelete_Post_Dormant_NA, RtemsTaskReqDelete_Post_Suspended_NA,
+ RtemsTaskReqDelete_Post_Restarting_NA,
+ RtemsTaskReqDelete_Post_Terminating_NA,
+ RtemsTaskReqDelete_Post_Protected_NA, RtemsTaskReqDelete_Post_State_NA,
+ RtemsTaskReqDelete_Post_Timer_NA },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, RtemsTaskReqDelete_Post_Status_InvId,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_NA,
+ RtemsTaskReqDelete_Post_RealPriority_NA,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_NA, RtemsTaskReqDelete_Post_Suspended_NA,
+ RtemsTaskReqDelete_Post_Restarting_NA,
+ RtemsTaskReqDelete_Post_Terminating_NA,
+ RtemsTaskReqDelete_Post_Protected_NA, RtemsTaskReqDelete_Post_State_NA,
+ RtemsTaskReqDelete_Post_Timer_NA },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_NA,
+ RtemsTaskReqDelete_Post_FatalError_NA, RtemsTaskReqDelete_Post_Zombie_NA,
+ RtemsTaskReqDelete_Post_RealPriority_NA,
+ RtemsTaskReqDelete_Post_RestartExtensions_NA,
+ RtemsTaskReqDelete_Post_TerminateExtensions_NA,
+ RtemsTaskReqDelete_Post_Dormant_NA, RtemsTaskReqDelete_Post_Suspended_NA,
+ RtemsTaskReqDelete_Post_Restarting_NA,
+ RtemsTaskReqDelete_Post_Terminating_NA,
+ RtemsTaskReqDelete_Post_Protected_NA, RtemsTaskReqDelete_Post_State_NA,
+ RtemsTaskReqDelete_Post_Timer_NA },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_NA,
+ RtemsTaskReqDelete_Post_FatalError_NA, RtemsTaskReqDelete_Post_Zombie_NA,
+ RtemsTaskReqDelete_Post_RealPriority_NA,
+ RtemsTaskReqDelete_Post_RestartExtensions_NA,
+ RtemsTaskReqDelete_Post_TerminateExtensions_NA,
+ RtemsTaskReqDelete_Post_Dormant_NA, RtemsTaskReqDelete_Post_Suspended_NA,
+ RtemsTaskReqDelete_Post_Restarting_NA,
+ RtemsTaskReqDelete_Post_Terminating_NA,
+ RtemsTaskReqDelete_Post_Protected_NA, RtemsTaskReqDelete_Post_State_NA,
+ RtemsTaskReqDelete_Post_Timer_NA },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_NA,
+ RtemsTaskReqDelete_Post_FatalError_NA, RtemsTaskReqDelete_Post_Zombie_NA,
+ RtemsTaskReqDelete_Post_RealPriority_NA,
+ RtemsTaskReqDelete_Post_RestartExtensions_NA,
+ RtemsTaskReqDelete_Post_TerminateExtensions_NA,
+ RtemsTaskReqDelete_Post_Dormant_NA, RtemsTaskReqDelete_Post_Suspended_NA,
+ RtemsTaskReqDelete_Post_Restarting_NA,
+ RtemsTaskReqDelete_Post_Terminating_NA,
+ RtemsTaskReqDelete_Post_Protected_NA, RtemsTaskReqDelete_Post_State_NA,
+ RtemsTaskReqDelete_Post_Timer_NA },
+ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_Yes,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_Yes, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_Yes,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_Yes, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_Yes,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_Yes, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_Yes,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_Yes, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_Yes, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_Yes, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_Yes,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Yes,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_Yes,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Yes,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_NoReturn,
+ RtemsTaskReqDelete_Post_FatalError_Yes, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Raised,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqDelete_Post_Status_Ok,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_Yes,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_No,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_No,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_Yes,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Enqueued,
+ RtemsTaskReqDelete_Post_Timer_Active },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No, RtemsTaskReqDelete_Post_State_Ready,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked,
+ RtemsTaskReqDelete_Post_Timer_Inactive },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqDelete_Post_Status_CalledFromISR,
+ RtemsTaskReqDelete_Post_FatalError_Nop, RtemsTaskReqDelete_Post_Zombie_No,
+ RtemsTaskReqDelete_Post_RealPriority_Nop,
+ RtemsTaskReqDelete_Post_RestartExtensions_Nop,
+ RtemsTaskReqDelete_Post_TerminateExtensions_Nop,
+ RtemsTaskReqDelete_Post_Dormant_No, RtemsTaskReqDelete_Post_Suspended_No,
+ RtemsTaskReqDelete_Post_Restarting_Yes,
+ RtemsTaskReqDelete_Post_Terminating_Yes,
+ RtemsTaskReqDelete_Post_Protected_No,
+ RtemsTaskReqDelete_Post_State_Blocked, RtemsTaskReqDelete_Post_Timer_Active }
+};
+
+static const uint8_t
+RtemsTaskReqDelete_Map[] = {
+ 3, 3, 21, 4, 3, 3, 3, 3, 22, 4, 3, 3, 3, 3, 21, 4, 3, 3, 3, 3, 22, 4, 3, 3,
+ 3, 3, 23, 4, 3, 3, 3, 3, 24, 4, 3, 3, 3, 3, 23, 4, 3, 3, 3, 3, 24, 4, 3, 3,
+ 3, 3, 25, 4, 3, 3, 3, 3, 26, 4, 3, 3, 3, 3, 25, 4, 3, 3, 3, 3, 26, 4, 3, 3,
+ 3, 3, 27, 4, 3, 3, 3, 3, 28, 4, 3, 3, 3, 3, 27, 4, 3, 3, 3, 3, 28, 4, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 21, 4, 3, 3, 3,
+ 3, 22, 4, 3, 3, 3, 3, 21, 4, 3, 3, 3, 3, 22, 4, 3, 3, 3, 3, 23, 4, 3, 3, 3,
+ 3, 24, 4, 3, 3, 3, 3, 23, 4, 3, 3, 3, 3, 24, 4, 3, 3, 3, 3, 25, 4, 3, 3, 3,
+ 3, 26, 4, 3, 3, 3, 3, 25, 4, 3, 3, 3, 3, 26, 4, 3, 3, 3, 3, 27, 4, 3, 3, 3,
+ 3, 28, 4, 3, 3, 3, 3, 27, 4, 3, 3, 3, 3, 28, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 29, 4, 3, 3, 3, 3, 30, 4, 3, 3, 3, 3, 29,
+ 4, 3, 3, 3, 3, 30, 4, 3, 3, 3, 3, 31, 4, 3, 3, 3, 3, 32, 4, 3, 3, 3, 3, 31,
+ 4, 3, 3, 3, 3, 32, 4, 3, 3, 3, 3, 19, 4, 3, 3, 3, 3, 19, 4, 3, 3, 3, 3, 19,
+ 4, 3, 3, 3, 3, 19, 4, 3, 3, 3, 3, 20, 4, 3, 3, 3, 3, 20, 4, 3, 3, 3, 3, 20,
+ 4, 3, 3, 3, 3, 20, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 3, 3, 29, 4, 3, 3, 3, 3, 30, 4, 3, 3, 3, 3, 29, 4, 3, 3, 3, 3, 30, 4,
+ 3, 3, 3, 3, 31, 4, 3, 3, 3, 3, 32, 4, 3, 3, 3, 3, 31, 4, 3, 3, 3, 3, 32, 4,
+ 3, 3, 3, 3, 19, 4, 3, 3, 3, 3, 19, 4, 3, 3, 3, 3, 19, 4, 3, 3, 3, 3, 19, 4,
+ 3, 3, 3, 3, 20, 4, 3, 3, 3, 3, 20, 4, 3, 3, 3, 3, 20, 4, 3, 3, 3, 3, 20, 4,
+ 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 73, 74, 75, 4,
+ 76, 77, 78, 79, 80, 4, 81, 82, 83, 84, 85, 4, 86, 87, 88, 89, 90, 4, 91, 92,
+ 93, 94, 95, 4, 96, 97, 98, 99, 100, 4, 101, 102, 103, 104, 105, 4, 106, 107,
+ 108, 109, 110, 4, 111, 112, 113, 114, 115, 4, 116, 117, 118, 119, 120, 4,
+ 121, 122, 123, 124, 125, 4, 126, 127, 128, 129, 130, 4, 131, 132, 133, 134,
+ 135, 4, 136, 137, 138, 139, 140, 4, 141, 142, 143, 144, 145, 4, 146, 147,
+ 148, 149, 150, 4, 151, 152, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 73, 74, 75, 4, 76, 77, 78, 79, 80, 4, 81, 82, 83, 84, 85, 4, 86, 87,
+ 88, 89, 90, 4, 91, 92, 93, 94, 95, 4, 96, 97, 98, 99, 100, 4, 101, 102, 103,
+ 104, 105, 4, 106, 107, 108, 109, 110, 4, 111, 112, 113, 114, 115, 4, 116,
+ 117, 118, 119, 120, 4, 121, 122, 123, 124, 125, 4, 126, 127, 128, 129, 130,
+ 4, 131, 132, 133, 134, 135, 4, 136, 137, 138, 139, 140, 4, 141, 142, 143,
+ 144, 145, 4, 146, 147, 148, 149, 150, 4, 151, 152, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 33, 34, 35, 4, 36, 37, 11, 11, 11, 4, 11, 11, 33, 34, 35, 4, 36, 37,
+ 11, 11, 11, 4, 11, 11, 38, 39, 40, 4, 41, 42, 12, 12, 12, 4, 12, 12, 38, 39,
+ 40, 4, 41, 42, 12, 12, 12, 4, 12, 12, 33, 34, 35, 4, 36, 37, 11, 11, 11, 4,
+ 11, 11, 33, 34, 35, 4, 36, 37, 11, 11, 11, 4, 11, 11, 38, 39, 40, 4, 41, 42,
+ 12, 12, 12, 4, 12, 12, 38, 39, 40, 4, 41, 42, 12, 12, 12, 4, 12, 12, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 43, 44, 45, 4, 46, 47, 13, 13,
+ 13, 4, 13, 13, 43, 44, 45, 4, 46, 47, 13, 13, 13, 4, 13, 13, 48, 49, 50, 4,
+ 51, 52, 14, 14, 14, 4, 14, 14, 48, 49, 50, 4, 51, 52, 14, 14, 14, 4, 14, 14,
+ 43, 44, 45, 4, 46, 47, 13, 13, 13, 4, 13, 13, 43, 44, 45, 4, 46, 47, 13, 13,
+ 13, 4, 13, 13, 48, 49, 50, 4, 51, 52, 14, 14, 14, 4, 14, 14, 48, 49, 50, 4,
+ 51, 52, 14, 14, 14, 4, 14, 14, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 53, 54, 55, 4, 56, 57, 15, 15, 15, 4, 15, 15, 53, 54, 55, 4, 56, 57,
+ 15, 15, 15, 4, 15, 15, 58, 59, 60, 4, 61, 62, 16, 16, 16, 4, 16, 16, 58, 59,
+ 60, 4, 61, 62, 16, 16, 16, 4, 16, 16, 53, 54, 55, 4, 56, 57, 15, 15, 15, 4,
+ 15, 15, 53, 54, 55, 4, 56, 57, 15, 15, 15, 4, 15, 15, 58, 59, 60, 4, 61, 62,
+ 16, 16, 16, 4, 16, 16, 58, 59, 60, 4, 61, 62, 16, 16, 16, 4, 16, 16, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 63, 64, 65, 4, 66, 67, 17, 17,
+ 17, 4, 17, 17, 63, 64, 65, 4, 66, 67, 17, 17, 17, 4, 17, 17, 68, 69, 70, 4,
+ 71, 72, 18, 18, 18, 4, 18, 18, 68, 69, 70, 4, 71, 72, 18, 18, 18, 4, 18, 18,
+ 63, 64, 65, 4, 66, 67, 17, 17, 17, 4, 17, 17, 63, 64, 65, 4, 66, 67, 17, 17,
+ 17, 4, 17, 17, 68, 69, 70, 4, 71, 72, 18, 18, 18, 4, 18, 18, 68, 69, 70, 4,
+ 71, 72, 18, 18, 18, 4, 18, 18, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 153, 154, 155, 4, 156, 157, 158, 159, 160, 4, 161, 162, 163, 164,
+ 165, 4, 166, 167, 168, 169, 170, 4, 171, 172, 173, 174, 175, 4, 176, 177,
+ 178, 179, 180, 4, 181, 182, 183, 184, 185, 4, 186, 187, 188, 189, 190, 4,
+ 191, 192, 193, 194, 195, 4, 196, 197, 198, 199, 200, 4, 201, 202, 203, 204,
+ 205, 4, 206, 207, 208, 209, 210, 4, 211, 212, 213, 214, 215, 4, 216, 217,
+ 218, 219, 220, 4, 221, 222, 223, 224, 225, 4, 226, 227, 228, 229, 230, 4,
+ 231, 232, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 153, 154, 155, 4, 156, 157, 158, 159,
+ 160, 4, 161, 162, 163, 164, 165, 4, 166, 167, 168, 169, 170, 4, 171, 172,
+ 173, 174, 175, 4, 176, 177, 178, 179, 180, 4, 181, 182, 183, 184, 185, 4,
+ 186, 187, 188, 189, 190, 4, 191, 192, 193, 194, 195, 4, 196, 197, 198, 199,
+ 200, 4, 201, 202, 203, 204, 205, 4, 206, 207, 208, 209, 210, 4, 211, 212,
+ 213, 214, 215, 4, 216, 217, 218, 219, 220, 4, 221, 222, 223, 224, 225, 4,
+ 226, 227, 228, 229, 230, 4, 231, 232, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static size_t RtemsTaskReqDelete_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqDelete_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqDelete_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqDelete_Fixture = {
+ .setup = RtemsTaskReqDelete_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqDelete_Teardown_Wrap,
+ .scope = RtemsTaskReqDelete_Scope,
+ .initial_context = &RtemsTaskReqDelete_Instance
+};
+
+static inline RtemsTaskReqDelete_Entry RtemsTaskReqDelete_PopEntry(
+ RtemsTaskReqDelete_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqDelete_Entries[
+ RtemsTaskReqDelete_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqDelete_SetPreConditionStates(
+ RtemsTaskReqDelete_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+ ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
+
+ if ( ctx->Map.entry.Pre_CallerPriority_NA ) {
+ ctx->Map.pcs[ 3 ] = RtemsTaskReqDelete_Pre_CallerPriority_NA;
+ } else {
+ ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Dormant_NA ) {
+ ctx->Map.pcs[ 4 ] = RtemsTaskReqDelete_Pre_Dormant_NA;
+ } else {
+ ctx->Map.pcs[ 4 ] = ctx->Map.pci[ 4 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Suspended_NA ) {
+ ctx->Map.pcs[ 5 ] = RtemsTaskReqDelete_Pre_Suspended_NA;
+ } else {
+ ctx->Map.pcs[ 5 ] = ctx->Map.pci[ 5 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Restarting_NA ) {
+ ctx->Map.pcs[ 6 ] = RtemsTaskReqDelete_Pre_Restarting_NA;
+ } else {
+ ctx->Map.pcs[ 6 ] = ctx->Map.pci[ 6 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Terminating_NA ) {
+ ctx->Map.pcs[ 7 ] = RtemsTaskReqDelete_Pre_Terminating_NA;
+ } else {
+ ctx->Map.pcs[ 7 ] = ctx->Map.pci[ 7 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Protected_NA ) {
+ ctx->Map.pcs[ 8 ] = RtemsTaskReqDelete_Pre_Protected_NA;
+ } else {
+ ctx->Map.pcs[ 8 ] = ctx->Map.pci[ 8 ];
+ }
+
+ if ( ctx->Map.entry.Pre_State_NA ) {
+ ctx->Map.pcs[ 9 ] = RtemsTaskReqDelete_Pre_State_NA;
+ } else {
+ ctx->Map.pcs[ 9 ] = ctx->Map.pci[ 9 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Timer_NA ) {
+ ctx->Map.pcs[ 10 ] = RtemsTaskReqDelete_Pre_Timer_NA;
+ } else {
+ ctx->Map.pcs[ 10 ] = ctx->Map.pci[ 10 ];
+ }
+}
+
+static void RtemsTaskReqDelete_TestVariant( RtemsTaskReqDelete_Context *ctx )
+{
+ RtemsTaskReqDelete_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqDelete_Pre_Context_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqDelete_Pre_ThreadDispatch_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqDelete_Pre_CallerPriority_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqDelete_Pre_Dormant_Prepare( ctx, ctx->Map.pcs[ 4 ] );
+ RtemsTaskReqDelete_Pre_Suspended_Prepare( ctx, ctx->Map.pcs[ 5 ] );
+ RtemsTaskReqDelete_Pre_Restarting_Prepare( ctx, ctx->Map.pcs[ 6 ] );
+ RtemsTaskReqDelete_Pre_Terminating_Prepare( ctx, ctx->Map.pcs[ 7 ] );
+ RtemsTaskReqDelete_Pre_Protected_Prepare( ctx, ctx->Map.pcs[ 8 ] );
+ RtemsTaskReqDelete_Pre_State_Prepare( ctx, ctx->Map.pcs[ 9 ] );
+ RtemsTaskReqDelete_Pre_Timer_Prepare( ctx, ctx->Map.pcs[ 10 ] );
+ RtemsTaskReqDelete_Action( ctx );
+ RtemsTaskReqDelete_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqDelete_Post_FatalError_Check(
+ ctx,
+ ctx->Map.entry.Post_FatalError
+ );
+ RtemsTaskReqDelete_Post_Zombie_Check( ctx, ctx->Map.entry.Post_Zombie );
+ RtemsTaskReqDelete_Post_RealPriority_Check(
+ ctx,
+ ctx->Map.entry.Post_RealPriority
+ );
+ RtemsTaskReqDelete_Post_RestartExtensions_Check(
+ ctx,
+ ctx->Map.entry.Post_RestartExtensions
+ );
+ RtemsTaskReqDelete_Post_TerminateExtensions_Check(
+ ctx,
+ ctx->Map.entry.Post_TerminateExtensions
+ );
+ RtemsTaskReqDelete_Post_Dormant_Check( ctx, ctx->Map.entry.Post_Dormant );
+ RtemsTaskReqDelete_Post_Suspended_Check(
+ ctx,
+ ctx->Map.entry.Post_Suspended
+ );
+ RtemsTaskReqDelete_Post_Restarting_Check(
+ ctx,
+ ctx->Map.entry.Post_Restarting
+ );
+ RtemsTaskReqDelete_Post_Terminating_Check(
+ ctx,
+ ctx->Map.entry.Post_Terminating
+ );
+ RtemsTaskReqDelete_Post_Protected_Check(
+ ctx,
+ ctx->Map.entry.Post_Protected
+ );
+ RtemsTaskReqDelete_Post_State_Check( ctx, ctx->Map.entry.Post_State );
+ RtemsTaskReqDelete_Post_Timer_Check( ctx, ctx->Map.entry.Post_Timer );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqDelete( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqDelete, &RtemsTaskReqDelete_Fixture )
+{
+ RtemsTaskReqDelete_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqDelete_Pre_Id_Executing;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqDelete_Pre_Id_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqDelete_Pre_Context_Task;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqDelete_Pre_Context_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ for (
+ ctx->Map.pci[ 2 ] = RtemsTaskReqDelete_Pre_ThreadDispatch_Disabled;
+ ctx->Map.pci[ 2 ] < RtemsTaskReqDelete_Pre_ThreadDispatch_NA;
+ ++ctx->Map.pci[ 2 ]
+ ) {
+ for (
+ ctx->Map.pci[ 3 ] = RtemsTaskReqDelete_Pre_CallerPriority_Higher;
+ ctx->Map.pci[ 3 ] < RtemsTaskReqDelete_Pre_CallerPriority_NA;
+ ++ctx->Map.pci[ 3 ]
+ ) {
+ for (
+ ctx->Map.pci[ 4 ] = RtemsTaskReqDelete_Pre_Dormant_No;
+ ctx->Map.pci[ 4 ] < RtemsTaskReqDelete_Pre_Dormant_NA;
+ ++ctx->Map.pci[ 4 ]
+ ) {
+ for (
+ ctx->Map.pci[ 5 ] = RtemsTaskReqDelete_Pre_Suspended_Yes;
+ ctx->Map.pci[ 5 ] < RtemsTaskReqDelete_Pre_Suspended_NA;
+ ++ctx->Map.pci[ 5 ]
+ ) {
+ for (
+ ctx->Map.pci[ 6 ] = RtemsTaskReqDelete_Pre_Restarting_No;
+ ctx->Map.pci[ 6 ] < RtemsTaskReqDelete_Pre_Restarting_NA;
+ ++ctx->Map.pci[ 6 ]
+ ) {
+ for (
+ ctx->Map.pci[ 7 ] = RtemsTaskReqDelete_Pre_Terminating_No;
+ ctx->Map.pci[ 7 ] < RtemsTaskReqDelete_Pre_Terminating_NA;
+ ++ctx->Map.pci[ 7 ]
+ ) {
+ for (
+ ctx->Map.pci[ 8 ] = RtemsTaskReqDelete_Pre_Protected_Yes;
+ ctx->Map.pci[ 8 ] < RtemsTaskReqDelete_Pre_Protected_NA;
+ ++ctx->Map.pci[ 8 ]
+ ) {
+ for (
+ ctx->Map.pci[ 9 ] = RtemsTaskReqDelete_Pre_State_Enqueued;
+ ctx->Map.pci[ 9 ] < RtemsTaskReqDelete_Pre_State_NA;
+ ++ctx->Map.pci[ 9 ]
+ ) {
+ for (
+ ctx->Map.pci[ 10 ] = RtemsTaskReqDelete_Pre_Timer_Inactive;
+ ctx->Map.pci[ 10 ] < RtemsTaskReqDelete_Pre_Timer_NA;
+ ++ctx->Map.pci[ 10 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqDelete_PopEntry( ctx );
+
+ if ( ctx->Map.entry.Skip ) {
+ continue;
+ }
+
+ RtemsTaskReqDelete_SetPreConditionStates( ctx );
+ RtemsTaskReqDelete_Prepare( ctx );
+ RtemsTaskReqDelete_TestVariant( ctx );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-exit.c b/testsuites/validation/tc-task-exit.c
new file mode 100644
index 0000000000..6ceaa06bd8
--- /dev/null
+++ b/testsuites/validation/tc-task-exit.c
@@ -0,0 +1,979 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqExit
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/test-scheduler.h>
+#include <rtems/score/apimutex.h>
+#include <rtems/score/threaddispatch.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqExit spec:/rtems/task/req/exit
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqExit_Pre_Restarting_Yes,
+ RtemsTaskReqExit_Pre_Restarting_No,
+ RtemsTaskReqExit_Pre_Restarting_NA
+} RtemsTaskReqExit_Pre_Restarting;
+
+typedef enum {
+ RtemsTaskReqExit_Pre_Terminating_Yes,
+ RtemsTaskReqExit_Pre_Terminating_No,
+ RtemsTaskReqExit_Pre_Terminating_NA
+} RtemsTaskReqExit_Pre_Terminating;
+
+typedef enum {
+ RtemsTaskReqExit_Pre_Protected_Yes,
+ RtemsTaskReqExit_Pre_Protected_No,
+ RtemsTaskReqExit_Pre_Protected_NA
+} RtemsTaskReqExit_Pre_Protected;
+
+typedef enum {
+ RtemsTaskReqExit_Pre_ThreadDispatch_Enabled,
+ RtemsTaskReqExit_Pre_ThreadDispatch_Disabled,
+ RtemsTaskReqExit_Pre_ThreadDispatch_NA
+} RtemsTaskReqExit_Pre_ThreadDispatch;
+
+typedef enum {
+ RtemsTaskReqExit_Post_FatalError_Yes,
+ RtemsTaskReqExit_Post_FatalError_Nop,
+ RtemsTaskReqExit_Post_FatalError_NA
+} RtemsTaskReqExit_Post_FatalError;
+
+typedef enum {
+ RtemsTaskReqExit_Post_DeleteExtensions_Nop,
+ RtemsTaskReqExit_Post_DeleteExtensions_NA
+} RtemsTaskReqExit_Post_DeleteExtensions;
+
+typedef enum {
+ RtemsTaskReqExit_Post_RestartExtensions_Nop,
+ RtemsTaskReqExit_Post_RestartExtensions_NA
+} RtemsTaskReqExit_Post_RestartExtensions;
+
+typedef enum {
+ RtemsTaskReqExit_Post_TerminateExtensions_Yes,
+ RtemsTaskReqExit_Post_TerminateExtensions_Nop,
+ RtemsTaskReqExit_Post_TerminateExtensions_NA
+} RtemsTaskReqExit_Post_TerminateExtensions;
+
+typedef enum {
+ RtemsTaskReqExit_Post_Block_Yes,
+ RtemsTaskReqExit_Post_Block_Nop,
+ RtemsTaskReqExit_Post_Block_NA
+} RtemsTaskReqExit_Post_Block;
+
+typedef enum {
+ RtemsTaskReqExit_Post_ID_Valid,
+ RtemsTaskReqExit_Post_ID_Invalid,
+ RtemsTaskReqExit_Post_ID_NA
+} RtemsTaskReqExit_Post_ID;
+
+typedef enum {
+ RtemsTaskReqExit_Post_Delete_NextAllocate,
+ RtemsTaskReqExit_Post_Delete_Nop,
+ RtemsTaskReqExit_Post_Delete_NA
+} RtemsTaskReqExit_Post_Delete;
+
+typedef struct {
+ uint32_t Skip : 1;
+ uint32_t Pre_Restarting_NA : 1;
+ uint32_t Pre_Terminating_NA : 1;
+ uint32_t Pre_Protected_NA : 1;
+ uint32_t Pre_ThreadDispatch_NA : 1;
+ uint32_t Post_FatalError : 2;
+ uint32_t Post_DeleteExtensions : 1;
+ uint32_t Post_RestartExtensions : 1;
+ uint32_t Post_TerminateExtensions : 2;
+ uint32_t Post_Block : 2;
+ uint32_t Post_ID : 2;
+ uint32_t Post_Delete : 2;
+} RtemsTaskReqExit_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/exit test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides the scheduler operation records.
+ */
+ T_scheduler_log_4 scheduler_log;
+
+ /**
+ * @brief This member contains the identifier of the runner task.
+ */
+ rtems_id runner_id;
+
+ /**
+ * @brief This member contains the identifier of the worker task.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief This member contains the identifier of the deleter task.
+ */
+ rtems_id deleter_id;
+
+ /**
+ * @brief This member contains the identifier of the test user extensions.
+ */
+ rtems_id extension_id;
+
+ /**
+ * @brief This member contains the count of fatal extension calls.
+ */
+ uint32_t fatal_extension_calls;
+
+ /**
+ * @brief This member contains the count of thread delete extension calls.
+ */
+ uint32_t delete_extension_calls;
+
+ /**
+ * @brief This member contains the count of thread restart extension calls.
+ */
+ uint32_t restart_extension_calls;
+
+ /**
+ * @brief This member contains the count of thread terminate extension calls.
+ */
+ uint32_t terminate_extension_calls;
+
+ /**
+ * @brief If this member is true, then the thread life of the worker is
+ * protected before the rtems_task_exit() call.
+ */
+ bool protected;
+
+ /**
+ * @brief If this member is true, then the worker locked the allocator.
+ */
+ bool allocator_locked;
+
+ /**
+ * @brief If this member is true, then the worker is restarting before the
+ * rtems_task_exit() call.
+ */
+ bool restarting;
+
+ /**
+ * @brief If this member is true, then the worker is terminating before the
+ * rtems_task_exit() call.
+ */
+ bool terminating;
+
+ /**
+ * @brief If this member is true, then thread dispatching is disabled by the
+ * worker task before the rtems_task_exit() call.
+ */
+ bool dispatch_disabled;
+
+ /**
+ * @brief If this member is true, then it is expected to delete the worker.
+ */
+ bool delete_worker_expected;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 4 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqExit_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqExit_Context;
+
+static RtemsTaskReqExit_Context
+ RtemsTaskReqExit_Instance;
+
+static const char * const RtemsTaskReqExit_PreDesc_Restarting[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqExit_PreDesc_Terminating[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqExit_PreDesc_Protected[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqExit_PreDesc_ThreadDispatch[] = {
+ "Enabled",
+ "Disabled",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqExit_PreDesc[] = {
+ RtemsTaskReqExit_PreDesc_Restarting,
+ RtemsTaskReqExit_PreDesc_Terminating,
+ RtemsTaskReqExit_PreDesc_Protected,
+ RtemsTaskReqExit_PreDesc_ThreadDispatch,
+ NULL
+};
+
+typedef RtemsTaskReqExit_Context Context;
+
+static void Signal( rtems_signal_set signals )
+{
+ Context *ctx;
+ T_scheduler_log *log;
+ Thread_Life_state life_state;
+
+ (void) signals;
+ ctx = T_fixture_context();
+
+ if ( ctx->dispatch_disabled ) {
+ _Thread_Dispatch_disable();
+ }
+
+ /* Check that the thread life state was prepared correctly */
+ life_state = GetExecuting()->Life.state;
+ T_eq( ctx->protected, ( life_state & THREAD_LIFE_PROTECTED ) != 0 );
+ T_eq( ctx->restarting, ( life_state & THREAD_LIFE_RESTARTING ) != 0 );
+ T_eq( ctx->terminating, ( life_state & THREAD_LIFE_TERMINATING ) != 0 );
+
+ log = T_scheduler_record_4( &ctx->scheduler_log );
+ T_null( log );
+
+ ctx->delete_extension_calls = 0;
+ ctx->fatal_extension_calls = 0;
+ ctx->restart_extension_calls = 0;
+ ctx->terminate_extension_calls = 0;
+
+ rtems_task_exit();
+}
+
+static void Deleter( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = (Context *) arg;
+
+ if ( ctx != NULL ) {
+ DeleteTask( ctx->worker_id );
+ }
+
+ SuspendSelf();
+}
+
+static void Worker( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_status_code sc;
+
+ ctx = (Context *) arg;
+
+ sc = rtems_signal_catch( Signal, RTEMS_NO_ASR );
+ T_rsc_success( sc );
+
+ if ( ctx->protected ) {
+ _RTEMS_Lock_allocator();
+ ctx->allocator_locked = true;
+ }
+
+ Yield();
+}
+
+static void UnlockAllocator( Context *ctx )
+{
+ if ( ctx->allocator_locked ) {
+ ctx->allocator_locked = false;
+ _RTEMS_Unlock_allocator();
+ }
+}
+
+static void Fatal(
+ rtems_fatal_source source,
+ rtems_fatal_code code,
+ void *arg
+)
+{
+ Context *ctx;
+ T_scheduler_log *log;
+ Per_CPU_Control *cpu_self;
+
+ ctx = arg;
+ ++ctx->fatal_extension_calls;
+
+ T_eq_int( source, INTERNAL_ERROR_CORE );
+ T_eq_ulong( code, INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL );
+ T_assert_eq_int( ctx->fatal_extension_calls, 1 );
+
+ log = T_scheduler_record( NULL );
+ T_eq_ptr( &log->header, &ctx->scheduler_log.header );
+
+ UnlockAllocator( ctx );
+ SuspendSelf();
+
+ cpu_self = _Per_CPU_Get();
+ _Thread_Dispatch_unnest( cpu_self );
+ _Thread_Dispatch_direct_no_return( cpu_self );
+}
+
+static void ThreadDelete( rtems_tcb *executing, rtems_tcb *deleted )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->delete_extension_calls;
+
+ T_eq_u32( executing->Object.id, ctx->runner_id );
+
+ if ( ctx->delete_worker_expected ) {
+ T_eq_u32( deleted->Object.id, ctx->worker_id );
+ }
+}
+
+static void ThreadRestart( rtems_tcb *executing, rtems_tcb *restarted )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->restart_extension_calls;
+}
+
+static void ThreadTerminate( rtems_tcb *executing )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->terminate_extension_calls;
+
+ T_eq_u32( executing->Object.id, ctx->worker_id );
+
+ UnlockAllocator( ctx );
+}
+
+static const rtems_extensions_table extensions = {
+ .thread_delete = ThreadDelete,
+ .thread_restart = ThreadRestart,
+ .thread_terminate = ThreadTerminate
+};
+
+static void RtemsTaskReqExit_Pre_Restarting_Prepare(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Pre_Restarting state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqExit_Pre_Restarting_Yes: {
+ /*
+ * While the calling task is restarting.
+ */
+ ctx->restarting = true;
+ break;
+ }
+
+ case RtemsTaskReqExit_Pre_Restarting_No: {
+ /*
+ * While the calling task is not restarting.
+ */
+ ctx->restarting = false;
+ break;
+ }
+
+ case RtemsTaskReqExit_Pre_Restarting_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Pre_Terminating_Prepare(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Pre_Terminating state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqExit_Pre_Terminating_Yes: {
+ /*
+ * While the calling task is terminating.
+ */
+ ctx->terminating = true;
+ break;
+ }
+
+ case RtemsTaskReqExit_Pre_Terminating_No: {
+ /*
+ * While the calling task is not terminating.
+ */
+ ctx->terminating = false;
+ break;
+ }
+
+ case RtemsTaskReqExit_Pre_Terminating_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Pre_Protected_Prepare(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Pre_Protected state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqExit_Pre_Protected_Yes: {
+ /*
+ * While the thread life of the calling task is protected.
+ */
+ ctx->protected = true;
+ break;
+ }
+
+ case RtemsTaskReqExit_Pre_Protected_No: {
+ /*
+ * While the thread life of the calling task is not protected.
+ */
+ ctx->protected = false;
+ break;
+ }
+
+ case RtemsTaskReqExit_Pre_Protected_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Pre_ThreadDispatch_Prepare(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Pre_ThreadDispatch state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqExit_Pre_ThreadDispatch_Enabled: {
+ /*
+ * While thread dispatching is enabled for the calling task.
+ */
+ ctx->dispatch_disabled = false;
+ break;
+ }
+
+ case RtemsTaskReqExit_Pre_ThreadDispatch_Disabled: {
+ /*
+ * While thread dispatching is disabled for the calling task.
+ */
+ ctx->dispatch_disabled = true;
+ break;
+ }
+
+ case RtemsTaskReqExit_Pre_ThreadDispatch_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Post_FatalError_Check(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Post_FatalError state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqExit_Post_FatalError_Yes: {
+ /*
+ * The fatal error with a fatal source of INTERNAL_ERROR_CORE and a fatal
+ * code of INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL shall occur
+ * by the rtems_task_exit() call.
+ */
+ T_eq_u32( ctx->fatal_extension_calls, 1 );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_FatalError_Nop: {
+ /*
+ * No fatal error shall occur by the rtems_task_exit() call.
+ */
+ T_eq_u32( ctx->fatal_extension_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_FatalError_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Post_DeleteExtensions_Check(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Post_DeleteExtensions state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqExit_Post_DeleteExtensions_Nop: {
+ /*
+ * The thread delete user extensions shall not be invoked by the
+ * rtems_task_exit() call.
+ */
+ T_eq_u32( ctx->delete_extension_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_DeleteExtensions_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Post_RestartExtensions_Check(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Post_RestartExtensions state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqExit_Post_RestartExtensions_Nop: {
+ /*
+ * The thread restart user extensions shall not be invoked by the
+ * rtems_task_exit() call.
+ */
+ T_eq_u32( ctx->restart_extension_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_RestartExtensions_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Post_TerminateExtensions_Check(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Post_TerminateExtensions state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqExit_Post_TerminateExtensions_Yes: {
+ /*
+ * The thread terminate user extensions shall be invoked by the
+ * rtems_task_exit() call.
+ */
+ if ( ctx->protected ) {
+ T_eq_u32( ctx->terminate_extension_calls, 2 );
+ } else {
+ T_eq_u32( ctx->terminate_extension_calls, 1 );
+ }
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_TerminateExtensions_Nop: {
+ /*
+ * The thread terminate user extensions shall not be invoked by the
+ * rtems_task_exit() call.
+ */
+ T_eq_u32( ctx->terminate_extension_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_TerminateExtensions_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Post_Block_Check(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Post_Block state
+)
+{
+ const T_scheduler_event *event;
+ size_t index;
+
+ index = 0;
+
+ switch ( state ) {
+ case RtemsTaskReqExit_Post_Block_Yes: {
+ /*
+ * The calling task shall be blocked exactly once by the
+ * rtems_task_exit() call.
+ */
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_BLOCK );
+ T_eq_u32( event->thread->Object.id, ctx->worker_id );
+
+ if ( ctx->terminating ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UNBLOCK );
+ T_eq_u32( event->thread->Object.id, ctx->deleter_id );
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_BLOCK );
+ T_eq_u32( event->thread->Object.id, ctx->deleter_id );
+ }
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_NOP );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_Block_Nop: {
+ /*
+ * No task shall be blocked by the rtems_task_exit() call.
+ */
+ T_eq_sz( ctx->scheduler_log.header.recorded, 0 );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_Block_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Post_ID_Check(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Post_ID state
+)
+{
+ rtems_status_code sc;
+ rtems_id id;
+
+ sc = rtems_task_get_scheduler( ctx->worker_id, &id );
+
+ switch ( state ) {
+ case RtemsTaskReqExit_Post_ID_Valid: {
+ /*
+ * The object identifier of the calling task shall be valid.
+ */
+ T_rsc_success( sc );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_ID_Invalid: {
+ /*
+ * The object identifier of the calling task shall be invalid.
+ */
+ T_rsc( sc, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_ID_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqExit_Post_Delete_Check(
+ RtemsTaskReqExit_Context *ctx,
+ RtemsTaskReqExit_Post_Delete state
+)
+{
+ rtems_id id;
+
+ id = CreateTask( "TEMP", PRIO_LOW );
+
+ switch ( state ) {
+ case RtemsTaskReqExit_Post_Delete_NextAllocate: {
+ /*
+ * The calling task shall be deleted by the next directive which
+ * allocates a task.
+ */
+ T_eq_u32( ctx->delete_extension_calls, 1 );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_Delete_Nop: {
+ /*
+ * The calling task shall not be deleted by the next directive which
+ * allocates a task.
+ */
+ T_eq_u32( ctx->delete_extension_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqExit_Post_Delete_NA:
+ break;
+ }
+
+ DeleteTask( id );
+}
+
+static void RtemsTaskReqExit_Setup( RtemsTaskReqExit_Context *ctx )
+{
+ rtems_status_code sc;
+
+ ctx->runner_id = rtems_task_self();
+
+ sc = rtems_extension_create(
+ rtems_build_name( 'T', 'E', 'S', 'T' ),
+ &extensions,
+ &ctx->extension_id
+ );
+ T_rsc_success( sc );
+
+ SetFatalHandler( Fatal, ctx );
+ SetSelfPriority( PRIO_NORMAL );
+
+ ctx->deleter_id = CreateTask( "DELE", PRIO_HIGH );
+ StartTask( ctx->deleter_id, Deleter, NULL );
+}
+
+static void RtemsTaskReqExit_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqExit_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqExit_Setup( ctx );
+}
+
+static void RtemsTaskReqExit_Teardown( RtemsTaskReqExit_Context *ctx )
+{
+ rtems_status_code sc;
+
+ sc = rtems_extension_delete( ctx->extension_id );
+ T_rsc_success( sc );
+
+ SetFatalHandler( NULL, NULL );
+ DeleteTask( ctx->deleter_id );
+ RestoreRunnerASR();
+ RestoreRunnerPriority();
+}
+
+static void RtemsTaskReqExit_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqExit_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqExit_Teardown( ctx );
+}
+
+static void RtemsTaskReqExit_Action( RtemsTaskReqExit_Context *ctx )
+{
+ rtems_status_code sc;
+
+ ctx->delete_worker_expected = false;
+ ctx->worker_id = CreateTask( "WORK", PRIO_NORMAL );
+ ctx->delete_worker_expected = true;
+
+ StartTask( ctx->worker_id, Worker, ctx );
+
+ /* Let the worker catch signals and set the thread life protection state */
+ Yield();
+
+ sc = rtems_signal_send( ctx->worker_id, RTEMS_SIGNAL_0 );
+ T_rsc_success( sc );
+
+ if ( ctx->restarting ) {
+ sc = rtems_task_restart( ctx->worker_id, (rtems_task_argument) ctx );
+ T_rsc_success( sc );
+ }
+
+ if ( ctx->terminating ) {
+ sc = rtems_task_restart( ctx->deleter_id, (rtems_task_argument) ctx );
+ T_rsc_success( sc );
+ } else {
+ Yield();
+ }
+
+ if ( !ctx->dispatch_disabled ) {
+ T_scheduler_log *log;
+
+ log = T_scheduler_record( NULL );
+ T_eq_ptr( &log->header, &ctx->scheduler_log.header );
+ }
+}
+
+static void RtemsTaskReqExit_Cleanup( RtemsTaskReqExit_Context *ctx )
+{
+ if ( ctx->dispatch_disabled ) {
+ DeleteTask( ctx->worker_id );
+ }
+}
+
+static const RtemsTaskReqExit_Entry
+RtemsTaskReqExit_Entries[] = {
+ { 0, 0, 0, 0, 0, RtemsTaskReqExit_Post_FatalError_Nop,
+ RtemsTaskReqExit_Post_DeleteExtensions_Nop,
+ RtemsTaskReqExit_Post_RestartExtensions_Nop,
+ RtemsTaskReqExit_Post_TerminateExtensions_Yes,
+ RtemsTaskReqExit_Post_Block_Yes, RtemsTaskReqExit_Post_ID_Invalid,
+ RtemsTaskReqExit_Post_Delete_NextAllocate },
+ { 0, 0, 0, 0, 0, RtemsTaskReqExit_Post_FatalError_Yes,
+ RtemsTaskReqExit_Post_DeleteExtensions_Nop,
+ RtemsTaskReqExit_Post_RestartExtensions_Nop,
+ RtemsTaskReqExit_Post_TerminateExtensions_Nop,
+ RtemsTaskReqExit_Post_Block_Nop, RtemsTaskReqExit_Post_ID_Valid,
+ RtemsTaskReqExit_Post_Delete_Nop }
+};
+
+static const uint8_t
+RtemsTaskReqExit_Map[] = {
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
+};
+
+static size_t RtemsTaskReqExit_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqExit_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqExit_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqExit_Fixture = {
+ .setup = RtemsTaskReqExit_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqExit_Teardown_Wrap,
+ .scope = RtemsTaskReqExit_Scope,
+ .initial_context = &RtemsTaskReqExit_Instance
+};
+
+static inline RtemsTaskReqExit_Entry RtemsTaskReqExit_PopEntry(
+ RtemsTaskReqExit_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqExit_Entries[
+ RtemsTaskReqExit_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqExit_TestVariant( RtemsTaskReqExit_Context *ctx )
+{
+ RtemsTaskReqExit_Pre_Restarting_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqExit_Pre_Terminating_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqExit_Pre_Protected_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqExit_Pre_ThreadDispatch_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqExit_Action( ctx );
+ RtemsTaskReqExit_Post_FatalError_Check(
+ ctx,
+ ctx->Map.entry.Post_FatalError
+ );
+ RtemsTaskReqExit_Post_DeleteExtensions_Check(
+ ctx,
+ ctx->Map.entry.Post_DeleteExtensions
+ );
+ RtemsTaskReqExit_Post_RestartExtensions_Check(
+ ctx,
+ ctx->Map.entry.Post_RestartExtensions
+ );
+ RtemsTaskReqExit_Post_TerminateExtensions_Check(
+ ctx,
+ ctx->Map.entry.Post_TerminateExtensions
+ );
+ RtemsTaskReqExit_Post_Block_Check( ctx, ctx->Map.entry.Post_Block );
+ RtemsTaskReqExit_Post_ID_Check( ctx, ctx->Map.entry.Post_ID );
+ RtemsTaskReqExit_Post_Delete_Check( ctx, ctx->Map.entry.Post_Delete );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqExit( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqExit, &RtemsTaskReqExit_Fixture )
+{
+ RtemsTaskReqExit_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pcs[ 0 ] = RtemsTaskReqExit_Pre_Restarting_Yes;
+ ctx->Map.pcs[ 0 ] < RtemsTaskReqExit_Pre_Restarting_NA;
+ ++ctx->Map.pcs[ 0 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqExit_Pre_Terminating_Yes;
+ ctx->Map.pcs[ 1 ] < RtemsTaskReqExit_Pre_Terminating_NA;
+ ++ctx->Map.pcs[ 1 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqExit_Pre_Protected_Yes;
+ ctx->Map.pcs[ 2 ] < RtemsTaskReqExit_Pre_Protected_NA;
+ ++ctx->Map.pcs[ 2 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 3 ] = RtemsTaskReqExit_Pre_ThreadDispatch_Enabled;
+ ctx->Map.pcs[ 3 ] < RtemsTaskReqExit_Pre_ThreadDispatch_NA;
+ ++ctx->Map.pcs[ 3 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqExit_PopEntry( ctx );
+ RtemsTaskReqExit_TestVariant( ctx );
+ RtemsTaskReqExit_Cleanup( ctx );
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-get-affinity.c b/testsuites/validation/tc-task-get-affinity.c
new file mode 100644
index 0000000000..8200f9f840
--- /dev/null
+++ b/testsuites/validation/tc-task-get-affinity.c
@@ -0,0 +1,520 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqGetAffinity
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqGetAffinity \
+ * spec:/rtems/task/req/get-affinity
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqGetAffinity_Pre_Id_Invalid,
+ RtemsTaskReqGetAffinity_Pre_Id_Task,
+ RtemsTaskReqGetAffinity_Pre_Id_NA
+} RtemsTaskReqGetAffinity_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqGetAffinity_Pre_CPUSetSize_Valid,
+ RtemsTaskReqGetAffinity_Pre_CPUSetSize_TooSmall,
+ RtemsTaskReqGetAffinity_Pre_CPUSetSize_Askew,
+ RtemsTaskReqGetAffinity_Pre_CPUSetSize_NA
+} RtemsTaskReqGetAffinity_Pre_CPUSetSize;
+
+typedef enum {
+ RtemsTaskReqGetAffinity_Pre_CPUSet_Valid,
+ RtemsTaskReqGetAffinity_Pre_CPUSet_Null,
+ RtemsTaskReqGetAffinity_Pre_CPUSet_NA
+} RtemsTaskReqGetAffinity_Pre_CPUSet;
+
+typedef enum {
+ RtemsTaskReqGetAffinity_Post_Status_Ok,
+ RtemsTaskReqGetAffinity_Post_Status_InvAddr,
+ RtemsTaskReqGetAffinity_Post_Status_InvId,
+ RtemsTaskReqGetAffinity_Post_Status_InvSize,
+ RtemsTaskReqGetAffinity_Post_Status_NA
+} RtemsTaskReqGetAffinity_Post_Status;
+
+typedef enum {
+ RtemsTaskReqGetAffinity_Post_CPUSetObj_Set,
+ RtemsTaskReqGetAffinity_Post_CPUSetObj_Nop,
+ RtemsTaskReqGetAffinity_Post_CPUSetObj_NA
+} RtemsTaskReqGetAffinity_Post_CPUSetObj;
+
+typedef struct {
+ uint16_t Skip : 1;
+ uint16_t Pre_Id_NA : 1;
+ uint16_t Pre_CPUSetSize_NA : 1;
+ uint16_t Pre_CPUSet_NA : 1;
+ uint16_t Post_Status : 3;
+ uint16_t Post_CPUSetObj : 2;
+} RtemsTaskReqGetAffinity_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/get-affinity test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides the object referenced by the ``cpuset``
+ * parameter.
+ */
+ cpu_set_t cpuset_obj;
+
+ /**
+ * @brief This member contains the return value of the
+ * rtems_task_get_affinity() call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ /**
+ * @brief This member specifies if the ``cpusetsize`` parameter value.
+ */
+ size_t cpusetsize;
+
+ /**
+ * @brief This member specifies if the ``cpuset`` parameter value.
+ */
+ cpu_set_t *cpuset;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 3 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqGetAffinity_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqGetAffinity_Context;
+
+static RtemsTaskReqGetAffinity_Context
+ RtemsTaskReqGetAffinity_Instance;
+
+static const char * const RtemsTaskReqGetAffinity_PreDesc_Id[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqGetAffinity_PreDesc_CPUSetSize[] = {
+ "Valid",
+ "TooSmall",
+ "Askew",
+ "NA"
+};
+
+static const char * const RtemsTaskReqGetAffinity_PreDesc_CPUSet[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqGetAffinity_PreDesc[] = {
+ RtemsTaskReqGetAffinity_PreDesc_Id,
+ RtemsTaskReqGetAffinity_PreDesc_CPUSetSize,
+ RtemsTaskReqGetAffinity_PreDesc_CPUSet,
+ NULL
+};
+
+static void RtemsTaskReqGetAffinity_Pre_Id_Prepare(
+ RtemsTaskReqGetAffinity_Context *ctx,
+ RtemsTaskReqGetAffinity_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetAffinity_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Pre_Id_Task: {
+ /*
+ * While the ``id`` parameter is associated with a task.
+ */
+ ctx->id = RTEMS_SELF;
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetAffinity_Pre_CPUSetSize_Prepare(
+ RtemsTaskReqGetAffinity_Context *ctx,
+ RtemsTaskReqGetAffinity_Pre_CPUSetSize state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetAffinity_Pre_CPUSetSize_Valid: {
+ /*
+ * While the ``cpusetsize`` parameter is an integral multiple of the size
+ * of long, while the ``cpusetsize`` parameter specifies a processor set
+ * which is large enough to contain the processor affinity set of the
+ * task.
+ */
+ ctx->cpusetsize = sizeof( ctx->cpuset_obj );
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Pre_CPUSetSize_TooSmall: {
+ /*
+ * While the ``cpusetsize`` parameter is an integral multiple of the size
+ * of long, while the ``cpusetsize`` parameter specifies a processor set
+ * which is not large enough to contain the processor affinity set of the
+ * task.
+ */
+ ctx->cpusetsize = 0;
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Pre_CPUSetSize_Askew: {
+ /*
+ * While the ``cpusetsize`` parameter is not an integral multiple of the
+ * size of long.
+ */
+ ctx->cpusetsize = SIZE_MAX;
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Pre_CPUSetSize_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetAffinity_Pre_CPUSet_Prepare(
+ RtemsTaskReqGetAffinity_Context *ctx,
+ RtemsTaskReqGetAffinity_Pre_CPUSet state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetAffinity_Pre_CPUSet_Valid: {
+ /*
+ * While the ``cpuset`` parameter references an object of type cpu_set_t.
+ */
+ ctx->cpuset = &ctx->cpuset_obj;
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Pre_CPUSet_Null: {
+ /*
+ * While the ``cpuset`` parameter is equal to NULL.
+ */
+ ctx->cpuset = NULL;
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Pre_CPUSet_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetAffinity_Post_Status_Check(
+ RtemsTaskReqGetAffinity_Context *ctx,
+ RtemsTaskReqGetAffinity_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetAffinity_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_get_affinity() shall be
+ * RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_get_affinity() shall be
+ * RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_get_affinity() shall be
+ * RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Post_Status_InvSize: {
+ /*
+ * The return status of rtems_task_get_affinity() shall be
+ * RTEMS_INVALID_SIZE.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_SIZE );
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetAffinity_Post_CPUSetObj_Check(
+ RtemsTaskReqGetAffinity_Context *ctx,
+ RtemsTaskReqGetAffinity_Post_CPUSetObj state
+)
+{
+ cpu_set_t set;
+ uint32_t cpu_index;
+ uint32_t cpu_max;
+
+ switch ( state ) {
+ case RtemsTaskReqGetAffinity_Post_CPUSetObj_Set: {
+ /*
+ * The value of the object referenced by the ``cpuset`` parameter shall
+ * be set to the processor affinity set of the task specified by the
+ * ``id`` parameter at some point during the call after the return of the
+ * rtems_task_get_affinity() call.
+ */
+ CPU_ZERO( &set );
+
+ cpu_max = rtems_scheduler_get_processor_maximum();
+
+ /* We need the online processors */
+ if ( cpu_max > 4 ) {
+ cpu_max = 4;
+ }
+
+ for ( cpu_index = 0; cpu_index < cpu_max; ++cpu_index ) {
+ CPU_SET( (int) cpu_index, &set );
+ }
+
+ T_eq_int( CPU_CMP( &ctx->cpuset_obj, &set ), 0 );
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Post_CPUSetObj_Nop: {
+ /*
+ * Objects referenced by the ``cpuset`` parameter in past calls to
+ * rtems_task_get_affinity() shall not be accessed by the
+ * rtems_task_get_affinity() call.
+ */
+ CPU_ZERO( &set );
+ T_eq_int( CPU_CMP( &ctx->cpuset_obj, &set ), 0 );
+ break;
+ }
+
+ case RtemsTaskReqGetAffinity_Post_CPUSetObj_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetAffinity_Prepare(
+ RtemsTaskReqGetAffinity_Context *ctx
+)
+{
+ CPU_ZERO( &ctx->cpuset_obj );
+}
+
+static void RtemsTaskReqGetAffinity_Action(
+ RtemsTaskReqGetAffinity_Context *ctx
+)
+{
+ ctx->status = rtems_task_get_affinity(
+ ctx->id,
+ ctx->cpusetsize,
+ ctx->cpuset
+ );
+}
+
+static const RtemsTaskReqGetAffinity_Entry
+RtemsTaskReqGetAffinity_Entries[] = {
+ { 0, 0, 0, 0, RtemsTaskReqGetAffinity_Post_Status_InvAddr,
+ RtemsTaskReqGetAffinity_Post_CPUSetObj_Nop },
+ { 0, 0, 0, 0, RtemsTaskReqGetAffinity_Post_Status_InvId,
+ RtemsTaskReqGetAffinity_Post_CPUSetObj_Nop },
+ { 0, 0, 0, 0, RtemsTaskReqGetAffinity_Post_Status_InvSize,
+ RtemsTaskReqGetAffinity_Post_CPUSetObj_Nop },
+ { 0, 0, 0, 0, RtemsTaskReqGetAffinity_Post_Status_Ok,
+ RtemsTaskReqGetAffinity_Post_CPUSetObj_Set }
+};
+
+static const uint8_t
+RtemsTaskReqGetAffinity_Map[] = {
+ 1, 0, 1, 0, 1, 0, 3, 0, 2, 0, 2, 0
+};
+
+static size_t RtemsTaskReqGetAffinity_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqGetAffinity_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope(
+ RtemsTaskReqGetAffinity_PreDesc,
+ buf,
+ n,
+ ctx->Map.pcs
+ );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqGetAffinity_Fixture = {
+ .setup = NULL,
+ .stop = NULL,
+ .teardown = NULL,
+ .scope = RtemsTaskReqGetAffinity_Scope,
+ .initial_context = &RtemsTaskReqGetAffinity_Instance
+};
+
+static inline RtemsTaskReqGetAffinity_Entry RtemsTaskReqGetAffinity_PopEntry(
+ RtemsTaskReqGetAffinity_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqGetAffinity_Entries[
+ RtemsTaskReqGetAffinity_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqGetAffinity_TestVariant(
+ RtemsTaskReqGetAffinity_Context *ctx
+)
+{
+ RtemsTaskReqGetAffinity_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqGetAffinity_Pre_CPUSetSize_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqGetAffinity_Pre_CPUSet_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqGetAffinity_Action( ctx );
+ RtemsTaskReqGetAffinity_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqGetAffinity_Post_CPUSetObj_Check(
+ ctx,
+ ctx->Map.entry.Post_CPUSetObj
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqGetAffinity( void )
+ */
+T_TEST_CASE_FIXTURE(
+ RtemsTaskReqGetAffinity,
+ &RtemsTaskReqGetAffinity_Fixture
+)
+{
+ RtemsTaskReqGetAffinity_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pcs[ 0 ] = RtemsTaskReqGetAffinity_Pre_Id_Invalid;
+ ctx->Map.pcs[ 0 ] < RtemsTaskReqGetAffinity_Pre_Id_NA;
+ ++ctx->Map.pcs[ 0 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqGetAffinity_Pre_CPUSetSize_Valid;
+ ctx->Map.pcs[ 1 ] < RtemsTaskReqGetAffinity_Pre_CPUSetSize_NA;
+ ++ctx->Map.pcs[ 1 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqGetAffinity_Pre_CPUSet_Valid;
+ ctx->Map.pcs[ 2 ] < RtemsTaskReqGetAffinity_Pre_CPUSet_NA;
+ ++ctx->Map.pcs[ 2 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqGetAffinity_PopEntry( ctx );
+ RtemsTaskReqGetAffinity_Prepare( ctx );
+ RtemsTaskReqGetAffinity_TestVariant( ctx );
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-get-priority.c b/testsuites/validation/tc-task-get-priority.c
new file mode 100644
index 0000000000..83843f4175
--- /dev/null
+++ b/testsuites/validation/tc-task-get-priority.c
@@ -0,0 +1,620 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqGetPriority
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include "ts-config.h"
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqGetPriority \
+ * spec:/rtems/task/req/get-priority
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqGetPriority_Pre_TaskId_Invalid,
+ RtemsTaskReqGetPriority_Pre_TaskId_Task,
+ RtemsTaskReqGetPriority_Pre_TaskId_NA
+} RtemsTaskReqGetPriority_Pre_TaskId;
+
+typedef enum {
+ RtemsTaskReqGetPriority_Pre_SchedulerId_Invalid,
+ RtemsTaskReqGetPriority_Pre_SchedulerId_Scheduler,
+ RtemsTaskReqGetPriority_Pre_SchedulerId_NA
+} RtemsTaskReqGetPriority_Pre_SchedulerId;
+
+typedef enum {
+ RtemsTaskReqGetPriority_Pre_Scheduler_Eligible,
+ RtemsTaskReqGetPriority_Pre_Scheduler_Ineligible,
+ RtemsTaskReqGetPriority_Pre_Scheduler_NA
+} RtemsTaskReqGetPriority_Pre_Scheduler;
+
+typedef enum {
+ RtemsTaskReqGetPriority_Pre_Priority_Valid,
+ RtemsTaskReqGetPriority_Pre_Priority_Null,
+ RtemsTaskReqGetPriority_Pre_Priority_NA
+} RtemsTaskReqGetPriority_Pre_Priority;
+
+typedef enum {
+ RtemsTaskReqGetPriority_Post_Status_Ok,
+ RtemsTaskReqGetPriority_Post_Status_InvAddr,
+ RtemsTaskReqGetPriority_Post_Status_InvId,
+ RtemsTaskReqGetPriority_Post_Status_NotDef,
+ RtemsTaskReqGetPriority_Post_Status_NA
+} RtemsTaskReqGetPriority_Post_Status;
+
+typedef enum {
+ RtemsTaskReqGetPriority_Post_PriorityObj_Set,
+ RtemsTaskReqGetPriority_Post_PriorityObj_Nop,
+ RtemsTaskReqGetPriority_Post_PriorityObj_NA
+} RtemsTaskReqGetPriority_Post_PriorityObj;
+
+typedef struct {
+ uint16_t Skip : 1;
+ uint16_t Pre_TaskId_NA : 1;
+ uint16_t Pre_SchedulerId_NA : 1;
+ uint16_t Pre_Scheduler_NA : 1;
+ uint16_t Pre_Priority_NA : 1;
+ uint16_t Post_Status : 3;
+ uint16_t Post_PriorityObj : 2;
+} RtemsTaskReqGetPriority_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/get-priority test case.
+ */
+typedef struct {
+ /**
+ * @brief This member contains the scheduler A identifier.
+ */
+ rtems_id scheduler_a_id;
+
+ /**
+ * @brief This member contains the scheduler B identifier.
+ */
+ rtems_id scheduler_b_id;
+
+ /**
+ * @brief This member provides the object referenced by the ``priority``
+ * parameter.
+ */
+ rtems_task_priority priority_obj;
+
+ /**
+ * @brief This member contains the return value of the
+ * rtems_task_get_priority() call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``task_id`` parameter value.
+ */
+ rtems_id task_id;
+
+ /**
+ * @brief This member specifies if the ``scheduler_id`` parameter value.
+ */
+ rtems_id scheduler_id;
+
+ /**
+ * @brief This member specifies if the ``priority`` parameter value.
+ */
+ rtems_id *priority;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 4 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 4 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqGetPriority_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqGetPriority_Context;
+
+static RtemsTaskReqGetPriority_Context
+ RtemsTaskReqGetPriority_Instance;
+
+static const char * const RtemsTaskReqGetPriority_PreDesc_TaskId[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqGetPriority_PreDesc_SchedulerId[] = {
+ "Invalid",
+ "Scheduler",
+ "NA"
+};
+
+static const char * const RtemsTaskReqGetPriority_PreDesc_Scheduler[] = {
+ "Eligible",
+ "Ineligible",
+ "NA"
+};
+
+static const char * const RtemsTaskReqGetPriority_PreDesc_Priority[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqGetPriority_PreDesc[] = {
+ RtemsTaskReqGetPriority_PreDesc_TaskId,
+ RtemsTaskReqGetPriority_PreDesc_SchedulerId,
+ RtemsTaskReqGetPriority_PreDesc_Scheduler,
+ RtemsTaskReqGetPriority_PreDesc_Priority,
+ NULL
+};
+
+static void RtemsTaskReqGetPriority_Pre_TaskId_Prepare(
+ RtemsTaskReqGetPriority_Context *ctx,
+ RtemsTaskReqGetPriority_Pre_TaskId state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetPriority_Pre_TaskId_Invalid: {
+ /*
+ * While the ``task_id`` parameter is not associated with a task.
+ */
+ ctx->task_id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Pre_TaskId_Task: {
+ /*
+ * While the ``task_id`` parameter is associated with a task.
+ */
+ ctx->task_id = RTEMS_SELF;
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Pre_TaskId_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetPriority_Pre_SchedulerId_Prepare(
+ RtemsTaskReqGetPriority_Context *ctx,
+ RtemsTaskReqGetPriority_Pre_SchedulerId state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetPriority_Pre_SchedulerId_Invalid: {
+ /*
+ * While the ``scheduler_id`` parameter is not associated with a
+ * scheduler.
+ */
+ ctx->scheduler_id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Pre_SchedulerId_Scheduler: {
+ /*
+ * While the ``scheduler_id`` parameter is associated with a scheduler.
+ */
+ ctx->scheduler_id = ctx->scheduler_a_id;
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Pre_SchedulerId_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetPriority_Pre_Scheduler_Prepare(
+ RtemsTaskReqGetPriority_Context *ctx,
+ RtemsTaskReqGetPriority_Pre_Scheduler state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetPriority_Pre_Scheduler_Eligible: {
+ /*
+ * While the ``scheduler_id`` parameter is associated with an eligible
+ * scheduler of the task specified by ``task_id``.
+ */
+ ctx->scheduler_id = ctx->scheduler_a_id;
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Pre_Scheduler_Ineligible: {
+ /*
+ * While the ``scheduler_id`` parameter is associated with an ineligible
+ * scheduler of the task specified by ``task_id``.
+ */
+ ctx->scheduler_id = ctx->scheduler_b_id;
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Pre_Scheduler_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetPriority_Pre_Priority_Prepare(
+ RtemsTaskReqGetPriority_Context *ctx,
+ RtemsTaskReqGetPriority_Pre_Priority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetPriority_Pre_Priority_Valid: {
+ /*
+ * While the ``priority`` parameter references an object of type
+ * rtems_task_priority.
+ */
+ ctx->priority = &ctx->priority_obj;
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Pre_Priority_Null: {
+ /*
+ * While the ``priority`` parameter is equal to NULL.
+ */
+ ctx->priority = NULL;
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Pre_Priority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetPriority_Post_Status_Check(
+ RtemsTaskReqGetPriority_Context *ctx,
+ RtemsTaskReqGetPriority_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetPriority_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_get_priority() shall be
+ * RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_get_priority() shall be
+ * RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_get_priority() shall be
+ * RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Post_Status_NotDef: {
+ /*
+ * The return status of rtems_task_get_priority() shall be
+ * RTEMS_NOT_DEFINED.
+ */
+ T_rsc( ctx->status, RTEMS_NOT_DEFINED );
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetPriority_Post_PriorityObj_Check(
+ RtemsTaskReqGetPriority_Context *ctx,
+ RtemsTaskReqGetPriority_Post_PriorityObj state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetPriority_Post_PriorityObj_Set: {
+ /*
+ * The value of the object referenced by the ``scheduler_id`` parameter
+ * shall be set to the object identifier of the home scheduler of the
+ * task specified by the ``task_id`` parameter at some point during the
+ * call after the return of the rtems_task_get_priority() call.
+ */
+ T_eq_u32( ctx->priority_obj, PRIO_DEFAULT );
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Post_PriorityObj_Nop: {
+ /*
+ * Objects referenced by the ``scheduler_id`` parameter in past calls to
+ * rtems_task_get_priority() shall not be accessed by the
+ * rtems_task_get_priority() call.
+ */
+ T_eq_u32( ctx->priority_obj, PRIO_INVALID );
+ break;
+ }
+
+ case RtemsTaskReqGetPriority_Post_PriorityObj_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetPriority_Setup(
+ RtemsTaskReqGetPriority_Context *ctx
+)
+{
+ rtems_status_code sc;
+
+ sc = rtems_scheduler_ident(
+ TEST_SCHEDULER_A_NAME,
+ &ctx->scheduler_a_id
+ );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident(
+ TEST_SCHEDULER_B_NAME,
+ &ctx->scheduler_b_id
+ );
+ T_rsc_success( sc );
+ #endif
+}
+
+static void RtemsTaskReqGetPriority_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqGetPriority_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqGetPriority_Setup( ctx );
+}
+
+static void RtemsTaskReqGetPriority_Prepare(
+ RtemsTaskReqGetPriority_Context *ctx
+)
+{
+ ctx->priority_obj = PRIO_INVALID;
+}
+
+static void RtemsTaskReqGetPriority_Action(
+ RtemsTaskReqGetPriority_Context *ctx
+)
+{
+ ctx->status = rtems_task_get_priority(
+ ctx->task_id,
+ ctx->scheduler_id,
+ ctx->priority
+ );
+}
+
+static const RtemsTaskReqGetPriority_Entry
+RtemsTaskReqGetPriority_Entries[] = {
+ { 0, 0, 0, 1, 0, RtemsTaskReqGetPriority_Post_Status_InvId,
+ RtemsTaskReqGetPriority_Post_PriorityObj_Nop },
+ { 0, 0, 0, 1, 0, RtemsTaskReqGetPriority_Post_Status_InvAddr,
+ RtemsTaskReqGetPriority_Post_PriorityObj_Nop },
+ { 0, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_Ok,
+ RtemsTaskReqGetPriority_Post_PriorityObj_Set },
+ { 0, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_InvAddr,
+ RtemsTaskReqGetPriority_Post_PriorityObj_Nop },
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_NotDef,
+ RtemsTaskReqGetPriority_Post_PriorityObj_Nop },
+#else
+ { 1, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_NA,
+ RtemsTaskReqGetPriority_Post_PriorityObj_NA },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_InvAddr,
+ RtemsTaskReqGetPriority_Post_PriorityObj_Nop }
+#else
+ { 1, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_NA,
+ RtemsTaskReqGetPriority_Post_PriorityObj_NA }
+#endif
+};
+
+static const uint8_t
+RtemsTaskReqGetPriority_Map[] = {
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 4, 5
+};
+
+static size_t RtemsTaskReqGetPriority_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqGetPriority_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope(
+ RtemsTaskReqGetPriority_PreDesc,
+ buf,
+ n,
+ ctx->Map.pcs
+ );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqGetPriority_Fixture = {
+ .setup = RtemsTaskReqGetPriority_Setup_Wrap,
+ .stop = NULL,
+ .teardown = NULL,
+ .scope = RtemsTaskReqGetPriority_Scope,
+ .initial_context = &RtemsTaskReqGetPriority_Instance
+};
+
+static inline RtemsTaskReqGetPriority_Entry RtemsTaskReqGetPriority_PopEntry(
+ RtemsTaskReqGetPriority_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqGetPriority_Entries[
+ RtemsTaskReqGetPriority_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqGetPriority_SetPreConditionStates(
+ RtemsTaskReqGetPriority_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+
+ if ( ctx->Map.entry.Pre_Scheduler_NA ) {
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqGetPriority_Pre_Scheduler_NA;
+ } else {
+ ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
+ }
+
+ ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ];
+}
+
+static void RtemsTaskReqGetPriority_TestVariant(
+ RtemsTaskReqGetPriority_Context *ctx
+)
+{
+ RtemsTaskReqGetPriority_Pre_TaskId_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqGetPriority_Pre_SchedulerId_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqGetPriority_Pre_Scheduler_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqGetPriority_Pre_Priority_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqGetPriority_Action( ctx );
+ RtemsTaskReqGetPriority_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqGetPriority_Post_PriorityObj_Check(
+ ctx,
+ ctx->Map.entry.Post_PriorityObj
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqGetPriority( void )
+ */
+T_TEST_CASE_FIXTURE(
+ RtemsTaskReqGetPriority,
+ &RtemsTaskReqGetPriority_Fixture
+)
+{
+ RtemsTaskReqGetPriority_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqGetPriority_Pre_TaskId_Invalid;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqGetPriority_Pre_TaskId_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqGetPriority_Pre_SchedulerId_Invalid;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqGetPriority_Pre_SchedulerId_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ for (
+ ctx->Map.pci[ 2 ] = RtemsTaskReqGetPriority_Pre_Scheduler_Eligible;
+ ctx->Map.pci[ 2 ] < RtemsTaskReqGetPriority_Pre_Scheduler_NA;
+ ++ctx->Map.pci[ 2 ]
+ ) {
+ for (
+ ctx->Map.pci[ 3 ] = RtemsTaskReqGetPriority_Pre_Priority_Valid;
+ ctx->Map.pci[ 3 ] < RtemsTaskReqGetPriority_Pre_Priority_NA;
+ ++ctx->Map.pci[ 3 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqGetPriority_PopEntry( ctx );
+
+ if ( ctx->Map.entry.Skip ) {
+ continue;
+ }
+
+ RtemsTaskReqGetPriority_SetPreConditionStates( ctx );
+ RtemsTaskReqGetPriority_Prepare( ctx );
+ RtemsTaskReqGetPriority_TestVariant( ctx );
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-get-scheduler.c b/testsuites/validation/tc-task-get-scheduler.c
new file mode 100644
index 0000000000..1cd907cd09
--- /dev/null
+++ b/testsuites/validation/tc-task-get-scheduler.c
@@ -0,0 +1,420 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqGetScheduler
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqGetScheduler \
+ * spec:/rtems/task/req/get-scheduler
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqGetScheduler_Pre_Id_Invalid,
+ RtemsTaskReqGetScheduler_Pre_Id_Task,
+ RtemsTaskReqGetScheduler_Pre_Id_NA
+} RtemsTaskReqGetScheduler_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqGetScheduler_Pre_SchedulerID_Valid,
+ RtemsTaskReqGetScheduler_Pre_SchedulerID_Null,
+ RtemsTaskReqGetScheduler_Pre_SchedulerID_NA
+} RtemsTaskReqGetScheduler_Pre_SchedulerID;
+
+typedef enum {
+ RtemsTaskReqGetScheduler_Post_Status_Ok,
+ RtemsTaskReqGetScheduler_Post_Status_InvAddr,
+ RtemsTaskReqGetScheduler_Post_Status_InvId,
+ RtemsTaskReqGetScheduler_Post_Status_NA
+} RtemsTaskReqGetScheduler_Post_Status;
+
+typedef enum {
+ RtemsTaskReqGetScheduler_Post_SchedulerIDObj_Set,
+ RtemsTaskReqGetScheduler_Post_SchedulerIDObj_Nop,
+ RtemsTaskReqGetScheduler_Post_SchedulerIDObj_NA
+} RtemsTaskReqGetScheduler_Post_SchedulerIDObj;
+
+typedef struct {
+ uint8_t Skip : 1;
+ uint8_t Pre_Id_NA : 1;
+ uint8_t Pre_SchedulerID_NA : 1;
+ uint8_t Post_Status : 2;
+ uint8_t Post_SchedulerIDObj : 2;
+} RtemsTaskReqGetScheduler_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/get-scheduler test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides the object referenced by the ``scheduler_id``
+ * parameter.
+ */
+ rtems_id scheduler_id_obj;
+
+ /**
+ * @brief This member contains the return value of the
+ * rtems_task_get_scheduler() call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``task_id`` parameter value.
+ */
+ rtems_id id;
+
+ /**
+ * @brief This member specifies if the ``scheduler_id`` parameter value.
+ */
+ rtems_id *scheduler_id;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 2 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqGetScheduler_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqGetScheduler_Context;
+
+static RtemsTaskReqGetScheduler_Context
+ RtemsTaskReqGetScheduler_Instance;
+
+static const char * const RtemsTaskReqGetScheduler_PreDesc_Id[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqGetScheduler_PreDesc_SchedulerID[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqGetScheduler_PreDesc[] = {
+ RtemsTaskReqGetScheduler_PreDesc_Id,
+ RtemsTaskReqGetScheduler_PreDesc_SchedulerID,
+ NULL
+};
+
+static void RtemsTaskReqGetScheduler_Pre_Id_Prepare(
+ RtemsTaskReqGetScheduler_Context *ctx,
+ RtemsTaskReqGetScheduler_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetScheduler_Pre_Id_Invalid: {
+ /*
+ * While the ``task_id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqGetScheduler_Pre_Id_Task: {
+ /*
+ * While the ``task_id`` parameter is associated with a task.
+ */
+ ctx->id = RTEMS_SELF;
+ break;
+ }
+
+ case RtemsTaskReqGetScheduler_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetScheduler_Pre_SchedulerID_Prepare(
+ RtemsTaskReqGetScheduler_Context *ctx,
+ RtemsTaskReqGetScheduler_Pre_SchedulerID state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetScheduler_Pre_SchedulerID_Valid: {
+ /*
+ * While the ``scheduler_id`` parameter references an object of type
+ * rtems_id.
+ */
+ ctx->scheduler_id = &ctx->scheduler_id_obj;
+ break;
+ }
+
+ case RtemsTaskReqGetScheduler_Pre_SchedulerID_Null: {
+ /*
+ * While the ``scheduler_id`` parameter is equal to NULL.
+ */
+ ctx->scheduler_id = NULL;
+ break;
+ }
+
+ case RtemsTaskReqGetScheduler_Pre_SchedulerID_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetScheduler_Post_Status_Check(
+ RtemsTaskReqGetScheduler_Context *ctx,
+ RtemsTaskReqGetScheduler_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetScheduler_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_get_scheduler() shall be
+ * RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqGetScheduler_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_get_scheduler() shall be
+ * RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqGetScheduler_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_get_scheduler() shall be
+ * RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqGetScheduler_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetScheduler_Post_SchedulerIDObj_Check(
+ RtemsTaskReqGetScheduler_Context *ctx,
+ RtemsTaskReqGetScheduler_Post_SchedulerIDObj state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqGetScheduler_Post_SchedulerIDObj_Set: {
+ /*
+ * The value of the object referenced by the ``scheduler_id`` parameter
+ * shall be set to the object identifier of the home scheduler of the
+ * task specified by the ``task_id`` parameter at some point during the
+ * call after the return of the rtems_task_get_scheduler() call.
+ */
+ T_eq_u32( ctx->scheduler_id_obj, 0x0f010001 );
+ break;
+ }
+
+ case RtemsTaskReqGetScheduler_Post_SchedulerIDObj_Nop: {
+ /*
+ * Objects referenced by the ``scheduler_id`` parameter in past calls to
+ * rtems_task_get_scheduler() shall not be accessed by the
+ * rtems_task_get_scheduler() call.
+ */
+ T_eq_u32( ctx->scheduler_id_obj, INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqGetScheduler_Post_SchedulerIDObj_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqGetScheduler_Prepare(
+ RtemsTaskReqGetScheduler_Context *ctx
+)
+{
+ ctx->scheduler_id_obj = INVALID_ID;
+}
+
+static void RtemsTaskReqGetScheduler_Action(
+ RtemsTaskReqGetScheduler_Context *ctx
+)
+{
+ ctx->status = rtems_task_get_scheduler( ctx->id, ctx->scheduler_id );
+}
+
+static const RtemsTaskReqGetScheduler_Entry
+RtemsTaskReqGetScheduler_Entries[] = {
+ { 0, 0, 0, RtemsTaskReqGetScheduler_Post_Status_InvAddr,
+ RtemsTaskReqGetScheduler_Post_SchedulerIDObj_Nop },
+ { 0, 0, 0, RtemsTaskReqGetScheduler_Post_Status_InvId,
+ RtemsTaskReqGetScheduler_Post_SchedulerIDObj_Nop },
+ { 0, 0, 0, RtemsTaskReqGetScheduler_Post_Status_Ok,
+ RtemsTaskReqGetScheduler_Post_SchedulerIDObj_Set }
+};
+
+static const uint8_t
+RtemsTaskReqGetScheduler_Map[] = {
+ 1, 0, 2, 0
+};
+
+static size_t RtemsTaskReqGetScheduler_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqGetScheduler_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope(
+ RtemsTaskReqGetScheduler_PreDesc,
+ buf,
+ n,
+ ctx->Map.pcs
+ );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqGetScheduler_Fixture = {
+ .setup = NULL,
+ .stop = NULL,
+ .teardown = NULL,
+ .scope = RtemsTaskReqGetScheduler_Scope,
+ .initial_context = &RtemsTaskReqGetScheduler_Instance
+};
+
+static inline RtemsTaskReqGetScheduler_Entry RtemsTaskReqGetScheduler_PopEntry(
+ RtemsTaskReqGetScheduler_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqGetScheduler_Entries[
+ RtemsTaskReqGetScheduler_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqGetScheduler_TestVariant(
+ RtemsTaskReqGetScheduler_Context *ctx
+)
+{
+ RtemsTaskReqGetScheduler_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqGetScheduler_Pre_SchedulerID_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqGetScheduler_Action( ctx );
+ RtemsTaskReqGetScheduler_Post_Status_Check(
+ ctx,
+ ctx->Map.entry.Post_Status
+ );
+ RtemsTaskReqGetScheduler_Post_SchedulerIDObj_Check(
+ ctx,
+ ctx->Map.entry.Post_SchedulerIDObj
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqGetScheduler( void )
+ */
+T_TEST_CASE_FIXTURE(
+ RtemsTaskReqGetScheduler,
+ &RtemsTaskReqGetScheduler_Fixture
+)
+{
+ RtemsTaskReqGetScheduler_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pcs[ 0 ] = RtemsTaskReqGetScheduler_Pre_Id_Invalid;
+ ctx->Map.pcs[ 0 ] < RtemsTaskReqGetScheduler_Pre_Id_NA;
+ ++ctx->Map.pcs[ 0 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqGetScheduler_Pre_SchedulerID_Valid;
+ ctx->Map.pcs[ 1 ] < RtemsTaskReqGetScheduler_Pre_SchedulerID_NA;
+ ++ctx->Map.pcs[ 1 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqGetScheduler_PopEntry( ctx );
+ RtemsTaskReqGetScheduler_Prepare( ctx );
+ RtemsTaskReqGetScheduler_TestVariant( ctx );
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-ident.c b/testsuites/validation/tc-task-ident.c
new file mode 100644
index 0000000000..a61b90330a
--- /dev/null
+++ b/testsuites/validation/tc-task-ident.c
@@ -0,0 +1,359 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqIdent
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "tr-object-ident.h"
+#include "ts-config.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqIdent spec:/rtems/task/req/ident
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqIdent_Pre_Name_WhoAmI,
+ RtemsTaskReqIdent_Pre_Name_NotWhoAmI,
+ RtemsTaskReqIdent_Pre_Name_NA
+} RtemsTaskReqIdent_Pre_Name;
+
+typedef enum {
+ RtemsTaskReqIdent_Post_Status_OkAndWhoAmI,
+ RtemsTaskReqIdent_Post_Status_Skip,
+ RtemsTaskReqIdent_Post_Status_NA
+} RtemsTaskReqIdent_Post_Status;
+
+typedef struct {
+ uint8_t Skip : 1;
+ uint8_t Pre_Name_NA : 1;
+ uint8_t Post_Status : 2;
+} RtemsTaskReqIdent_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/ident test case.
+ */
+typedef struct {
+ rtems_status_code status;
+
+ rtems_id *id;
+
+ rtems_id id_value;
+
+ rtems_id id_local_object;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 1 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqIdent_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqIdent_Context;
+
+static RtemsTaskReqIdent_Context
+ RtemsTaskReqIdent_Instance;
+
+static const char * const RtemsTaskReqIdent_PreDesc_Name[] = {
+ "WhoAmI",
+ "NotWhoAmI",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqIdent_PreDesc[] = {
+ RtemsTaskReqIdent_PreDesc_Name,
+ NULL
+};
+
+static rtems_status_code ClassicTaskIdentAction(
+ rtems_name name,
+ uint32_t node,
+ rtems_id *id
+)
+{
+ return rtems_task_ident( name, node, id );
+}
+
+#define TASK_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
+
+#define MAX_TLS_SIZE RTEMS_ALIGN_UP( 64, RTEMS_TASK_STORAGE_ALIGNMENT )
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT )
+static char ClassicTaskIdentStorage[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ TASK_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config ClassicTaskIdentConfig = {
+ .name = ClassicObjectIdentName,
+ .initial_priority = 1,
+ .storage_area = ClassicTaskIdentStorage,
+ .storage_size = sizeof( ClassicTaskIdentStorage ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = TASK_ATTRIBUTES
+};
+
+static void RtemsTaskReqIdent_Pre_Name_Prepare(
+ RtemsTaskReqIdent_Context *ctx,
+ RtemsTaskReqIdent_Pre_Name state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqIdent_Pre_Name_WhoAmI: {
+ /*
+ * While the ``name`` parameter is equal to RTEMS_WHO_AM_I, while ``id``
+ * parameter is not equal to NULL.
+ */
+ ctx->id_value = 0xffffffff;
+ ctx->id = &ctx->id_value;
+ break;
+ }
+
+ case RtemsTaskReqIdent_Pre_Name_NotWhoAmI: {
+ /*
+ * While the ``name`` is not equal to RTEMS_WHO_AM_I or ``id`` parameter
+ * is equal to NULL, the behaviour of rtems_task_ident() shall be
+ * specified by /rtems/req/ident.
+ */
+ ctx->id = NULL;
+ /* Preparation performed by RtemsReqIdent_Run() */
+ break;
+ }
+
+ case RtemsTaskReqIdent_Pre_Name_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqIdent_Post_Status_Check(
+ RtemsTaskReqIdent_Context *ctx,
+ RtemsTaskReqIdent_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqIdent_Post_Status_OkAndWhoAmI: {
+ /*
+ * The return status of rtems_task_ident() shall be RTEMS_SUCCESSFUL.
+ * The value of the object identifier referenced by the ``name``
+ * parameter shall be the identifier of the executing thread.
+ */
+ T_rsc( ctx->status, RTEMS_SUCCESSFUL );
+ T_eq_ptr( ctx->id, &ctx->id_value );
+ T_eq_u32( ctx->id_value, rtems_task_self() );
+ break;
+ }
+
+ case RtemsTaskReqIdent_Post_Status_Skip: {
+ /*
+ * There is no status to validate.
+ */
+ /* Checks performed by RtemsReqIdent_Run() */
+ break;
+ }
+
+ case RtemsTaskReqIdent_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqIdent_Setup( RtemsTaskReqIdent_Context *ctx )
+{
+ rtems_status_code sc;
+
+ sc = rtems_task_construct(
+ &ClassicTaskIdentConfig,
+ &ctx->id_local_object
+ );
+ T_assert_rsc_success( sc );
+}
+
+static void RtemsTaskReqIdent_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqIdent_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqIdent_Setup( ctx );
+}
+
+static void RtemsTaskReqIdent_Teardown( RtemsTaskReqIdent_Context *ctx )
+{
+ if ( ctx->id_local_object != 0 ) {
+ rtems_status_code sc;
+
+ sc = rtems_task_delete( ctx->id_local_object );
+ T_rsc_success( sc );
+ }
+}
+
+static void RtemsTaskReqIdent_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqIdent_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqIdent_Teardown( ctx );
+}
+
+static void RtemsTaskReqIdent_Action( RtemsTaskReqIdent_Context *ctx )
+{
+ if ( ctx->id != NULL ) {
+ ctx->status = rtems_task_ident( RTEMS_SELF, 0xdeadbeef, ctx->id );
+ } else {
+ RtemsReqIdent_Run(
+ ctx->id_local_object,
+ ClassicTaskIdentAction
+ );
+ }
+}
+
+static const RtemsTaskReqIdent_Entry
+RtemsTaskReqIdent_Entries[] = {
+ { 0, 0, RtemsTaskReqIdent_Post_Status_OkAndWhoAmI },
+ { 0, 0, RtemsTaskReqIdent_Post_Status_Skip }
+};
+
+static const uint8_t
+RtemsTaskReqIdent_Map[] = {
+ 0, 1
+};
+
+static size_t RtemsTaskReqIdent_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqIdent_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqIdent_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqIdent_Fixture = {
+ .setup = RtemsTaskReqIdent_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqIdent_Teardown_Wrap,
+ .scope = RtemsTaskReqIdent_Scope,
+ .initial_context = &RtemsTaskReqIdent_Instance
+};
+
+static inline RtemsTaskReqIdent_Entry RtemsTaskReqIdent_PopEntry(
+ RtemsTaskReqIdent_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqIdent_Entries[
+ RtemsTaskReqIdent_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqIdent_TestVariant( RtemsTaskReqIdent_Context *ctx )
+{
+ RtemsTaskReqIdent_Pre_Name_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqIdent_Action( ctx );
+ RtemsTaskReqIdent_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqIdent( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqIdent, &RtemsTaskReqIdent_Fixture )
+{
+ RtemsTaskReqIdent_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pcs[ 0 ] = RtemsTaskReqIdent_Pre_Name_WhoAmI;
+ ctx->Map.pcs[ 0 ] < RtemsTaskReqIdent_Pre_Name_NA;
+ ++ctx->Map.pcs[ 0 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqIdent_PopEntry( ctx );
+ RtemsTaskReqIdent_TestVariant( ctx );
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-is-suspended.c b/testsuites/validation/tc-task-is-suspended.c
new file mode 100644
index 0000000000..0897d28f56
--- /dev/null
+++ b/testsuites/validation/tc-task-is-suspended.c
@@ -0,0 +1,430 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqIsSuspended
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqIsSuspended \
+ * spec:/rtems/task/req/is-suspended
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqIsSuspended_Pre_Id_Invalid,
+ RtemsTaskReqIsSuspended_Pre_Id_Task,
+ RtemsTaskReqIsSuspended_Pre_Id_NA
+} RtemsTaskReqIsSuspended_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqIsSuspended_Pre_Suspended_Yes,
+ RtemsTaskReqIsSuspended_Pre_Suspended_No,
+ RtemsTaskReqIsSuspended_Pre_Suspended_NA
+} RtemsTaskReqIsSuspended_Pre_Suspended;
+
+typedef enum {
+ RtemsTaskReqIsSuspended_Post_Status_Ok,
+ RtemsTaskReqIsSuspended_Post_Status_InvId,
+ RtemsTaskReqIsSuspended_Post_Status_AlrdySus,
+ RtemsTaskReqIsSuspended_Post_Status_NA
+} RtemsTaskReqIsSuspended_Post_Status;
+
+typedef struct {
+ uint8_t Skip : 1;
+ uint8_t Pre_Id_NA : 1;
+ uint8_t Pre_Suspended_NA : 1;
+ uint8_t Post_Status : 2;
+} RtemsTaskReqIsSuspended_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/is-suspended test case.
+ */
+typedef struct {
+ /**
+ * @brief This member contains the identifier of a task.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief If this member is true, then the worker is suspended before the
+ * rtems_task_is_suspended() call.
+ */
+ bool suspend;
+
+ /**
+ * @brief This member contains the return value of the
+ * rtems_task_is_suspended() call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 2 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 2 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqIsSuspended_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqIsSuspended_Context;
+
+static RtemsTaskReqIsSuspended_Context
+ RtemsTaskReqIsSuspended_Instance;
+
+static const char * const RtemsTaskReqIsSuspended_PreDesc_Id[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqIsSuspended_PreDesc_Suspended[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqIsSuspended_PreDesc[] = {
+ RtemsTaskReqIsSuspended_PreDesc_Id,
+ RtemsTaskReqIsSuspended_PreDesc_Suspended,
+ NULL
+};
+
+static void Worker( rtems_task_argument arg )
+{
+ while ( true ) {
+ /* Do nothing */
+ }
+}
+
+static void RtemsTaskReqIsSuspended_Pre_Id_Prepare(
+ RtemsTaskReqIsSuspended_Context *ctx,
+ RtemsTaskReqIsSuspended_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqIsSuspended_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqIsSuspended_Pre_Id_Task: {
+ /*
+ * While the ``id`` parameter is associated with a task.
+ */
+ ctx->id = ctx->worker_id;
+ break;
+ }
+
+ case RtemsTaskReqIsSuspended_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqIsSuspended_Pre_Suspended_Prepare(
+ RtemsTaskReqIsSuspended_Context *ctx,
+ RtemsTaskReqIsSuspended_Pre_Suspended state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqIsSuspended_Pre_Suspended_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is suspended.
+ */
+ ctx->suspend = true;
+ break;
+ }
+
+ case RtemsTaskReqIsSuspended_Pre_Suspended_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not suspended.
+ */
+ ctx->suspend = false;
+ break;
+ }
+
+ case RtemsTaskReqIsSuspended_Pre_Suspended_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqIsSuspended_Post_Status_Check(
+ RtemsTaskReqIsSuspended_Context *ctx,
+ RtemsTaskReqIsSuspended_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqIsSuspended_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_is_suspended() shall be
+ * RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqIsSuspended_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_is_suspended() shall be
+ * RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqIsSuspended_Post_Status_AlrdySus: {
+ /*
+ * The return status of rtems_task_is_suspended() shall be
+ * RTEMS_ALREADY_SUSPENDED.
+ */
+ T_rsc( ctx->status, RTEMS_ALREADY_SUSPENDED );
+ break;
+ }
+
+ case RtemsTaskReqIsSuspended_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqIsSuspended_Setup(
+ RtemsTaskReqIsSuspended_Context *ctx
+)
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_LOW );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+static void RtemsTaskReqIsSuspended_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqIsSuspended_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqIsSuspended_Setup( ctx );
+}
+
+static void RtemsTaskReqIsSuspended_Teardown(
+ RtemsTaskReqIsSuspended_Context *ctx
+)
+{
+ DeleteTask( ctx->worker_id );
+}
+
+static void RtemsTaskReqIsSuspended_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqIsSuspended_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqIsSuspended_Teardown( ctx );
+}
+
+static void RtemsTaskReqIsSuspended_Action(
+ RtemsTaskReqIsSuspended_Context *ctx
+)
+{
+ if ( ctx->suspend ) {
+ SuspendTask( ctx->worker_id );
+ }
+
+ ctx->status = rtems_task_is_suspended( ctx->id );
+
+ if ( ctx->suspend ) {
+ ResumeTask( ctx->worker_id );
+ }
+}
+
+static const RtemsTaskReqIsSuspended_Entry
+RtemsTaskReqIsSuspended_Entries[] = {
+ { 0, 0, 1, RtemsTaskReqIsSuspended_Post_Status_InvId },
+ { 0, 0, 0, RtemsTaskReqIsSuspended_Post_Status_AlrdySus },
+ { 0, 0, 0, RtemsTaskReqIsSuspended_Post_Status_Ok }
+};
+
+static const uint8_t
+RtemsTaskReqIsSuspended_Map[] = {
+ 0, 0, 1, 2
+};
+
+static size_t RtemsTaskReqIsSuspended_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqIsSuspended_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope(
+ RtemsTaskReqIsSuspended_PreDesc,
+ buf,
+ n,
+ ctx->Map.pcs
+ );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqIsSuspended_Fixture = {
+ .setup = RtemsTaskReqIsSuspended_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqIsSuspended_Teardown_Wrap,
+ .scope = RtemsTaskReqIsSuspended_Scope,
+ .initial_context = &RtemsTaskReqIsSuspended_Instance
+};
+
+static inline RtemsTaskReqIsSuspended_Entry RtemsTaskReqIsSuspended_PopEntry(
+ RtemsTaskReqIsSuspended_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqIsSuspended_Entries[
+ RtemsTaskReqIsSuspended_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqIsSuspended_SetPreConditionStates(
+ RtemsTaskReqIsSuspended_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+
+ if ( ctx->Map.entry.Pre_Suspended_NA ) {
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqIsSuspended_Pre_Suspended_NA;
+ } else {
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+ }
+}
+
+static void RtemsTaskReqIsSuspended_TestVariant(
+ RtemsTaskReqIsSuspended_Context *ctx
+)
+{
+ RtemsTaskReqIsSuspended_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqIsSuspended_Pre_Suspended_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqIsSuspended_Action( ctx );
+ RtemsTaskReqIsSuspended_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqIsSuspended( void )
+ */
+T_TEST_CASE_FIXTURE(
+ RtemsTaskReqIsSuspended,
+ &RtemsTaskReqIsSuspended_Fixture
+)
+{
+ RtemsTaskReqIsSuspended_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqIsSuspended_Pre_Id_Invalid;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqIsSuspended_Pre_Id_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqIsSuspended_Pre_Suspended_Yes;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqIsSuspended_Pre_Suspended_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqIsSuspended_PopEntry( ctx );
+ RtemsTaskReqIsSuspended_SetPreConditionStates( ctx );
+ RtemsTaskReqIsSuspended_TestVariant( ctx );
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-mode.c b/testsuites/validation/tc-task-mode.c
new file mode 100644
index 0000000000..f5e225a206
--- /dev/null
+++ b/testsuites/validation/tc-task-mode.c
@@ -0,0 +1,2019 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqMode
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <string.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqMode spec:/rtems/task/req/mode
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ * @ingroup RTEMSTestSuiteTestsuitesValidationOneCpu0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqMode_Pre_PrevMode_Valid,
+ RtemsTaskReqMode_Pre_PrevMode_Null,
+ RtemsTaskReqMode_Pre_PrevMode_NA
+} RtemsTaskReqMode_Pre_PrevMode;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_PreemptCur_Yes,
+ RtemsTaskReqMode_Pre_PreemptCur_No,
+ RtemsTaskReqMode_Pre_PreemptCur_NA
+} RtemsTaskReqMode_Pre_PreemptCur;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_TimesliceCur_Yes,
+ RtemsTaskReqMode_Pre_TimesliceCur_No,
+ RtemsTaskReqMode_Pre_TimesliceCur_NA
+} RtemsTaskReqMode_Pre_TimesliceCur;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_ASRCur_Yes,
+ RtemsTaskReqMode_Pre_ASRCur_No,
+ RtemsTaskReqMode_Pre_ASRCur_NA
+} RtemsTaskReqMode_Pre_ASRCur;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_IntLvlCur_Zero,
+ RtemsTaskReqMode_Pre_IntLvlCur_Positive,
+ RtemsTaskReqMode_Pre_IntLvlCur_NA
+} RtemsTaskReqMode_Pre_IntLvlCur;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_Preempt_Yes,
+ RtemsTaskReqMode_Pre_Preempt_No,
+ RtemsTaskReqMode_Pre_Preempt_NA
+} RtemsTaskReqMode_Pre_Preempt;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_Timeslice_Yes,
+ RtemsTaskReqMode_Pre_Timeslice_No,
+ RtemsTaskReqMode_Pre_Timeslice_NA
+} RtemsTaskReqMode_Pre_Timeslice;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_ASR_Yes,
+ RtemsTaskReqMode_Pre_ASR_No,
+ RtemsTaskReqMode_Pre_ASR_NA
+} RtemsTaskReqMode_Pre_ASR;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_IntLvl_Zero,
+ RtemsTaskReqMode_Pre_IntLvl_Positive,
+ RtemsTaskReqMode_Pre_IntLvl_NA
+} RtemsTaskReqMode_Pre_IntLvl;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_PreemptMsk_Yes,
+ RtemsTaskReqMode_Pre_PreemptMsk_No,
+ RtemsTaskReqMode_Pre_PreemptMsk_NA
+} RtemsTaskReqMode_Pre_PreemptMsk;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_TimesliceMsk_Yes,
+ RtemsTaskReqMode_Pre_TimesliceMsk_No,
+ RtemsTaskReqMode_Pre_TimesliceMsk_NA
+} RtemsTaskReqMode_Pre_TimesliceMsk;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_ASRMsk_Yes,
+ RtemsTaskReqMode_Pre_ASRMsk_No,
+ RtemsTaskReqMode_Pre_ASRMsk_NA
+} RtemsTaskReqMode_Pre_ASRMsk;
+
+typedef enum {
+ RtemsTaskReqMode_Pre_IntLvlMsk_Yes,
+ RtemsTaskReqMode_Pre_IntLvlMsk_No,
+ RtemsTaskReqMode_Pre_IntLvlMsk_NA
+} RtemsTaskReqMode_Pre_IntLvlMsk;
+
+typedef enum {
+ RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Status_InvAddr,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvl,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP,
+ RtemsTaskReqMode_Post_Status_NotImplNoPreempt,
+ RtemsTaskReqMode_Post_Status_NA
+} RtemsTaskReqMode_Post_Status;
+
+typedef enum {
+ RtemsTaskReqMode_Post_Preempt_Yes,
+ RtemsTaskReqMode_Post_Preempt_No,
+ RtemsTaskReqMode_Post_Preempt_Maybe,
+ RtemsTaskReqMode_Post_Preempt_NA
+} RtemsTaskReqMode_Post_Preempt;
+
+typedef enum {
+ RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_ASR_Maybe,
+ RtemsTaskReqMode_Post_ASR_NA
+} RtemsTaskReqMode_Post_ASR;
+
+typedef enum {
+ RtemsTaskReqMode_Post_PMVar_Set,
+ RtemsTaskReqMode_Post_PMVar_Nop,
+ RtemsTaskReqMode_Post_PMVar_Maybe,
+ RtemsTaskReqMode_Post_PMVar_NA
+} RtemsTaskReqMode_Post_PMVar;
+
+typedef enum {
+ RtemsTaskReqMode_Post_Mode_Set,
+ RtemsTaskReqMode_Post_Mode_Nop,
+ RtemsTaskReqMode_Post_Mode_Maybe,
+ RtemsTaskReqMode_Post_Mode_NA
+} RtemsTaskReqMode_Post_Mode;
+
+typedef struct {
+ uint32_t Skip : 1;
+ uint32_t Pre_PrevMode_NA : 1;
+ uint32_t Pre_PreemptCur_NA : 1;
+ uint32_t Pre_TimesliceCur_NA : 1;
+ uint32_t Pre_ASRCur_NA : 1;
+ uint32_t Pre_IntLvlCur_NA : 1;
+ uint32_t Pre_Preempt_NA : 1;
+ uint32_t Pre_Timeslice_NA : 1;
+ uint32_t Pre_ASR_NA : 1;
+ uint32_t Pre_IntLvl_NA : 1;
+ uint32_t Pre_PreemptMsk_NA : 1;
+ uint32_t Pre_TimesliceMsk_NA : 1;
+ uint32_t Pre_ASRMsk_NA : 1;
+ uint32_t Pre_IntLvlMsk_NA : 1;
+ uint32_t Post_Status : 3;
+ uint32_t Post_Preempt : 2;
+ uint32_t Post_ASR : 2;
+ uint32_t Post_PMVar : 2;
+ uint32_t Post_Mode : 2;
+} RtemsTaskReqMode_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/mode test case.
+ */
+typedef struct {
+ /**
+ * @brief This member contains the object identifier of the worker task.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief null If this member is contains the initial mode of the runner.
+ */
+ rtems_mode runner_mode;
+
+ /**
+ * @brief This member provides a value for the previous mode set.
+ */
+ rtems_mode previous_mode_set_value;
+
+ /**
+ * @brief This member specifies the task mode in which rtems_task_mode() is
+ * called.
+ */
+ rtems_mode current_mode;
+
+ /**
+ * @brief This member counts worker activity.
+ */
+ uint32_t worker_counter;
+
+ /**
+ * @brief This member contains worker counter before the rtems_task_mode()
+ * call.
+ */
+ uint32_t worker_counter_before;
+
+ /**
+ * @brief This member contains worker counter after the rtems_task_mode()
+ * call.
+ */
+ uint32_t worker_counter_after;
+
+ /**
+ * @brief This member counts signal handler activity.
+ */
+ uint32_t signal_counter;
+
+ /**
+ * @brief This member contains signal counter before the rtems_task_mode()
+ * call.
+ */
+ uint32_t signal_counter_before;
+
+ /**
+ * @brief This member contains signal counter after the rtems_task_mode()
+ * call.
+ */
+ uint32_t signal_counter_after;
+
+ /**
+ * @brief This member specifies the ``mode_set`` parameter for
+ * rtems_task_mode().
+ */
+ rtems_mode mode_set;
+
+ /**
+ * @brief This member specifies the mode mask ``mask`` parameter for
+ * rtems_task_mode() for the action.
+ */
+ rtems_mode mode_mask;
+
+ /**
+ * @brief This member specifies the previous mode set ``previous_mode_set``
+ * parameter for rtems_task_mode().
+ */
+ rtems_mode *previous_mode_set;
+
+ /**
+ * @brief This member contains the return status of the rtems_task_mode()
+ * call.
+ */
+ rtems_status_code status;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 13 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqMode_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqMode_Context;
+
+static RtemsTaskReqMode_Context
+ RtemsTaskReqMode_Instance;
+
+static const char * const RtemsTaskReqMode_PreDesc_PrevMode[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_PreemptCur[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_TimesliceCur[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_ASRCur[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_IntLvlCur[] = {
+ "Zero",
+ "Positive",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_Preempt[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_Timeslice[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_ASR[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_IntLvl[] = {
+ "Zero",
+ "Positive",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_PreemptMsk[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_TimesliceMsk[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_ASRMsk[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqMode_PreDesc_IntLvlMsk[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqMode_PreDesc[] = {
+ RtemsTaskReqMode_PreDesc_PrevMode,
+ RtemsTaskReqMode_PreDesc_PreemptCur,
+ RtemsTaskReqMode_PreDesc_TimesliceCur,
+ RtemsTaskReqMode_PreDesc_ASRCur,
+ RtemsTaskReqMode_PreDesc_IntLvlCur,
+ RtemsTaskReqMode_PreDesc_Preempt,
+ RtemsTaskReqMode_PreDesc_Timeslice,
+ RtemsTaskReqMode_PreDesc_ASR,
+ RtemsTaskReqMode_PreDesc_IntLvl,
+ RtemsTaskReqMode_PreDesc_PreemptMsk,
+ RtemsTaskReqMode_PreDesc_TimesliceMsk,
+ RtemsTaskReqMode_PreDesc_ASRMsk,
+ RtemsTaskReqMode_PreDesc_IntLvlMsk,
+ NULL
+};
+
+#define INVALID_MODE 0xffffffff
+
+#define EVENT_MAKE_READY RTEMS_EVENT_0
+
+#define EVENT_TIMESLICE RTEMS_EVENT_1
+
+typedef RtemsTaskReqMode_Context Context;
+
+static void Worker( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = (Context *) arg;
+
+ while ( true ) {
+ rtems_event_set events;
+
+ events = ReceiveAnyEvents();
+
+ if ( ( events & EVENT_TIMESLICE ) != 0 ) {
+ SetSelfPriority( PRIO_NORMAL );
+ SetSelfPriority( PRIO_HIGH );
+ }
+
+ ++ctx->worker_counter;
+ }
+}
+
+static void SignalHandler( rtems_signal_set signal_set )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->signal_counter;
+ T_eq_u32( signal_set, 0xdeadbeef );
+}
+
+static void ExhaustTimeslice( void )
+{
+ uint32_t ticks;
+
+ for (
+ ticks = 0;
+ ticks < rtems_configuration_get_ticks_per_timeslice();
+ ++ticks
+ ) {
+ ClockTick();
+ }
+}
+
+static void CheckMode(
+ Context *ctx,
+ rtems_mode mode,
+ rtems_mode mask,
+ rtems_mode set
+)
+{
+ rtems_status_code sc;
+ uint32_t counter;
+
+ mode &= ~mask;
+ mode |= set & mask;
+
+ counter = ctx->worker_counter;
+ SendEvents( ctx->worker_id, EVENT_MAKE_READY );
+
+ if ( ( mode & RTEMS_PREEMPT_MASK ) == RTEMS_PREEMPT ) {
+ T_eq_u32( ctx->worker_counter, counter + 1 );
+ } else {
+ T_eq_u32( ctx->worker_counter, counter );
+ }
+
+ counter = ctx->worker_counter;
+ SendEvents( ctx->worker_id, EVENT_TIMESLICE );
+ ExhaustTimeslice();
+
+ if ( ( mode & RTEMS_PREEMPT_MASK ) == RTEMS_PREEMPT ) {
+ if ( ( mode & RTEMS_TIMESLICE_MASK ) == RTEMS_TIMESLICE ) {
+ T_eq_u32( ctx->worker_counter, counter + 1 );
+ } else {
+ T_eq_u32( ctx->worker_counter, counter );
+ }
+ } else {
+ T_eq_u32( ctx->worker_counter, counter );
+ }
+
+ counter = ctx->signal_counter;
+ sc = rtems_signal_send( RTEMS_SELF, 0xdeadbeef );
+ T_rsc_success( sc );
+
+ if ( ( mode & RTEMS_ASR_MASK ) == RTEMS_ASR ) {
+ T_eq_u32( ctx->signal_counter, counter + 1 );
+ } else {
+ T_eq_u32( ctx->signal_counter, counter );
+ }
+
+ T_eq_u32( mode & RTEMS_INTERRUPT_MASK, _ISR_Get_level() );
+}
+
+static void RtemsTaskReqMode_Pre_PrevMode_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_PrevMode state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_PrevMode_Valid: {
+ /*
+ * While the ``previous_mode_set`` parameter references an object of type
+ * rtems_mode.
+ */
+ ctx->previous_mode_set = &ctx->previous_mode_set_value;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_PrevMode_Null: {
+ /*
+ * While the ``previous_mode_set`` parameter is NULL.
+ */
+ ctx->previous_mode_set = NULL;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_PrevMode_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_PreemptCur_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_PreemptCur state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_PreemptCur_Yes: {
+ /*
+ * While the calling task has preemption enabled.
+ */
+ ctx->current_mode |= RTEMS_PREEMPT;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_PreemptCur_No: {
+ /*
+ * Where the scheduler does not support the no-preempt mode, while the
+ * calling task has preemption enabled.
+ *
+ * Where the scheduler does support the no-preempt mode, while the
+ * calling task has preemption disabled.
+ */
+ if ( rtems_configuration_get_maximum_processors() > 1 ) {
+ ctx->current_mode |= RTEMS_PREEMPT;
+ } else {
+ ctx->current_mode |= RTEMS_NO_PREEMPT;
+ }
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_PreemptCur_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_TimesliceCur_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_TimesliceCur state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_TimesliceCur_Yes: {
+ /*
+ * While the calling task has timeslicing enabled.
+ */
+ ctx->current_mode |= RTEMS_TIMESLICE;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_TimesliceCur_No: {
+ /*
+ * While the calling task has timeslicing disabled.
+ */
+ ctx->current_mode |= RTEMS_NO_TIMESLICE;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_TimesliceCur_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_ASRCur_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_ASRCur state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_ASRCur_Yes: {
+ /*
+ * While the calling task has ASR processing enabled.
+ */
+ ctx->current_mode |= RTEMS_ASR;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_ASRCur_No: {
+ /*
+ * While the calling task has ASR processing disabled.
+ */
+ ctx->current_mode |= RTEMS_NO_ASR;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_ASRCur_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_IntLvlCur_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_IntLvlCur state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_IntLvlCur_Zero: {
+ /*
+ * While the calling task executes with an interrupt level of zero.
+ */
+ ctx->current_mode |= RTEMS_INTERRUPT_LEVEL( 0 );
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_IntLvlCur_Positive: {
+ /*
+ * Where the system needs inter-processor interrupts, while the calling
+ * task executes with an interrupt level of zero.
+ *
+ * Where the system does not need inter-processor interrupts, while the
+ * calling task executes with an an interrupt level greater than zero and
+ * less than or equal to CPU_MODES_INTERRUPT_MASK.
+ */
+ if ( rtems_configuration_get_maximum_processors() > 1 ) {
+ ctx->current_mode |= RTEMS_INTERRUPT_LEVEL( 0 );
+ } else {
+ ctx->current_mode |= RTEMS_INTERRUPT_LEVEL( 1 );
+ }
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_IntLvlCur_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_Preempt_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_Preempt state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_Preempt_Yes: {
+ /*
+ * While the ``mode_set`` parameter specifies that preemption is enabled.
+ */
+ ctx->mode_set |= RTEMS_PREEMPT;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_Preempt_No: {
+ /*
+ * While the ``mode_set`` parameter specifies that preemption is
+ * disabled.
+ */
+ ctx->mode_set |= RTEMS_NO_PREEMPT;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_Preempt_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_Timeslice_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_Timeslice state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_Timeslice_Yes: {
+ /*
+ * While the ``mode_set`` parameter specifies that timeslicing is
+ * enabled.
+ */
+ ctx->mode_set |= RTEMS_TIMESLICE;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_Timeslice_No: {
+ /*
+ * While the ``mode_set`` parameter specifies that timeslicing is
+ * disabled.
+ */
+ ctx->mode_set |= RTEMS_NO_TIMESLICE;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_Timeslice_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_ASR_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_ASR state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_ASR_Yes: {
+ /*
+ * While the ``mode_set`` parameter specifies that ASR processing is
+ * enabled.
+ */
+ ctx->mode_set |= RTEMS_ASR;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_ASR_No: {
+ /*
+ * While the ``mode_set`` parameter specifies that ASR processing is
+ * disabled.
+ */
+ ctx->mode_set |= RTEMS_NO_ASR;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_ASR_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_IntLvl_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_IntLvl state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_IntLvl_Zero: {
+ /*
+ * While the ``mode_set`` parameter specifies an interrupt level of zero.
+ */
+ ctx->mode_set |= RTEMS_INTERRUPT_LEVEL( 0 );
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_IntLvl_Positive: {
+ /*
+ * While the ``mode_set`` parameter specifies an interrupt level greater
+ * than zero and less than or equal to CPU_MODES_INTERRUPT_MASK.
+ */
+ ctx->mode_set |= RTEMS_INTERRUPT_LEVEL( 1 );
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_IntLvl_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_PreemptMsk_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_PreemptMsk state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_PreemptMsk_Yes: {
+ /*
+ * While the ``mask`` parameter specifies that the preemption mode shall
+ * be set.
+ */
+ ctx->mode_mask |= RTEMS_PREEMPT_MASK;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_PreemptMsk_No: {
+ /*
+ * While the ``mask`` parameter specifies that the preemption mode shall
+ * not be set.
+ */
+ /* This is the default mode mask */
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_PreemptMsk_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_TimesliceMsk_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_TimesliceMsk state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_TimesliceMsk_Yes: {
+ /*
+ * While the ``mask`` parameter specifies that the timeslicing mode shall
+ * be set.
+ */
+ ctx->mode_mask |= RTEMS_TIMESLICE_MASK;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_TimesliceMsk_No: {
+ /*
+ * While the ``mask`` parameter specifies that the timeslicing mode shall
+ * not be set.
+ */
+ /* This is the default mode mask */
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_TimesliceMsk_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_ASRMsk_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_ASRMsk state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_ASRMsk_Yes: {
+ /*
+ * While the ``mask`` parameter specifies that the ASR processing mode
+ * shall be set.
+ */
+ ctx->mode_mask |= RTEMS_ASR_MASK;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_ASRMsk_No: {
+ /*
+ * While the ``mask`` parameter specifies that the ASR processing mode
+ * shall not be set.
+ */
+ /* This is the default mode mask */
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_ASRMsk_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Pre_IntLvlMsk_Prepare(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Pre_IntLvlMsk state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Pre_IntLvlMsk_Yes: {
+ /*
+ * While the ``mask`` parameter specifies that the interrupt level shall
+ * be set.
+ */
+ ctx->mode_mask |= RTEMS_INTERRUPT_MASK;
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_IntLvlMsk_No: {
+ /*
+ * While the ``mask`` parameter specifies that the interrupt level shall
+ * not be set.
+ */
+ /* This is the default mode mask */
+ break;
+ }
+
+ case RtemsTaskReqMode_Pre_IntLvlMsk_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Post_Status_Check(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_mode() shall be RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_mode() shall be RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Status_NotImplIntLvl: {
+ /*
+ * The return status of rtems_task_mode() shall be RTEMS_NOT_IMPLEMENTED.
+ */
+ T_rsc( ctx->status, RTEMS_NOT_IMPLEMENTED );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP: {
+ /*
+ * Where the system needs inter-processor interrupts, the return status
+ * of rtems_task_mode() shall be RTEMS_NOT_IMPLEMENTED.
+ *
+ * Where the system does not need inter-processor interrupts, the return
+ * status of rtems_task_mode() shall be RTEMS_SUCCESSFUL.
+ */
+ if ( rtems_configuration_get_maximum_processors() > 1 ) {
+ T_rsc( ctx->status, RTEMS_NOT_IMPLEMENTED );
+ } else {
+ T_rsc_success( ctx->status );
+ }
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Status_NotImplNoPreempt: {
+ /*
+ * Where the scheduler does not support the no-preempt mode, the return
+ * status of rtems_task_mode() shall be RTEMS_NOT_IMPLEMENTED.
+ *
+ * Where the scheduler does support the no-preempt mode, the return
+ * status of rtems_task_mode() shall be RTEMS_SUCCESSFUL.
+ */
+ if ( rtems_configuration_get_maximum_processors() > 1 ) {
+ T_rsc( ctx->status, RTEMS_NOT_IMPLEMENTED );
+ } else {
+ T_rsc_success( ctx->status );
+ }
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Post_Preempt_Check(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Post_Preempt state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Post_Preempt_Yes: {
+ /*
+ * The calling task shall be preempted by a higher priority ready task
+ * during the rtems_task_mode() call.
+ */
+ T_eq_u32( ctx->worker_counter_after, ctx->worker_counter_before + 1 );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Preempt_No: {
+ /*
+ * The calling task shall not be preempted during the rtems_task_mode()
+ * call.
+ */
+ T_eq_u32( ctx->worker_counter_after, ctx->worker_counter_before );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Preempt_Maybe: {
+ /*
+ * Where the scheduler does not support the no-preempt mode, the calling
+ * task shall not be preempted during the rtems_task_mode() call.
+ *
+ * Where the scheduler does support the no-preempt mode, the calling task
+ * shall be preempted by a higher priority ready task during the
+ * rtems_task_mode() call.
+ */
+ if ( rtems_configuration_get_maximum_processors() > 1 ) {
+ T_eq_u32( ctx->worker_counter_after, ctx->worker_counter_before );
+ } else {
+ T_eq_u32( ctx->worker_counter_after, ctx->worker_counter_before + 1 );
+ }
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Preempt_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Post_ASR_Check(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Post_ASR state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Post_ASR_Yes: {
+ /*
+ * The calling task shall process pending signals during the
+ * rtems_task_mode() call.
+ */
+ T_eq_u32( ctx->signal_counter_after, ctx->signal_counter_before + 1 );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_ASR_No: {
+ /*
+ * The calling task shall not process signals during the
+ * rtems_task_mode() call.
+ */
+ T_eq_u32( ctx->signal_counter_after, ctx->signal_counter_before );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_ASR_Maybe: {
+ /*
+ * Where the scheduler does not support the no-preempt mode, the calling
+ * task shall not process signals during the rtems_task_mode() call.
+ *
+ * Where the scheduler does support the no-preempt mode, the calling task
+ * shall process pending signals during the rtems_task_mode() call.
+ */
+ if ( rtems_configuration_get_maximum_processors() > 1 ) {
+ T_eq_u32( ctx->signal_counter_after, ctx->signal_counter_before );
+ } else {
+ T_eq_u32( ctx->signal_counter_after, ctx->signal_counter_before + 1 );
+ }
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_ASR_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Post_PMVar_Check(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Post_PMVar state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Post_PMVar_Set: {
+ /*
+ * The value of the object referenced by the ``previous_mode_set``
+ * parameter shall be set to the task modes of the calling task on entry
+ * of the call to rtems_task_mode().
+ */
+ T_eq_ptr( ctx->previous_mode_set, &ctx->previous_mode_set_value );
+ T_eq_u32( ctx->previous_mode_set_value, ctx->current_mode );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_PMVar_Nop: {
+ /*
+ * Objects referenced by the ``stack_size`` parameter in past calls to
+ * rtems_task_mode() shall not be accessed by the rtems_task_mode() call.
+ */
+ T_eq_u32( ctx->previous_mode_set_value, INVALID_MODE );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_PMVar_Maybe: {
+ /*
+ * Where the scheduler does not support the no-preempt mode, objects
+ * referenced by the ``stack_size`` parameter in past calls to
+ * rtems_task_mode() shall not be accessed by the rtems_task_mode() call.
+ *
+ * Where the scheduler does support the no-preempt mode, the value of the
+ * object referenced by the ``previous_mode_set`` parameter shall be set
+ * to the task modes of the calling task on entry of the call to
+ * rtems_task_mode().
+ */
+ T_eq_ptr( ctx->previous_mode_set, &ctx->previous_mode_set_value );
+
+ if ( rtems_configuration_get_maximum_processors() > 1 ) {
+ T_eq_u32( ctx->previous_mode_set_value, INVALID_MODE );
+ } else {
+ T_eq_u32( ctx->previous_mode_set_value, ctx->current_mode );
+ }
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_PMVar_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Post_Mode_Check(
+ RtemsTaskReqMode_Context *ctx,
+ RtemsTaskReqMode_Post_Mode state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqMode_Post_Mode_Set: {
+ /*
+ * The task modes of the calling task indicated by the ``mask`` parameter
+ * shall be set to the corrsponding modes specified by the ``mode_set``
+ * parameter.
+ */
+ CheckMode( ctx, ctx->current_mode, ctx->mode_mask, ctx->mode_set );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Mode_Nop: {
+ /*
+ * The task modes of the calling task shall not be modified by the
+ * rtems_task_mode() call.
+ */
+ CheckMode( ctx, ctx->current_mode, 0, 0 );
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Mode_Maybe: {
+ /*
+ * Where the scheduler does not support the no-preempt mode, the task
+ * modes of the calling task shall not be modified by the
+ * rtems_task_mode() call.
+ *
+ * Where the scheduler does support the no-preempt mode, the task modes
+ * of the calling task indicated by the ``mask`` parameter shall be set
+ * to the corrsponding modes specified by the ``mode_set`` parameter.
+ */
+ if ( rtems_configuration_get_maximum_processors() > 1 ) {
+ CheckMode( ctx, ctx->current_mode, 0, 0 );
+ } else {
+ CheckMode( ctx, ctx->current_mode, ctx->mode_mask, ctx->mode_set );
+ }
+ break;
+ }
+
+ case RtemsTaskReqMode_Post_Mode_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqMode_Setup( RtemsTaskReqMode_Context *ctx )
+{
+ rtems_status_code sc;
+
+ memset( ctx, 0, sizeof( *ctx ) );
+
+ sc = rtems_task_mode(
+ RTEMS_DEFAULT_MODES,
+ RTEMS_CURRENT_MODE,
+ &ctx->runner_mode
+ );
+ T_rsc_success( sc );
+
+ SetSelfPriority( PRIO_NORMAL );
+ ctx->worker_id = CreateTask( "WORK", PRIO_HIGH );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+static void RtemsTaskReqMode_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqMode_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqMode_Setup( ctx );
+}
+
+static void RtemsTaskReqMode_Teardown( RtemsTaskReqMode_Context *ctx )
+{
+ DeleteTask( ctx->worker_id );
+ RestoreRunnerMode();
+ RestoreRunnerPriority();
+}
+
+static void RtemsTaskReqMode_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqMode_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqMode_Teardown( ctx );
+}
+
+static void RtemsTaskReqMode_Prepare( RtemsTaskReqMode_Context *ctx )
+{
+ ctx->current_mode = RTEMS_DEFAULT_MODES;
+ ctx->mode_set = RTEMS_DEFAULT_MODES;
+ ctx->mode_mask = RTEMS_CURRENT_MODE;
+ ctx->previous_mode_set_value = INVALID_MODE;
+}
+
+static void RtemsTaskReqMode_Action( RtemsTaskReqMode_Context *ctx )
+{
+ rtems_status_code sc;
+ rtems_mode mode;
+
+ sc = rtems_task_mode( ctx->current_mode, RTEMS_ALL_MODE_MASKS, &mode );
+ T_rsc_success( sc );
+
+ SendEvents( ctx->worker_id, EVENT_MAKE_READY );
+
+ sc = rtems_signal_catch( SignalHandler, ctx->current_mode | RTEMS_NO_ASR );
+ T_rsc_success( sc );
+
+ sc = rtems_signal_send( RTEMS_SELF, 0xdeadbeef );
+ T_rsc_success( sc );
+
+ ctx->worker_counter_before = ctx->worker_counter;
+ ctx->signal_counter_before = ctx->signal_counter;
+ ctx->status = rtems_task_mode(
+ ctx->mode_set,
+ ctx->mode_mask,
+ ctx->previous_mode_set
+ );
+ ctx->worker_counter_after = ctx->worker_counter;
+ ctx->signal_counter_after = ctx->signal_counter;
+}
+
+static void RtemsTaskReqMode_Cleanup( RtemsTaskReqMode_Context *ctx )
+{
+ rtems_status_code sc;
+ rtems_mode mode;
+
+ sc = rtems_task_mode( RTEMS_DEFAULT_MODES, RTEMS_ALL_MODE_MASKS, &mode );
+ T_rsc_success( sc );
+
+ sc = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ T_rsc_success( sc );
+
+ sc = rtems_signal_catch( NULL, RTEMS_DEFAULT_MODES );
+ T_rsc_success( sc );
+}
+
+static const RtemsTaskReqMode_Entry
+RtemsTaskReqMode_Entries[] = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_InvAddr, RtemsTaskReqMode_Post_Preempt_No,
+ RtemsTaskReqMode_Post_ASR_No, RtemsTaskReqMode_Post_PMVar_Nop,
+ RtemsTaskReqMode_Post_Mode_Nop },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_InvAddr, RtemsTaskReqMode_Post_Preempt_No,
+ RtemsTaskReqMode_Post_ASR_No, RtemsTaskReqMode_Post_PMVar_Nop,
+ RtemsTaskReqMode_Post_Mode_Nop },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplNoPreempt,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplNoPreempt,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvl,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Nop, RtemsTaskReqMode_Post_Mode_Nop },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Maybe, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Yes, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Maybe, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Yes, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvl,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Nop, RtemsTaskReqMode_Post_Mode_Nop },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplNoPreempt,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplNoPreempt,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Maybe,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvl,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Nop, RtemsTaskReqMode_Post_Mode_Nop },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP,
+ RtemsTaskReqMode_Post_Preempt_Maybe, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Yes, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP,
+ RtemsTaskReqMode_Post_Preempt_Maybe, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Yes, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplNoPreempt,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Maybe,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvl,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Nop, RtemsTaskReqMode_Post_Mode_Nop },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Maybe,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Maybe,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Maybe, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Yes, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Maybe, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Yes, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvl,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Nop, RtemsTaskReqMode_Post_Mode_Nop },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplNoPreempt,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Maybe,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvl,
+ RtemsTaskReqMode_Post_Preempt_No, RtemsTaskReqMode_Post_ASR_No,
+ RtemsTaskReqMode_Post_PMVar_Nop, RtemsTaskReqMode_Post_Mode_Nop },
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP,
+ RtemsTaskReqMode_Post_Preempt_Maybe, RtemsTaskReqMode_Post_ASR_Maybe,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Yes, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set },
+#endif
+#if CPU_ENABLE_ROBUST_THREAD_DISPATCH == TRUE
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_NA,
+ RtemsTaskReqMode_Post_Preempt_NA, RtemsTaskReqMode_Post_ASR_NA,
+ RtemsTaskReqMode_Post_PMVar_NA, RtemsTaskReqMode_Post_Mode_NA }
+#elif defined(RTEMS_SMP)
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqMode_Post_Status_NotImplIntLvlSMP,
+ RtemsTaskReqMode_Post_Preempt_Maybe, RtemsTaskReqMode_Post_ASR_Maybe,
+ RtemsTaskReqMode_Post_PMVar_Maybe, RtemsTaskReqMode_Post_Mode_Maybe }
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqMode_Post_Status_Ok,
+ RtemsTaskReqMode_Post_Preempt_Yes, RtemsTaskReqMode_Post_ASR_Yes,
+ RtemsTaskReqMode_Post_PMVar_Set, RtemsTaskReqMode_Post_Mode_Set }
+#endif
+};
+
+static const uint8_t
+RtemsTaskReqMode_Map[] = {
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2,
+ 6, 2, 6, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2,
+ 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5,
+ 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2,
+ 6, 2, 6, 2, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12,
+ 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2,
+ 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5, 5,
+ 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2,
+ 6, 2, 6, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 7, 3, 7, 3,
+ 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3,
+ 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
+ 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4,
+ 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3,
+ 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4,
+ 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3,
+ 10, 10, 2, 2, 10, 10, 2, 2, 10, 10, 2, 2, 10, 10, 2, 2, 17, 10, 6, 2, 17, 10,
+ 6, 2, 17, 10, 6, 2, 17, 10, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 10, 10, 2, 2, 10, 10,
+ 2, 2, 10, 10, 2, 2, 10, 10, 2, 2, 17, 10, 6, 2, 17, 10, 6, 2, 17, 10, 6, 2,
+ 17, 10, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 6,
+ 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 16, 16, 5, 5, 16, 16, 5, 5, 10, 10, 2, 2,
+ 10, 10, 2, 2, 21, 16, 12, 5, 21, 16, 12, 5, 17, 10, 6, 2, 17, 10, 6, 2, 5, 5,
+ 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2,
+ 6, 2, 6, 2, 6, 2, 16, 16, 5, 5, 16, 16, 5, 5, 10, 10, 2, 2, 10, 10, 2, 2, 21,
+ 16, 12, 5, 21, 16, 12, 5, 17, 10, 6, 2, 17, 10, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5,
+ 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2,
+ 11, 11, 3, 3, 11, 11, 3, 3, 11, 11, 3, 3, 11, 11, 3, 3, 18, 11, 7, 3, 18, 11,
+ 7, 3, 18, 11, 7, 3, 18, 11, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 11, 11, 3, 3, 11, 11,
+ 3, 3, 11, 11, 3, 3, 11, 11, 3, 3, 18, 11, 7, 3, 18, 11, 7, 3, 18, 11, 7, 3,
+ 18, 11, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 7, 3, 7,
+ 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 13, 13, 4, 4, 13, 13, 4, 4, 11, 11, 3, 3,
+ 11, 11, 3, 3, 13, 13, 4, 4, 13, 13, 4, 4, 18, 11, 7, 3, 18, 11, 7, 3, 4, 4,
+ 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3,
+ 7, 3, 7, 3, 13, 13, 4, 4, 13, 13, 4, 4, 11, 11, 3, 3, 11, 11, 3, 3, 13, 13,
+ 4, 4, 13, 13, 4, 4, 18, 11, 7, 3, 18, 11, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3,
+ 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2,
+ 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 6, 2, 6, 2,
+ 6, 2, 6, 2, 6, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
+ 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5, 5, 5, 5,
+ 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2,
+ 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5,
+ 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2,
+ 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5, 5, 5, 5, 5,
+ 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6,
+ 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7,
+ 3, 7, 3, 7, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 7,
+ 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 4,
+ 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7,
+ 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
+ 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3,
+ 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3,
+ 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 10, 10,
+ 2, 2, 10, 10, 2, 2, 10, 10, 2, 2, 10, 10, 2, 2, 17, 10, 6, 2, 17, 10, 6, 2,
+ 17, 10, 6, 2, 17, 10, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 10, 10, 2, 2, 10, 10, 2, 2,
+ 10, 10, 2, 2, 10, 10, 2, 2, 17, 10, 6, 2, 17, 10, 6, 2, 17, 10, 6, 2, 17, 10,
+ 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 6, 2, 6, 2,
+ 6, 2, 6, 2, 6, 2, 6, 2, 16, 16, 5, 5, 16, 16, 5, 5, 10, 10, 2, 2, 10, 10, 2,
+ 2, 21, 16, 12, 5, 21, 16, 12, 5, 17, 10, 6, 2, 17, 10, 6, 2, 5, 5, 5, 5, 5,
+ 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6,
+ 2, 6, 2, 16, 16, 5, 5, 16, 16, 5, 5, 10, 10, 2, 2, 10, 10, 2, 2, 21, 16, 12,
+ 5, 21, 16, 12, 5, 17, 10, 6, 2, 17, 10, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2,
+ 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 11, 11,
+ 3, 3, 11, 11, 3, 3, 11, 11, 3, 3, 11, 11, 3, 3, 18, 11, 7, 3, 18, 11, 7, 3,
+ 18, 11, 7, 3, 18, 11, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 11, 11, 3, 3, 11, 11, 3, 3,
+ 11, 11, 3, 3, 11, 11, 3, 3, 18, 11, 7, 3, 18, 11, 7, 3, 18, 11, 7, 3, 18, 11,
+ 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 7, 3, 7, 3, 7, 3,
+ 7, 3, 7, 3, 7, 3, 7, 3, 13, 13, 4, 4, 13, 13, 4, 4, 11, 11, 3, 3, 11, 11, 3,
+ 3, 13, 13, 4, 4, 13, 13, 4, 4, 18, 11, 7, 3, 18, 11, 7, 3, 4, 4, 4, 4, 4, 4,
+ 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3,
+ 13, 13, 4, 4, 13, 13, 4, 4, 11, 11, 3, 3, 11, 11, 3, 3, 13, 13, 4, 4, 13, 13,
+ 4, 4, 18, 11, 7, 3, 18, 11, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3,
+ 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 8, 8, 8, 8, 8, 8, 8, 8,
+ 2, 2, 2, 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8, 6, 2, 6, 2, 6, 2, 6, 2,
+ 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8,
+ 6, 2, 6, 2, 6, 2, 6, 2, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 14,
+ 8, 14, 8, 14, 8, 14, 8, 6, 2, 6, 2, 6, 2, 6, 2, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2,
+ 2, 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5,
+ 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2,
+ 6, 2, 6, 2, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12,
+ 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2,
+ 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5, 5,
+ 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2,
+ 6, 2, 6, 2, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15,
+ 9, 15, 9, 7, 3, 7, 3, 7, 3, 7, 3, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3,
+ 3, 3, 15, 9, 15, 9, 15, 9, 15, 9, 7, 3, 7, 3, 7, 3, 7, 3, 9, 9, 9, 9, 9, 9,
+ 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15, 9, 15, 9, 7, 3, 7, 3, 7, 3,
+ 7, 3, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15, 9,
+ 15, 9, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3,
+ 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3,
+ 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4,
+ 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7,
+ 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
+ 4, 7, 3, 7, 3, 7, 3, 7, 3, 19, 19, 8, 8, 19, 19, 8, 8, 10, 10, 2, 2, 10, 10,
+ 2, 2, 22, 19, 14, 8, 22, 19, 14, 8, 17, 10, 6, 2, 17, 10, 6, 2, 8, 8, 8, 8,
+ 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8, 6, 2, 6, 2,
+ 6, 2, 6, 2, 19, 19, 8, 8, 19, 19, 8, 8, 10, 10, 2, 2, 10, 10, 2, 2, 22, 19,
+ 14, 8, 22, 19, 14, 8, 17, 10, 6, 2, 17, 10, 6, 2, 8, 8, 8, 8, 8, 8, 8, 8, 2,
+ 2, 2, 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8, 6, 2, 6, 2, 6, 2, 6, 2, 16,
+ 16, 5, 5, 16, 16, 5, 5, 10, 10, 2, 2, 10, 10, 2, 2, 21, 16, 12, 5, 21, 16,
+ 12, 5, 17, 10, 6, 2, 17, 10, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2,
+ 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 16, 16, 5, 5, 16,
+ 16, 5, 5, 10, 10, 2, 2, 10, 10, 2, 2, 21, 16, 12, 5, 21, 16, 12, 5, 17, 10,
+ 6, 2, 17, 10, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5,
+ 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 20, 20, 9, 9, 20, 20, 9, 9, 11,
+ 11, 3, 3, 11, 11, 3, 3, 23, 20, 15, 9, 23, 20, 15, 9, 18, 11, 7, 3, 18, 11,
+ 7, 3, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15, 9,
+ 15, 9, 7, 3, 7, 3, 7, 3, 7, 3, 20, 20, 9, 9, 20, 20, 9, 9, 11, 11, 3, 3, 11,
+ 11, 3, 3, 23, 20, 15, 9, 23, 20, 15, 9, 18, 11, 7, 3, 18, 11, 7, 3, 9, 9, 9,
+ 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15, 9, 15, 9, 7, 3, 7,
+ 3, 7, 3, 7, 3, 13, 13, 4, 4, 13, 13, 4, 4, 11, 11, 3, 3, 11, 11, 3, 3, 13,
+ 13, 4, 4, 13, 13, 4, 4, 18, 11, 7, 3, 18, 11, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 13,
+ 13, 4, 4, 13, 13, 4, 4, 11, 11, 3, 3, 11, 11, 3, 3, 13, 13, 4, 4, 13, 13, 4,
+ 4, 18, 11, 7, 3, 18, 11, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3,
+ 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 8, 8, 8, 8, 8, 8, 8, 8, 2,
+ 2, 2, 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8, 6, 2, 6, 2, 6, 2, 6, 2, 8,
+ 8, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8, 6,
+ 2, 6, 2, 6, 2, 6, 2, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 14, 8,
+ 14, 8, 14, 8, 14, 8, 6, 2, 6, 2, 6, 2, 6, 2, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 2,
+ 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5,
+ 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6,
+ 2, 6, 2, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5,
+ 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2,
+ 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 5, 5, 5, 5, 5,
+ 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6,
+ 2, 6, 2, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15, 9,
+ 15, 9, 7, 3, 7, 3, 7, 3, 7, 3, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3,
+ 3, 15, 9, 15, 9, 15, 9, 15, 9, 7, 3, 7, 3, 7, 3, 7, 3, 9, 9, 9, 9, 9, 9, 9,
+ 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15, 9, 15, 9, 7, 3, 7, 3, 7, 3, 7,
+ 3, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15, 9, 15,
+ 9, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4,
+ 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3,
+ 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 4, 4, 4, 4, 4,
+ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7,
+ 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7,
+ 3, 7, 3, 7, 3, 7, 3, 19, 19, 8, 8, 19, 19, 8, 8, 10, 10, 2, 2, 10, 10, 2, 2,
+ 22, 19, 14, 8, 22, 19, 14, 8, 17, 10, 6, 2, 17, 10, 6, 2, 8, 8, 8, 8, 8, 8,
+ 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8, 6, 2, 6, 2, 6, 2,
+ 6, 2, 19, 19, 8, 8, 19, 19, 8, 8, 10, 10, 2, 2, 10, 10, 2, 2, 22, 19, 14, 8,
+ 22, 19, 14, 8, 17, 10, 6, 2, 17, 10, 6, 2, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 2,
+ 2, 2, 2, 2, 2, 14, 8, 14, 8, 14, 8, 14, 8, 6, 2, 6, 2, 6, 2, 6, 2, 16, 16, 5,
+ 5, 16, 16, 5, 5, 10, 10, 2, 2, 10, 10, 2, 2, 21, 16, 12, 5, 21, 16, 12, 5,
+ 17, 10, 6, 2, 17, 10, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2,
+ 12, 5, 12, 5, 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 16, 16, 5, 5, 16, 16, 5,
+ 5, 10, 10, 2, 2, 10, 10, 2, 2, 21, 16, 12, 5, 21, 16, 12, 5, 17, 10, 6, 2,
+ 17, 10, 6, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 12, 5, 12, 5,
+ 12, 5, 12, 5, 6, 2, 6, 2, 6, 2, 6, 2, 20, 20, 9, 9, 20, 20, 9, 9, 11, 11, 3,
+ 3, 11, 11, 3, 3, 23, 20, 15, 9, 23, 20, 15, 9, 18, 11, 7, 3, 18, 11, 7, 3, 9,
+ 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15, 9, 15, 9, 7,
+ 3, 7, 3, 7, 3, 7, 3, 20, 20, 9, 9, 20, 20, 9, 9, 11, 11, 3, 3, 11, 11, 3, 3,
+ 23, 20, 15, 9, 23, 20, 15, 9, 18, 11, 7, 3, 18, 11, 7, 3, 9, 9, 9, 9, 9, 9,
+ 9, 9, 3, 3, 3, 3, 3, 3, 3, 3, 15, 9, 15, 9, 15, 9, 15, 9, 7, 3, 7, 3, 7, 3,
+ 7, 3, 13, 13, 4, 4, 13, 13, 4, 4, 11, 11, 3, 3, 11, 11, 3, 3, 13, 13, 4, 4,
+ 13, 13, 4, 4, 18, 11, 7, 3, 18, 11, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3,
+ 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 13, 13, 4, 4, 13,
+ 13, 4, 4, 11, 11, 3, 3, 11, 11, 3, 3, 13, 13, 4, 4, 13, 13, 4, 4, 18, 11, 7,
+ 3, 18, 11, 7, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
+ 4, 4, 4, 4, 7, 3, 7, 3, 7, 3, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static size_t RtemsTaskReqMode_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqMode_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqMode_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqMode_Fixture = {
+ .setup = RtemsTaskReqMode_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqMode_Teardown_Wrap,
+ .scope = RtemsTaskReqMode_Scope,
+ .initial_context = &RtemsTaskReqMode_Instance
+};
+
+static inline RtemsTaskReqMode_Entry RtemsTaskReqMode_PopEntry(
+ RtemsTaskReqMode_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqMode_Entries[
+ RtemsTaskReqMode_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqMode_TestVariant( RtemsTaskReqMode_Context *ctx )
+{
+ RtemsTaskReqMode_Pre_PrevMode_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqMode_Pre_PreemptCur_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqMode_Pre_TimesliceCur_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqMode_Pre_ASRCur_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqMode_Pre_IntLvlCur_Prepare( ctx, ctx->Map.pcs[ 4 ] );
+ RtemsTaskReqMode_Pre_Preempt_Prepare( ctx, ctx->Map.pcs[ 5 ] );
+ RtemsTaskReqMode_Pre_Timeslice_Prepare( ctx, ctx->Map.pcs[ 6 ] );
+ RtemsTaskReqMode_Pre_ASR_Prepare( ctx, ctx->Map.pcs[ 7 ] );
+ RtemsTaskReqMode_Pre_IntLvl_Prepare( ctx, ctx->Map.pcs[ 8 ] );
+ RtemsTaskReqMode_Pre_PreemptMsk_Prepare( ctx, ctx->Map.pcs[ 9 ] );
+ RtemsTaskReqMode_Pre_TimesliceMsk_Prepare( ctx, ctx->Map.pcs[ 10 ] );
+ RtemsTaskReqMode_Pre_ASRMsk_Prepare( ctx, ctx->Map.pcs[ 11 ] );
+ RtemsTaskReqMode_Pre_IntLvlMsk_Prepare( ctx, ctx->Map.pcs[ 12 ] );
+ RtemsTaskReqMode_Action( ctx );
+ RtemsTaskReqMode_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqMode_Post_Preempt_Check( ctx, ctx->Map.entry.Post_Preempt );
+ RtemsTaskReqMode_Post_ASR_Check( ctx, ctx->Map.entry.Post_ASR );
+ RtemsTaskReqMode_Post_PMVar_Check( ctx, ctx->Map.entry.Post_PMVar );
+ RtemsTaskReqMode_Post_Mode_Check( ctx, ctx->Map.entry.Post_Mode );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqMode( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqMode, &RtemsTaskReqMode_Fixture )
+{
+ RtemsTaskReqMode_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pcs[ 0 ] = RtemsTaskReqMode_Pre_PrevMode_Valid;
+ ctx->Map.pcs[ 0 ] < RtemsTaskReqMode_Pre_PrevMode_NA;
+ ++ctx->Map.pcs[ 0 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqMode_Pre_PreemptCur_Yes;
+ ctx->Map.pcs[ 1 ] < RtemsTaskReqMode_Pre_PreemptCur_NA;
+ ++ctx->Map.pcs[ 1 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqMode_Pre_TimesliceCur_Yes;
+ ctx->Map.pcs[ 2 ] < RtemsTaskReqMode_Pre_TimesliceCur_NA;
+ ++ctx->Map.pcs[ 2 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 3 ] = RtemsTaskReqMode_Pre_ASRCur_Yes;
+ ctx->Map.pcs[ 3 ] < RtemsTaskReqMode_Pre_ASRCur_NA;
+ ++ctx->Map.pcs[ 3 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 4 ] = RtemsTaskReqMode_Pre_IntLvlCur_Zero;
+ ctx->Map.pcs[ 4 ] < RtemsTaskReqMode_Pre_IntLvlCur_NA;
+ ++ctx->Map.pcs[ 4 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 5 ] = RtemsTaskReqMode_Pre_Preempt_Yes;
+ ctx->Map.pcs[ 5 ] < RtemsTaskReqMode_Pre_Preempt_NA;
+ ++ctx->Map.pcs[ 5 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 6 ] = RtemsTaskReqMode_Pre_Timeslice_Yes;
+ ctx->Map.pcs[ 6 ] < RtemsTaskReqMode_Pre_Timeslice_NA;
+ ++ctx->Map.pcs[ 6 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 7 ] = RtemsTaskReqMode_Pre_ASR_Yes;
+ ctx->Map.pcs[ 7 ] < RtemsTaskReqMode_Pre_ASR_NA;
+ ++ctx->Map.pcs[ 7 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 8 ] = RtemsTaskReqMode_Pre_IntLvl_Zero;
+ ctx->Map.pcs[ 8 ] < RtemsTaskReqMode_Pre_IntLvl_NA;
+ ++ctx->Map.pcs[ 8 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 9 ] = RtemsTaskReqMode_Pre_PreemptMsk_Yes;
+ ctx->Map.pcs[ 9 ] < RtemsTaskReqMode_Pre_PreemptMsk_NA;
+ ++ctx->Map.pcs[ 9 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 10 ] = RtemsTaskReqMode_Pre_TimesliceMsk_Yes;
+ ctx->Map.pcs[ 10 ] < RtemsTaskReqMode_Pre_TimesliceMsk_NA;
+ ++ctx->Map.pcs[ 10 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 11 ] = RtemsTaskReqMode_Pre_ASRMsk_Yes;
+ ctx->Map.pcs[ 11 ] < RtemsTaskReqMode_Pre_ASRMsk_NA;
+ ++ctx->Map.pcs[ 11 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 12 ] = RtemsTaskReqMode_Pre_IntLvlMsk_Yes;
+ ctx->Map.pcs[ 12 ] < RtemsTaskReqMode_Pre_IntLvlMsk_NA;
+ ++ctx->Map.pcs[ 12 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqMode_PopEntry( ctx );
+
+ if ( ctx->Map.entry.Skip ) {
+ continue;
+ }
+
+ RtemsTaskReqMode_Prepare( ctx );
+ RtemsTaskReqMode_TestVariant( ctx );
+ RtemsTaskReqMode_Cleanup( ctx );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-performance.c b/testsuites/validation/tc-task-performance.c
new file mode 100644
index 0000000000..2900ac6ca0
--- /dev/null
+++ b/testsuites/validation/tc-task-performance.c
@@ -0,0 +1,1066 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskValPerf
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include "ts-config.h"
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskValPerf spec:/rtems/task/val/perf
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesPerformanceNoClock0
+ *
+ * @brief This test case provides a context to run @ref RTEMSAPIClassicTasks
+ * performance tests.
+ *
+ * @{
+ */
+
+/**
+ * @brief Test context for spec:/rtems/task/val/perf test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides a worker identifier.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief This member provides a second worker identifier.
+ */
+ rtems_id worker_2_id;
+
+ /**
+ * @brief This member provides a status code.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member references the measure runtime context.
+ */
+ T_measure_runtime_context *context;
+
+ /**
+ * @brief This member provides the measure runtime request.
+ */
+ T_measure_runtime_request request;
+
+ /**
+ * @brief This member provides an optional measurement begin time point.
+ */
+ T_ticks begin;
+
+ /**
+ * @brief This member provides an optional measurement end time point.
+ */
+ T_ticks end;
+} RtemsTaskValPerf_Context;
+
+static RtemsTaskValPerf_Context
+ RtemsTaskValPerf_Instance;
+
+typedef RtemsTaskValPerf_Context Context;
+
+enum {
+ EVENT_RESTART = RTEMS_EVENT_0,
+ EVENT_SET_END = RTEMS_EVENT_1,
+ EVENT_BUSY = RTEMS_EVENT_2
+} Event;
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char task_storage[
+ RTEMS_TASK_STORAGE_SIZE(
+ TEST_MAXIMUM_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config config = {
+ .name = OBJECT_NAME,
+ .initial_priority = PRIO_NORMAL,
+ .storage_area = task_storage,
+ .storage_size = sizeof( task_storage ),
+ .maximum_thread_local_storage_size = 0,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = RTEMS_DEFAULT_ATTRIBUTES
+};
+
+static void Send( const Context *ctx, rtems_event_set events )
+{
+ SendEvents( ctx->worker_id, events );
+}
+
+static void Worker( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = (Context *) arg;
+ ctx->end = T_tick();
+
+ while ( true ) {
+ rtems_event_set events;
+ T_ticks ticks;
+
+ events = ReceiveAnyEvents();
+ ticks = T_tick();
+
+ if ( ( events & EVENT_RESTART ) != 0 ) {
+ ctx->begin = T_tick();
+ (void) rtems_task_restart( RTEMS_SELF, (rtems_task_argument) ctx );
+ }
+
+ if ( ( events & EVENT_SET_END ) != 0 ) {
+ ctx->end = ticks;
+ }
+
+ if ( ( events & EVENT_BUSY ) != 0 ) {
+ (void) _CPU_Thread_Idle_body( 0 );
+ }
+ }
+}
+
+static void RtemsTaskValPerf_Setup_Context( RtemsTaskValPerf_Context *ctx )
+{
+ T_measure_runtime_config config;
+
+ memset( &config, 0, sizeof( config ) );
+ config.sample_count = 100;
+ ctx->request.arg = ctx;
+ ctx->request.flags = T_MEASURE_RUNTIME_REPORT_SAMPLES;
+ ctx->context = T_measure_runtime_create( &config );
+ T_assert_not_null( ctx->context );
+}
+
+/**
+ * @brief Set the runner priority.
+ */
+static void RtemsTaskValPerf_Setup( RtemsTaskValPerf_Context *ctx )
+{
+ SetSelfPriority( PRIO_NORMAL );
+}
+
+static void RtemsTaskValPerf_Setup_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskValPerf_Setup_Context( ctx );
+ RtemsTaskValPerf_Setup( ctx );
+}
+
+/**
+ * @brief Restore the runner priority.
+ */
+static void RtemsTaskValPerf_Teardown( RtemsTaskValPerf_Context *ctx )
+{
+ RestoreRunnerPriority();
+}
+
+static void RtemsTaskValPerf_Teardown_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskValPerf_Teardown( ctx );
+}
+
+static T_fixture RtemsTaskValPerf_Fixture = {
+ .setup = RtemsTaskValPerf_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskValPerf_Teardown_Wrap,
+ .scope = NULL,
+ .initial_context = &RtemsTaskValPerf_Instance
+};
+
+/**
+ * @brief Construct a worker task.
+ */
+static void RtemsTaskReqPerfConstruct_Body( RtemsTaskValPerf_Context *ctx )
+{
+ ctx->status = rtems_task_construct( &config, &ctx->worker_id );
+}
+
+static void RtemsTaskReqPerfConstruct_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfConstruct_Body( ctx );
+}
+
+/**
+ * @brief Delete the worker. Discard samples interrupted by a clock tick.
+ */
+static bool RtemsTaskReqPerfConstruct_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ DeleteTask( ctx->worker_id );
+ KillZombies();
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfConstruct_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfConstruct_Teardown( ctx, delta, tic, toc, retry );
+}
+
+/**
+ * @brief Create and start a worker task.
+ */
+static void RtemsTaskReqPerfRestart_Prepare( RtemsTaskValPerf_Context *ctx )
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_LOW );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+/**
+ * @brief Restart the worker task.
+ */
+static void RtemsTaskReqPerfRestart_Body( RtemsTaskValPerf_Context *ctx )
+{
+ ctx->status = rtems_task_restart(
+ ctx->worker_id,
+ (rtems_task_argument) ctx
+ );
+}
+
+static void RtemsTaskReqPerfRestart_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfRestart_Body( ctx );
+}
+
+/**
+ * @brief Discard samples interrupted by a clock tick.
+ */
+static bool RtemsTaskReqPerfRestart_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfRestart_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfRestart_Teardown( ctx, delta, tic, toc, retry );
+}
+
+/**
+ * @brief Delete the worker task.
+ */
+static void RtemsTaskReqPerfRestart_Cleanup( RtemsTaskValPerf_Context *ctx )
+{
+ DeleteTask( ctx->worker_id );
+}
+
+/**
+ * @brief Create and start a worker task.
+ */
+static void RtemsTaskReqPerfRestartPreempt_Prepare(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_HIGH );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+/**
+ * @brief Restart the worker task.
+ */
+static void RtemsTaskReqPerfRestartPreempt_Body(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ctx->begin = T_tick();
+ ctx->status = rtems_task_restart(
+ ctx->worker_id,
+ (rtems_task_argument) ctx
+ );
+}
+
+static void RtemsTaskReqPerfRestartPreempt_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfRestartPreempt_Body( ctx );
+}
+
+/**
+ * @brief Set the measured runtime. Discard samples interrupted by a clock
+ * tick.
+ */
+static bool RtemsTaskReqPerfRestartPreempt_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ *delta = ctx->end - ctx->begin;
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfRestartPreempt_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfRestartPreempt_Teardown(
+ ctx,
+ delta,
+ tic,
+ toc,
+ retry
+ );
+}
+
+/**
+ * @brief Delete the worker task.
+ */
+static void RtemsTaskReqPerfRestartPreempt_Cleanup(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ DeleteTask( ctx->worker_id );
+}
+
+/**
+ * @brief Create and start a worker task.
+ */
+static void RtemsTaskReqPerfRestartSelf_Prepare(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_HIGH );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+/**
+ * @brief Restart the worker task.
+ */
+static void RtemsTaskReqPerfRestartSelf_Body( RtemsTaskValPerf_Context *ctx )
+{
+ Send( ctx, EVENT_RESTART );
+}
+
+static void RtemsTaskReqPerfRestartSelf_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfRestartSelf_Body( ctx );
+}
+
+/**
+ * @brief Set the measured runtime. Discard samples interrupted by a clock
+ * tick.
+ */
+static bool RtemsTaskReqPerfRestartSelf_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ *delta = ctx->end - ctx->begin;
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfRestartSelf_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfRestartSelf_Teardown( ctx, delta, tic, toc, retry );
+}
+
+/**
+ * @brief Delete the worker task.
+ */
+static void RtemsTaskReqPerfRestartSelf_Cleanup(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ DeleteTask( ctx->worker_id );
+}
+
+#if defined(RTEMS_SMP)
+/**
+ * @brief Set the runner affinity.
+ */
+static void RtemsTaskReqPerfSetSchedulerMove_Prepare(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ SetSelfAffinityAll();
+}
+
+/**
+ * @brief Set the scheduler of the runner.
+ */
+static void RtemsTaskReqPerfSetSchedulerMove_Body(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ctx->status = rtems_task_set_scheduler(
+ RTEMS_SELF,
+ SCHEDULER_B_ID,
+ PRIO_NORMAL
+ );
+}
+
+static void RtemsTaskReqPerfSetSchedulerMove_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfSetSchedulerMove_Body( ctx );
+}
+
+/**
+ * @brief Discard samples interrupted by a clock tick.
+ */
+static bool RtemsTaskReqPerfSetSchedulerMove_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ SetSelfScheduler( SCHEDULER_A_ID, PRIO_NORMAL );
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfSetSchedulerMove_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfSetSchedulerMove_Teardown(
+ ctx,
+ delta,
+ tic,
+ toc,
+ retry
+ );
+}
+
+/**
+ * @brief Restore the runner affinity.
+ */
+static void RtemsTaskReqPerfSetSchedulerMove_Cleanup(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ SetSelfAffinityOne( 0 );
+}
+#endif
+
+/**
+ * @brief Set the scheduler of the runner.
+ */
+static void RtemsTaskReqPerfSetSchedulerNop_Body(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ctx->status = rtems_task_set_scheduler(
+ RTEMS_SELF,
+ SCHEDULER_A_ID,
+ PRIO_NORMAL
+ );
+}
+
+static void RtemsTaskReqPerfSetSchedulerNop_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfSetSchedulerNop_Body( ctx );
+}
+
+/**
+ * @brief Discard samples interrupted by a clock tick.
+ */
+static bool RtemsTaskReqPerfSetSchedulerNop_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfSetSchedulerNop_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfSetSchedulerNop_Teardown(
+ ctx,
+ delta,
+ tic,
+ toc,
+ retry
+ );
+}
+
+#if defined(RTEMS_SMP)
+/**
+ * @brief Create and start a worker task for scheduler B.
+ */
+static void RtemsTaskReqPerfSetSchedulerOther_Prepare(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_NORMAL );
+ SetScheduler( ctx->worker_id, SCHEDULER_B_ID, PRIO_NORMAL );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+/**
+ * @brief Move the worker to scheduler A.
+ */
+static void RtemsTaskReqPerfSetSchedulerOther_Body(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ctx->status = rtems_task_set_scheduler(
+ ctx->worker_id,
+ SCHEDULER_A_ID,
+ PRIO_LOW
+ );
+}
+
+static void RtemsTaskReqPerfSetSchedulerOther_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfSetSchedulerOther_Body( ctx );
+}
+
+/**
+ * @brief Move the worker back to scheduler B. Discard samples interrupted by
+ * a clock tick.
+ */
+static bool RtemsTaskReqPerfSetSchedulerOther_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ SetScheduler( ctx->worker_id, SCHEDULER_B_ID, PRIO_NORMAL );
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfSetSchedulerOther_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfSetSchedulerOther_Teardown(
+ ctx,
+ delta,
+ tic,
+ toc,
+ retry
+ );
+}
+
+/**
+ * @brief Delete the worker task.
+ */
+static void RtemsTaskReqPerfSetSchedulerOther_Cleanup(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ DeleteTask( ctx->worker_id );
+}
+#endif
+
+#if defined(RTEMS_SMP)
+/**
+ * @brief Create and start two worker tasks for scheduler B. Make the second
+ * worker busy.
+ */
+static void RtemsTaskReqPerfSetSchedulerPreempt_Prepare(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_NORMAL );
+ SetScheduler( ctx->worker_id, SCHEDULER_B_ID, PRIO_NORMAL );
+ StartTask( ctx->worker_id, Worker, ctx );
+ Send( ctx, EVENT_SET_END );
+ WaitForNextTask( 1, ctx->worker_id );
+
+ ctx->worker_2_id = CreateTask( "WRK2", PRIO_NORMAL );
+ SetScheduler( ctx->worker_2_id, SCHEDULER_B_ID, PRIO_HIGH );
+ StartTask( ctx->worker_2_id, Worker, ctx );
+ SendEvents( ctx->worker_2_id, EVENT_BUSY );
+ SuspendTask( ctx->worker_2_id );
+}
+
+/**
+ * @brief Move the worker to scheduler B. Make the worker ready to set the end
+ * time.
+ */
+static void RtemsTaskReqPerfSetSchedulerPreempt_Setup(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ResumeTask( ctx->worker_2_id );
+ SetScheduler( ctx->worker_id, SCHEDULER_B_ID, PRIO_NORMAL );
+ Send( ctx, EVENT_SET_END );
+}
+
+static void RtemsTaskReqPerfSetSchedulerPreempt_Setup_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfSetSchedulerPreempt_Setup( ctx );
+}
+
+/**
+ * @brief Move the worker to scheduler A.
+ */
+static void RtemsTaskReqPerfSetSchedulerPreempt_Body(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ctx->begin = T_tick();
+ ctx->status = rtems_task_set_scheduler(
+ ctx->worker_id,
+ SCHEDULER_A_ID,
+ PRIO_HIGH
+ );
+}
+
+static void RtemsTaskReqPerfSetSchedulerPreempt_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfSetSchedulerPreempt_Body( ctx );
+}
+
+/**
+ * @brief Set the measured runtime. Discard samples interrupted by a clock
+ * tick.
+ */
+static bool RtemsTaskReqPerfSetSchedulerPreempt_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ *delta = ctx->end - ctx->begin;
+ SuspendTask( ctx->worker_2_id );
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfSetSchedulerPreempt_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfSetSchedulerPreempt_Teardown(
+ ctx,
+ delta,
+ tic,
+ toc,
+ retry
+ );
+}
+
+/**
+ * @brief Delete the worker tasks.
+ */
+static void RtemsTaskReqPerfSetSchedulerPreempt_Cleanup(
+ RtemsTaskValPerf_Context *ctx
+)
+{
+ ResumeTask( ctx->worker_2_id );
+ DeleteTask( ctx->worker_2_id );
+ DeleteTask( ctx->worker_id );
+}
+#endif
+
+/**
+ * @brief Create a worker task.
+ */
+static void RtemsTaskReqPerfStart_Setup( RtemsTaskValPerf_Context *ctx )
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_LOW );
+}
+
+static void RtemsTaskReqPerfStart_Setup_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfStart_Setup( ctx );
+}
+
+/**
+ * @brief Start the worker task.
+ */
+static void RtemsTaskReqPerfStart_Body( RtemsTaskValPerf_Context *ctx )
+{
+ ctx->status = rtems_task_start(
+ ctx->worker_id,
+ Worker,
+ (rtems_task_argument) ctx
+ );
+}
+
+static void RtemsTaskReqPerfStart_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfStart_Body( ctx );
+}
+
+/**
+ * @brief Delete the worker. Discard samples interrupted by a clock tick.
+ */
+static bool RtemsTaskReqPerfStart_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ DeleteTask( ctx->worker_id );
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfStart_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfStart_Teardown( ctx, delta, tic, toc, retry );
+}
+
+/**
+ * @brief Create a worker task.
+ */
+static void RtemsTaskReqPerfStartPreempt_Setup( RtemsTaskValPerf_Context *ctx )
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_HIGH );
+}
+
+static void RtemsTaskReqPerfStartPreempt_Setup_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfStartPreempt_Setup( ctx );
+}
+
+/**
+ * @brief Start the worker task.
+ */
+static void RtemsTaskReqPerfStartPreempt_Body( RtemsTaskValPerf_Context *ctx )
+{
+ ctx->begin = T_tick();
+ ctx->status = rtems_task_start(
+ ctx->worker_id,
+ Worker,
+ (rtems_task_argument) ctx
+ );
+}
+
+static void RtemsTaskReqPerfStartPreempt_Body_Wrap( void *arg )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ RtemsTaskReqPerfStartPreempt_Body( ctx );
+}
+
+/**
+ * @brief Set the measured runtime. Delete the worker. Discard samples
+ * interrupted by a clock tick.
+ */
+static bool RtemsTaskReqPerfStartPreempt_Teardown(
+ RtemsTaskValPerf_Context *ctx,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ T_quiet_rsc_success( ctx->status );
+
+ *delta = ctx->end - ctx->begin;
+ DeleteTask( ctx->worker_id );
+
+ return tic == toc;
+}
+
+static bool RtemsTaskReqPerfStartPreempt_Teardown_Wrap(
+ void *arg,
+ T_ticks *delta,
+ uint32_t tic,
+ uint32_t toc,
+ unsigned int retry
+)
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = arg;
+ return RtemsTaskReqPerfStartPreempt_Teardown( ctx, delta, tic, toc, retry );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskValPerf( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskValPerf, &RtemsTaskValPerf_Fixture )
+{
+ RtemsTaskValPerf_Context *ctx;
+
+ ctx = T_fixture_context();
+
+ ctx->request.name = "RtemsTaskReqPerfConstruct";
+ ctx->request.setup = NULL;
+ ctx->request.body = RtemsTaskReqPerfConstruct_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfConstruct_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+
+ RtemsTaskReqPerfRestart_Prepare( ctx );
+ ctx->request.name = "RtemsTaskReqPerfRestart";
+ ctx->request.setup = NULL;
+ ctx->request.body = RtemsTaskReqPerfRestart_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfRestart_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+ RtemsTaskReqPerfRestart_Cleanup( ctx );
+
+ RtemsTaskReqPerfRestartPreempt_Prepare( ctx );
+ ctx->request.name = "RtemsTaskReqPerfRestartPreempt";
+ ctx->request.setup = NULL;
+ ctx->request.body = RtemsTaskReqPerfRestartPreempt_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfRestartPreempt_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+ RtemsTaskReqPerfRestartPreempt_Cleanup( ctx );
+
+ RtemsTaskReqPerfRestartSelf_Prepare( ctx );
+ ctx->request.name = "RtemsTaskReqPerfRestartSelf";
+ ctx->request.setup = NULL;
+ ctx->request.body = RtemsTaskReqPerfRestartSelf_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfRestartSelf_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+ RtemsTaskReqPerfRestartSelf_Cleanup( ctx );
+
+ #if defined(RTEMS_SMP)
+ RtemsTaskReqPerfSetSchedulerMove_Prepare( ctx );
+ ctx->request.name = "RtemsTaskReqPerfSetSchedulerMove";
+ ctx->request.setup = NULL;
+ ctx->request.body = RtemsTaskReqPerfSetSchedulerMove_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfSetSchedulerMove_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+ RtemsTaskReqPerfSetSchedulerMove_Cleanup( ctx );
+ #endif
+
+ ctx->request.name = "RtemsTaskReqPerfSetSchedulerNop";
+ ctx->request.setup = NULL;
+ ctx->request.body = RtemsTaskReqPerfSetSchedulerNop_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfSetSchedulerNop_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+
+ #if defined(RTEMS_SMP)
+ RtemsTaskReqPerfSetSchedulerOther_Prepare( ctx );
+ ctx->request.name = "RtemsTaskReqPerfSetSchedulerOther";
+ ctx->request.setup = NULL;
+ ctx->request.body = RtemsTaskReqPerfSetSchedulerOther_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfSetSchedulerOther_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+ RtemsTaskReqPerfSetSchedulerOther_Cleanup( ctx );
+ #endif
+
+ #if defined(RTEMS_SMP)
+ RtemsTaskReqPerfSetSchedulerPreempt_Prepare( ctx );
+ ctx->request.name = "RtemsTaskReqPerfSetSchedulerPreempt";
+ ctx->request.setup = RtemsTaskReqPerfSetSchedulerPreempt_Setup_Wrap;
+ ctx->request.body = RtemsTaskReqPerfSetSchedulerPreempt_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfSetSchedulerPreempt_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+ RtemsTaskReqPerfSetSchedulerPreempt_Cleanup( ctx );
+ #endif
+
+ ctx->request.name = "RtemsTaskReqPerfStart";
+ ctx->request.setup = RtemsTaskReqPerfStart_Setup_Wrap;
+ ctx->request.body = RtemsTaskReqPerfStart_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfStart_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+
+ ctx->request.name = "RtemsTaskReqPerfStartPreempt";
+ ctx->request.setup = RtemsTaskReqPerfStartPreempt_Setup_Wrap;
+ ctx->request.body = RtemsTaskReqPerfStartPreempt_Body_Wrap;
+ ctx->request.teardown = RtemsTaskReqPerfStartPreempt_Teardown_Wrap;
+ T_measure_runtime( ctx->context, &ctx->request );
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-restart.c b/testsuites/validation/tc-task-restart.c
new file mode 100644
index 0000000000..1c7528e961
--- /dev/null
+++ b/testsuites/validation/tc-task-restart.c
@@ -0,0 +1,2760 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqRestart
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <limits.h>
+#include <rtems.h>
+#include <setjmp.h>
+#include <rtems/test-scheduler.h>
+#include <rtems/score/statesimpl.h>
+#include <rtems/score/threaddispatch.h>
+#include <rtems/score/threadimpl.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqRestart spec:/rtems/task/req/restart
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_Id_Invalid,
+ RtemsTaskReqRestart_Pre_Id_Executing,
+ RtemsTaskReqRestart_Pre_Id_Other,
+ RtemsTaskReqRestart_Pre_Id_NA
+} RtemsTaskReqRestart_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_Dormant_Yes,
+ RtemsTaskReqRestart_Pre_Dormant_No,
+ RtemsTaskReqRestart_Pre_Dormant_NA
+} RtemsTaskReqRestart_Pre_Dormant;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_Suspended_Yes,
+ RtemsTaskReqRestart_Pre_Suspended_No,
+ RtemsTaskReqRestart_Pre_Suspended_NA
+} RtemsTaskReqRestart_Pre_Suspended;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_Restarting_Yes,
+ RtemsTaskReqRestart_Pre_Restarting_No,
+ RtemsTaskReqRestart_Pre_Restarting_NA
+} RtemsTaskReqRestart_Pre_Restarting;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_Terminating_Yes,
+ RtemsTaskReqRestart_Pre_Terminating_No,
+ RtemsTaskReqRestart_Pre_Terminating_NA
+} RtemsTaskReqRestart_Pre_Terminating;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_Protected_Yes,
+ RtemsTaskReqRestart_Pre_Protected_No,
+ RtemsTaskReqRestart_Pre_Protected_NA
+} RtemsTaskReqRestart_Pre_Protected;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_Context_Task,
+ RtemsTaskReqRestart_Pre_Context_Interrupt,
+ RtemsTaskReqRestart_Pre_Context_NestedRequest,
+ RtemsTaskReqRestart_Pre_Context_NA
+} RtemsTaskReqRestart_Pre_Context;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_State_Ready,
+ RtemsTaskReqRestart_Pre_State_Blocked,
+ RtemsTaskReqRestart_Pre_State_Enqueued,
+ RtemsTaskReqRestart_Pre_State_NA
+} RtemsTaskReqRestart_Pre_State;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_Timer_Inactive,
+ RtemsTaskReqRestart_Pre_Timer_Active,
+ RtemsTaskReqRestart_Pre_Timer_NA
+} RtemsTaskReqRestart_Pre_Timer;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_RealPriority_Initial,
+ RtemsTaskReqRestart_Pre_RealPriority_Changed,
+ RtemsTaskReqRestart_Pre_RealPriority_NA
+} RtemsTaskReqRestart_Pre_RealPriority;
+
+typedef enum {
+ RtemsTaskReqRestart_Pre_ThreadDispatch_Disabled,
+ RtemsTaskReqRestart_Pre_ThreadDispatch_Enabled,
+ RtemsTaskReqRestart_Pre_ThreadDispatch_NA
+} RtemsTaskReqRestart_Pre_ThreadDispatch;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_Status_InvId,
+ RtemsTaskReqRestart_Post_Status_IncStat,
+ RtemsTaskReqRestart_Post_Status_NoReturn,
+ RtemsTaskReqRestart_Post_Status_NA
+} RtemsTaskReqRestart_Post_Status;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_FatalError_Yes,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_FatalError_NA
+} RtemsTaskReqRestart_Post_FatalError;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_Argument_Nop,
+ RtemsTaskReqRestart_Post_Argument_NA
+} RtemsTaskReqRestart_Post_Argument;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_State_Dormant,
+ RtemsTaskReqRestart_Post_State_DormantSuspended,
+ RtemsTaskReqRestart_Post_State_Blocked,
+ RtemsTaskReqRestart_Post_State_Ready,
+ RtemsTaskReqRestart_Post_State_Zombie,
+ RtemsTaskReqRestart_Post_State_Nop,
+ RtemsTaskReqRestart_Post_State_NA
+} RtemsTaskReqRestart_Post_State;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_Enqueued_Yes,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Enqueued_NA
+} RtemsTaskReqRestart_Post_Enqueued;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_Timer_Active,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Timer_NA
+} RtemsTaskReqRestart_Post_Timer;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Restarting_No,
+ RtemsTaskReqRestart_Post_Restarting_NA
+} RtemsTaskReqRestart_Post_Restarting;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Terminating_NA
+} RtemsTaskReqRestart_Post_Terminating;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_Protected_NA
+} RtemsTaskReqRestart_Post_Protected;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_RestartExtensions_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA
+} RtemsTaskReqRestart_Post_RestartExtensions;
+
+typedef enum {
+ RtemsTaskReqRestart_Post_TerminateExtensions_Yes,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA
+} RtemsTaskReqRestart_Post_TerminateExtensions;
+
+typedef struct {
+ uint64_t Skip : 1;
+ uint64_t Pre_Id_NA : 1;
+ uint64_t Pre_Dormant_NA : 1;
+ uint64_t Pre_Suspended_NA : 1;
+ uint64_t Pre_Restarting_NA : 1;
+ uint64_t Pre_Terminating_NA : 1;
+ uint64_t Pre_Protected_NA : 1;
+ uint64_t Pre_Context_NA : 1;
+ uint64_t Pre_State_NA : 1;
+ uint64_t Pre_Timer_NA : 1;
+ uint64_t Pre_RealPriority_NA : 1;
+ uint64_t Pre_ThreadDispatch_NA : 1;
+ uint64_t Post_Status : 3;
+ uint64_t Post_FatalError : 2;
+ uint64_t Post_Argument : 2;
+ uint64_t Post_State : 3;
+ uint64_t Post_Enqueued : 2;
+ uint64_t Post_Timer : 2;
+ uint64_t Post_Restarting : 2;
+ uint64_t Post_Terminating : 2;
+ uint64_t Post_Protected : 2;
+ uint64_t Post_RestartExtensions : 2;
+ uint64_t Post_TerminateExtensions : 2;
+} RtemsTaskReqRestart_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/restart test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides the scheduler operation records.
+ */
+ T_scheduler_log_10 scheduler_log;
+
+ /**
+ * @brief This member provides a jump context to resume a thread dispatch.
+ */
+ jmp_buf thread_dispatch_context;;
+
+ /**
+ * @brief This member provides the context to wrap thread queue operations.
+ */
+ WrapThreadQueueContext wrap_tq_ctx;
+
+ /**
+ * @brief This member contains the identifier of the runner scheduler.
+ */
+ rtems_id scheduler_id;
+
+ /**
+ * @brief This member contains the identifier of the runner task.
+ */
+ rtems_id runner_id;
+
+ /**
+ * @brief This member contains the identifier of the mutex.
+ */
+ rtems_id mutex_id;
+
+ /**
+ * @brief This member provides an event set used to set up the blocking
+ * conditions of the task to restart.
+ */
+ rtems_event_set events;
+
+ /**
+ * @brief This member contains the identifier of the worker task.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief This member references the TCB of the worker task.
+ */
+ rtems_tcb *worker_tcb;
+
+ /**
+ * @brief This member contains the worker state at the end of the
+ * rtems_task_restart() call.
+ */
+ States_Control worker_state;
+
+ /**
+ * @brief This member contains the worker thread life state at the end of the
+ * rtems_task_restart() call.
+ */
+ Thread_Life_state worker_life_state;
+
+ /**
+ * @brief This member contains the identifier of the deleter task.
+ */
+ rtems_id deleter_id;
+
+ /**
+ * @brief This member references the TCB of the deleter task.
+ */
+ rtems_tcb *deleter_tcb;
+
+ /**
+ * @brief This member contains the identifier of the test user extensions.
+ */
+ rtems_id extension_id;
+
+ /**
+ * @brief This member contains extension calls.
+ */
+ ExtensionCalls calls;;
+
+ /**
+ * @brief This member contains extension calls after the rtems_task_restart()
+ * call.
+ */
+ ExtensionCalls calls_after_restart;;
+
+ /**
+ * @brief This member contains the actual argument passed to the entry point.
+ */
+ rtems_task_argument actual_argument;
+
+ /**
+ * @brief This member contains the restart counter.
+ */
+ uint32_t restart_counter;
+
+ /**
+ * @brief If this member is true, then the worker shall be dormant before the
+ * rtems_task_restart() call.
+ */
+ bool dormant;
+
+ /**
+ * @brief If this member is true, then the worker shall be suspended before
+ * the rtems_task_restart() call.
+ */
+ bool suspended;
+
+ /**
+ * @brief If this member is true, then the thread life of the worker shall be
+ * protected before the rtems_task_restart() call.
+ */
+ bool protected;
+
+ /**
+ * @brief If this member is true, then the worker shall be restarting before
+ * the rtems_task_restart() call.
+ */
+ bool restarting;
+
+ /**
+ * @brief If this member is true, then the worker shall be terminating before
+ * the rtems_task_restart() call.
+ */
+ bool terminating;
+
+ /**
+ * @brief If this member is true, then the rtems_task_restart() shall be
+ * called from within interrupt context.
+ */
+ bool interrupt;
+
+ /**
+ * @brief If this member is true, then the rtems_task_restart() shall be
+ * called during another rtems_task_restart() call with the same task as a
+ * nested request.
+ */
+ bool nested_request;
+
+ /**
+ * @brief If this member is true, then the worker shall be blocked before the
+ * rtems_task_restart() call.
+ */
+ bool blocked;
+
+ /**
+ * @brief If this member is true, then the worker shall be enqueued on a wait
+ * queue before the rtems_task_restart() call.
+ */
+ bool enqueued;
+
+ /**
+ * @brief If this member is true, then the timer of the worker shall be
+ * active before the rtems_task_restart() call.
+ */
+ bool timer_active;
+
+ /**
+ * @brief If this member is true, then the real priority of the worker shall
+ * be equal to its initial priority before the rtems_task_restart() call.
+ */
+ bool real_priority_is_initial;
+
+ /**
+ * @brief If this member is true, then thread dispatching is disabled by the
+ * worker task before the rtems_task_restart() call.
+ */
+ bool dispatch_disabled;
+
+ /**
+ * @brief If this member is true, then it is expected to delete the worker.
+ */
+ bool delete_worker_expected;
+
+ /**
+ * @brief This member contains the return value of the rtems_task_restart()
+ * call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 11 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 11 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqRestart_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqRestart_Context;
+
+static RtemsTaskReqRestart_Context
+ RtemsTaskReqRestart_Instance;
+
+static const char * const RtemsTaskReqRestart_PreDesc_Id[] = {
+ "Invalid",
+ "Executing",
+ "Other",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_Dormant[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_Suspended[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_Restarting[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_Terminating[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_Protected[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_Context[] = {
+ "Task",
+ "Interrupt",
+ "NestedRequest",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_State[] = {
+ "Ready",
+ "Blocked",
+ "Enqueued",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_Timer[] = {
+ "Inactive",
+ "Active",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_RealPriority[] = {
+ "Initial",
+ "Changed",
+ "NA"
+};
+
+static const char * const RtemsTaskReqRestart_PreDesc_ThreadDispatch[] = {
+ "Disabled",
+ "Enabled",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqRestart_PreDesc[] = {
+ RtemsTaskReqRestart_PreDesc_Id,
+ RtemsTaskReqRestart_PreDesc_Dormant,
+ RtemsTaskReqRestart_PreDesc_Suspended,
+ RtemsTaskReqRestart_PreDesc_Restarting,
+ RtemsTaskReqRestart_PreDesc_Terminating,
+ RtemsTaskReqRestart_PreDesc_Protected,
+ RtemsTaskReqRestart_PreDesc_Context,
+ RtemsTaskReqRestart_PreDesc_State,
+ RtemsTaskReqRestart_PreDesc_Timer,
+ RtemsTaskReqRestart_PreDesc_RealPriority,
+ RtemsTaskReqRestart_PreDesc_ThreadDispatch,
+ NULL
+};
+
+#if CPU_SIZEOF_POINTER > 4
+#define RESTART_ARGUMENT 0xfedcba0987654321U
+#else
+#define RESTART_ARGUMENT 0x87654321U
+#endif
+
+#define UNSET_ARGUMENT 1
+
+typedef RtemsTaskReqRestart_Context Context;
+
+static void PrepareRealPriority( Context *ctx )
+{
+ if ( !ctx->real_priority_is_initial ) {
+ SetScheduler( ctx->worker_id, ctx->scheduler_id, PRIO_LOW );
+ SetPriority( ctx->worker_id, PRIO_NORMAL );
+ }
+}
+
+static void CaptureWorkerState( Context *ctx )
+{
+ T_scheduler_log *log;
+
+ log = T_scheduler_record( NULL );
+
+ if ( log != NULL ) {
+ T_eq_ptr( &log->header, &ctx->scheduler_log.header );
+
+ ctx->worker_state = ctx->worker_tcb->current_state;
+ ctx->worker_life_state = ctx->worker_tcb->Life.state;
+ CopyExtensionCalls( &ctx->calls, &ctx->calls_after_restart );
+ }
+}
+
+static void VerifyTaskPreparation( const Context *ctx )
+{
+ if ( ctx->id != INVALID_ID ) {
+ States_Control state;
+ Thread_Life_state life_state;
+
+ state = STATES_READY;
+ life_state = ctx->worker_tcb->Life.state;
+
+ if ( ctx->suspended ) {
+ state |= STATES_SUSPENDED;
+ }
+
+ if ( ctx->dormant ) {
+ T_eq_int( life_state, 0 );
+ state |= STATES_DORMANT;
+ } else {
+ T_eq( ctx->protected, ( life_state & THREAD_LIFE_PROTECTED ) != 0 );
+ T_eq( ctx->restarting, ( life_state & THREAD_LIFE_RESTARTING ) != 0 );
+ T_eq( ctx->terminating, ( life_state & THREAD_LIFE_TERMINATING ) != 0 );
+
+ if ( ctx->blocked ) {
+ if ( ctx->enqueued ) {
+ state |= STATES_WAITING_FOR_MUTEX;
+ } else {
+ state |= STATES_WAITING_FOR_EVENT;
+ }
+ }
+
+ if ( ctx->nested_request ) {
+ state |= STATES_LIFE_IS_CHANGING;
+ }
+ }
+
+ T_eq_u32( ctx->worker_tcb->current_state, state );
+ }
+}
+
+static void Restart( void *arg )
+{
+ Context *ctx;
+ T_scheduler_log *log;
+
+ ctx = arg;
+
+ if ( ctx->suspended && ctx->id != INVALID_ID ) {
+ if ( ctx->id != RTEMS_SELF || ctx->interrupt ) {
+ SuspendTask( ctx->worker_id );
+ } else {
+ Per_CPU_Control *cpu_self;
+
+ /*
+ * Where the system was built with SMP support enabled, a suspended
+ * executing thread during the rtems_task_restart() call can happen
+ * if the thread was suspended by another processor and the
+ * inter-processor interrupt did not yet arrive. Where the system was
+ * built with SMP support disabled, this state cannot happen with the
+ * current implementation. However, we still specify and validate this
+ * behaviour unconditionally since there exist alternative
+ * implementations which would lead to such a state if the executing
+ * thread is suspended by an ISR.
+ */
+ cpu_self = _Thread_Dispatch_disable();
+ SuspendSelf();
+ cpu_self->dispatch_necessary = false;
+ _Thread_Dispatch_enable( cpu_self );
+ }
+ }
+
+ if ( ctx->dispatch_disabled ) {
+ _Thread_Dispatch_disable();
+ }
+
+ VerifyTaskPreparation( ctx );
+ ClearExtensionCalls( &ctx->calls );
+
+ log = T_scheduler_record_10( &ctx->scheduler_log );
+ T_null( log );
+
+ ctx->status = rtems_task_restart( ctx->id, RESTART_ARGUMENT );
+
+ CaptureWorkerState( ctx );
+
+ if ( ctx->dispatch_disabled ) {
+ _Thread_Dispatch_enable( _Per_CPU_Get() );
+ }
+}
+
+static void Block( Context *ctx )
+{
+ rtems_interval ticks;
+
+ if ( ctx->timer_active ) {
+ ticks = UINT32_MAX;
+ } else {
+ ticks = RTEMS_NO_TIMEOUT;
+ }
+
+ if ( ctx->enqueued ) {
+ ObtainMutexTimed( ctx->mutex_id, ticks );
+ } else {
+ /*
+ * Do not use a stack variable for the event set, since we may jump out
+ * of the directive call.
+ */
+ (void) rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_EVENT_ANY | RTEMS_WAIT,
+ ticks,
+ &ctx->events
+ );
+ }
+}
+
+static void BlockDone( const Context *ctx )
+{
+ if ( ctx->enqueued ) {
+ ReleaseMutex( ctx->mutex_id );
+ }
+}
+
+static void Fatal(
+ rtems_fatal_source source,
+ rtems_fatal_code code,
+ void *arg
+)
+{
+ Context *ctx;
+ Per_CPU_Control *cpu_self;
+
+ T_eq_int( source, INTERNAL_ERROR_CORE );
+ T_eq_ulong( code, INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL );
+
+ ctx = arg;
+ ++ctx->calls.fatal;
+ T_assert_eq_int( ctx->calls.fatal, 1 );
+
+ CaptureWorkerState( ctx );
+
+ cpu_self = _Per_CPU_Get();
+ _Thread_Dispatch_unnest( cpu_self );
+ _Thread_Dispatch_direct_no_return( cpu_self );
+}
+
+static void ResumeThreadDispatch(
+ rtems_fatal_source source,
+ rtems_fatal_code code,
+ void *arg
+)
+{
+ Context *ctx;
+
+ T_eq_int( source, INTERNAL_ERROR_CORE );
+ T_eq_ulong( code, INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL );
+
+ ctx = arg;
+ SetFatalHandler( Fatal, ctx );
+ longjmp( ctx->thread_dispatch_context, 1 );
+}
+
+static void TriggerNestedRequestViaSelfRestart(
+ Context *ctx,
+ Per_CPU_Control *cpu_self
+)
+{
+ WrapThreadQueueExtract( &ctx->wrap_tq_ctx, ctx->worker_tcb );
+ SetFatalHandler( ResumeThreadDispatch, ctx );
+
+ if ( setjmp( ctx->thread_dispatch_context ) == 0 ) {
+ (void) rtems_task_restart(
+ RTEMS_SELF,
+ (rtems_task_argument) ctx
+ );
+ } else {
+ _Thread_Dispatch_unnest( cpu_self );
+ }
+}
+
+static void Signal( rtems_signal_set signals )
+{
+ Context *ctx;
+
+ (void) signals;
+ ctx = T_fixture_context();
+
+ if ( ctx->id == RTEMS_SELF ) {
+ Per_CPU_Control *cpu_self;
+
+ SetPriority( ctx->runner_id, PRIO_VERY_LOW );
+ SetPriority( ctx->deleter_id, PRIO_VERY_LOW );
+
+ if ( ctx->interrupt || ctx->nested_request ) {
+ if ( ctx->blocked ) {
+ SetFatalHandler( ResumeThreadDispatch, ctx );
+ cpu_self = _Thread_Dispatch_disable();
+
+ if ( setjmp( ctx->thread_dispatch_context ) == 0 ) {
+ Block( ctx );
+ } else {
+ _Thread_Dispatch_unnest( cpu_self );
+ }
+
+ if ( ctx->interrupt ) {
+ CallWithinISR( Restart, ctx );
+ } else {
+ TriggerNestedRequestViaSelfRestart( ctx, cpu_self );
+ }
+
+ _Thread_Dispatch_direct( cpu_self );
+ BlockDone( ctx );
+ } else {
+ if ( ctx->interrupt ) {
+ CallWithinISR( Restart, ctx );
+ } else {
+ cpu_self = _Thread_Dispatch_disable();
+ TriggerNestedRequestViaSelfRestart( ctx, cpu_self );
+ _Thread_Dispatch_direct( cpu_self );
+ }
+ }
+ } else {
+ Restart( ctx );
+ }
+ } else {
+ if ( ctx->blocked ) {
+ Block( ctx );
+ BlockDone( ctx );
+ } else if ( ctx->nested_request ) {
+ Yield();
+ } else {
+ SetPriority( ctx->runner_id, PRIO_VERY_HIGH );
+ }
+ }
+
+ if ( ctx->protected ) {
+ _Thread_Set_life_protection( 0 );
+ }
+}
+
+static void Deleter( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = (Context *) arg;
+
+ if ( ctx != NULL ) {
+ if ( ctx->real_priority_is_initial ) {
+ /*
+ * We have to prevent a potential priority boost in the task delete
+ * below.
+ */
+ if ( ctx->nested_request ) {
+ /* Lower the priority to PRIO_NORMAL without an * implicit yield */
+ SetSelfPriorityNoYield( PRIO_NORMAL );
+ } else {
+ SetScheduler( ctx->worker_id, ctx->scheduler_id, PRIO_HIGH );
+ }
+ }
+
+ if ( ctx->nested_request ) {
+ WrapThreadQueueExtract( &ctx->wrap_tq_ctx, ctx->worker_tcb );
+ DeleteTask( ctx->worker_id );
+ } else {
+ DeleteTask( ctx->worker_id );
+ }
+ }
+
+ SuspendSelf();
+}
+
+static void Worker( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_status_code sc;
+
+ ctx = T_fixture_context();
+
+ if ( arg == 0 ) {
+ sc = rtems_signal_catch( Signal, RTEMS_NO_ASR );
+ T_rsc_success( sc );
+
+ if ( ctx->protected ) {
+ _Thread_Set_life_protection( THREAD_LIFE_PROTECTED );
+ }
+
+ Yield();
+ } else {
+ ctx->actual_argument = arg;
+ ++ctx->restart_counter;
+
+ CaptureWorkerState( ctx );
+ SuspendSelf();
+ }
+}
+
+static void ThreadDelete( rtems_tcb *executing, rtems_tcb *deleted )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->calls.thread_delete;
+
+ T_eq_u32( executing->Object.id, ctx->runner_id );
+
+ if ( ctx->delete_worker_expected ) {
+ T_eq_u32( deleted->Object.id, ctx->worker_id );
+ }
+}
+
+static void ThreadRestart( rtems_tcb *executing, rtems_tcb *restarted )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->calls.thread_restart;
+}
+
+static void ThreadTerminate( rtems_tcb *executing )
+{
+ Context *ctx;
+
+ ctx = T_fixture_context();
+ ++ctx->calls.thread_terminate;
+
+ T_eq_u32( executing->Object.id, ctx->worker_id );
+}
+
+static const rtems_extensions_table extensions = {
+ .thread_delete = ThreadDelete,
+ .thread_restart = ThreadRestart,
+ .thread_terminate = ThreadTerminate
+};
+
+static void RtemsTaskReqRestart_Pre_Id_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Id_Executing: {
+ /*
+ * While the ``id`` parameter is associated with the calling task.
+ */
+ ctx->id = RTEMS_SELF;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Id_Other: {
+ /*
+ * While the ``id`` parameter is associated with a task other than the
+ * calling task.
+ */
+ ctx->id = ctx->worker_id;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_Dormant_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_Dormant state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_Dormant_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is dormant.
+ */
+ ctx->dormant = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Dormant_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not dormant.
+ */
+ ctx->dormant = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Dormant_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_Suspended_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_Suspended state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_Suspended_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is suspended.
+ */
+ ctx->suspended = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Suspended_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not suspended.
+ */
+ ctx->suspended = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Suspended_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_Restarting_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_Restarting state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_Restarting_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is restarting.
+ */
+ ctx->restarting = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Restarting_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not restarting.
+ */
+ ctx->restarting = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Restarting_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_Terminating_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_Terminating state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_Terminating_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is terminating.
+ */
+ ctx->terminating = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Terminating_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not terminating.
+ */
+ ctx->terminating = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Terminating_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_Protected_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_Protected state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_Protected_Yes: {
+ /*
+ * While thread life of the task specified by the ``id`` parameter is
+ * protected.
+ */
+ ctx->protected = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Protected_No: {
+ /*
+ * While thread life of the task specified by the ``id`` parameter is not
+ * protected.
+ */
+ ctx->protected = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Protected_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_Context_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_Context state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_Context_Task: {
+ /*
+ * While the rtems_task_restart() directive is called from within task
+ * context.
+ */
+ ctx->interrupt = false;
+ ctx->nested_request = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Context_Interrupt: {
+ /*
+ * While the rtems_task_restart() directive is called from within
+ * interrupt context.
+ */
+ ctx->interrupt = true;
+ ctx->nested_request = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Context_NestedRequest: {
+ /*
+ * While the rtems_task_restart() directive is called during another
+ * rtems_task_restart() call with the same task as a nested request.
+ */
+ ctx->interrupt = false;
+ ctx->nested_request = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Context_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_State_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_State state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_State_Ready: {
+ /*
+ * While the task specified by the ``id`` parameter is a ready task or
+ * scheduled task.
+ */
+ ctx->blocked = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_State_Blocked: {
+ /*
+ * While the task specified by the ``id`` parameter is blocked.
+ */
+ ctx->blocked = true;
+ ctx->enqueued = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_State_Enqueued: {
+ /*
+ * While the task specified by the ``id`` parameter is enqueued on a wait
+ * queue.
+ */
+ ctx->blocked = true;
+ ctx->enqueued = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_State_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_Timer_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_Timer state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_Timer_Inactive: {
+ /*
+ * While timer of the task specified by the ``id`` parameter is inactive.
+ */
+ ctx->timer_active = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Timer_Active: {
+ /*
+ * While timer of the task specified by the ``id`` parameter is active.
+ */
+ ctx->timer_active = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_Timer_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_RealPriority_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_RealPriority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_RealPriority_Initial: {
+ /*
+ * While real priority of the task specified by the ``id`` parameter is
+ * equal to the initial priority.
+ */
+ ctx->real_priority_is_initial = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_RealPriority_Changed: {
+ /*
+ * While real priority of the task specified by the ``id`` parameter is
+ * not equal to the initial priority.
+ */
+ ctx->real_priority_is_initial = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_RealPriority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Pre_ThreadDispatch_Prepare(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Pre_ThreadDispatch state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Pre_ThreadDispatch_Disabled: {
+ /*
+ * While thread dispatching is disabled for the calling task.
+ */
+ ctx->dispatch_disabled = true;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_ThreadDispatch_Enabled: {
+ /*
+ * While thread dispatching is enabled for the calling task.
+ */
+ ctx->dispatch_disabled = false;
+ break;
+ }
+
+ case RtemsTaskReqRestart_Pre_ThreadDispatch_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_Status_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_restart() shall be RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_restart() shall be RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Status_IncStat: {
+ /*
+ * The return status of rtems_task_restart() shall be
+ * RTEMS_INCORRECT_STATE.
+ */
+ T_rsc( ctx->status, RTEMS_INCORRECT_STATE );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Status_NoReturn: {
+ /*
+ * The rtems_task_restart() call shall not return.
+ */
+ T_rsc( ctx->status, RTEMS_NOT_IMPLEMENTED );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_FatalError_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_FatalError state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_FatalError_Yes: {
+ /*
+ * The fatal error with a fatal source of INTERNAL_ERROR_CORE and a fatal
+ * code of INTERNAL_ERROR_BAD_THREAD_DISPATCH_DISABLE_LEVEL shall occur
+ * through the rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->calls.fatal, 1 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_FatalError_Nop: {
+ /*
+ * No fatal error shall occur through the rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->calls.fatal, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_FatalError_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_Argument_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_Argument state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_Argument_Set: {
+ /*
+ * The entry point argument of the task specified by the ``id`` parameter
+ * shall be set to the value specified by the ``argument`` parameter
+ * before the task is unblocked by the rtems_task_restart() call.
+ */
+ if ( ctx->restart_counter != 0 ) {
+ #if CPU_SIZEOF_POINTER > 4
+ T_eq_u64( ctx->actual_argument, RESTART_ARGUMENT );
+ #else
+ T_eq_u32( ctx->actual_argument, RESTART_ARGUMENT );
+ #endif
+
+ T_eq_u32( ctx->restart_counter, 1 );
+ } else {
+ #if CPU_SIZEOF_POINTER > 4
+ T_eq_u64(
+ ctx->worker_tcb->Start.Entry.Kinds.Numeric.argument,
+ RESTART_ARGUMENT
+ );
+ T_eq_u64( ctx->actual_argument, UNSET_ARGUMENT );
+ #else
+ T_eq_u32(
+ ctx->worker_tcb->Start.Entry.Kinds.Numeric.argument,
+ RESTART_ARGUMENT
+ );
+ T_eq_u32( ctx->actual_argument, UNSET_ARGUMENT );
+ #endif
+ }
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Argument_Nop: {
+ /*
+ * No entry point argument of a task shall be modified by the
+ * rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->actual_argument, UNSET_ARGUMENT );
+ T_eq_u32( ctx->restart_counter, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Argument_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_State_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_State state
+)
+{
+ const T_scheduler_event *event;
+ size_t index;
+
+ index = 0;
+
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_State_Dormant: {
+ /*
+ * The state of the task specified by the ``id`` parameter shall be
+ * dormant after the rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->worker_state, STATES_DORMANT )
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_NOP );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_State_DormantSuspended: {
+ /*
+ * The state of the task specified by the ``id`` parameter shall be
+ * dormant and suspended after the rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->worker_state, STATES_DORMANT | STATES_SUSPENDED )
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_NOP );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_State_Blocked: {
+ /*
+ * The state of the task specified by the ``id`` parameter shall be
+ * blocked after the rtems_task_restart() call.
+ */
+ T_ne_u32( ctx->worker_state & STATES_BLOCKED, 0 )
+ T_eq_u32( ctx->worker_state & STATES_BLOCKED, ctx->worker_state )
+
+ if ( ctx->suspended && !ctx->blocked ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UNBLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ }
+
+ if ( !ctx->real_priority_is_initial ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UPDATE_PRIORITY );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ }
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_NOP );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_State_Ready: {
+ /*
+ * The state of the task specified by the ``id`` parameter shall be ready
+ * after the rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->worker_state, STATES_READY )
+
+ if ( ctx->protected ) {
+ if ( ctx->suspended ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UNBLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ }
+ } else {
+ if ( ctx->suspended || ctx->blocked ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UNBLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ } else {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_BLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UNBLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ }
+ }
+
+ if ( !ctx->real_priority_is_initial ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UPDATE_PRIORITY );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ }
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_NOP );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_State_Zombie: {
+ /*
+ * The state of the task specified by the ``id`` parameter shall be the
+ * zombie state after the rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->worker_state, STATES_ZOMBIE )
+
+ if ( ctx->protected ) {
+ if ( ctx->suspended ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UNBLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ }
+ } else {
+ if ( ctx->suspended ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UNBLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ } else {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_BLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UNBLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ }
+ }
+
+ if ( !ctx->real_priority_is_initial ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UPDATE_PRIORITY );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ }
+
+ /* Set zombie state */
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_BLOCK );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+
+ /* Wake up deleter */
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UNBLOCK );
+ T_eq_ptr( event->thread, ctx->deleter_tcb );
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_NOP );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_State_Nop: {
+ /*
+ * The state of the task specified by the ``id`` parameter shall not be
+ * modified by the rtems_task_restart() call.
+ */
+ T_ne_u32( ctx->worker_state & STATES_LIFE_IS_CHANGING, 0 )
+
+ if ( !ctx->real_priority_is_initial ) {
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_UPDATE_PRIORITY );
+ T_eq_ptr( event->thread, ctx->worker_tcb );
+ }
+
+ event = T_scheduler_next_any( &ctx->scheduler_log.header, &index );
+ T_eq_int( event->operation, T_SCHEDULER_NOP );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_State_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_Enqueued_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_Enqueued state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_Enqueued_Yes: {
+ /*
+ * The task specified by the ``id`` parameter shall be enqueued on a wait
+ * queue after the rtems_task_restart() call.
+ */
+ T_not_null( ctx->worker_tcb->Wait.queue );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Enqueued_No: {
+ /*
+ * The task specified by the ``id`` parameter shall not be enqueued on a
+ * wait queue after the rtems_task_restart() call.
+ */
+ T_null( ctx->worker_tcb->Wait.queue );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Enqueued_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_Timer_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_Timer state
+)
+{
+ TaskTimerInfo info;
+
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_Timer_Active: {
+ /*
+ * The timer of the task specified by the ``id`` parameter shall be
+ * active after the rtems_task_restart() call.
+ */
+ GetTaskTimerInfoByThread( ctx->worker_tcb, &info);
+ T_eq_int( info.state, TASK_TIMER_TICKS );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Timer_Inactive: {
+ /*
+ * The timer of the task specified by the ``id`` parameter shall be
+ * inactive after the rtems_task_restart() call.
+ */
+ GetTaskTimerInfoByThread( ctx->worker_tcb, &info);
+ T_eq_int( info.state, TASK_TIMER_INACTIVE );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Timer_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_Restarting_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_Restarting state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_Restarting_Yes: {
+ /*
+ * The task specified by the ``id`` parameter shall be restarting after
+ * the rtems_task_restart() call.
+ */
+ T_ne_int( ctx->worker_life_state & THREAD_LIFE_RESTARTING, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Restarting_No: {
+ /*
+ * The task specified by the ``id`` parameter shall not be restarting
+ * after the rtems_task_restart() call.
+ */
+ T_eq_int( ctx->worker_life_state & THREAD_LIFE_RESTARTING, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Restarting_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_Terminating_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_Terminating state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_Terminating_Yes: {
+ /*
+ * The task specified by the ``id`` parameter shall be terminating after
+ * the rtems_task_restart() call.
+ */
+ T_ne_int( ctx->worker_life_state & THREAD_LIFE_TERMINATING, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Terminating_No: {
+ /*
+ * The task specified by the ``id`` parameter shall not be terminating
+ * after the rtems_task_restart() call.
+ */
+ T_eq_int( ctx->worker_life_state & THREAD_LIFE_TERMINATING, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Terminating_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_Protected_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_Protected state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_Protected_Yes: {
+ /*
+ * The thread life of the task specified by the ``id`` parameter be
+ * protected after the rtems_task_restart() call.
+ */
+ T_ne_int( ctx->worker_life_state & THREAD_LIFE_PROTECTED, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Protected_No: {
+ /*
+ * The thread life of the task specified by the ``id`` parameter shall
+ * not be protected after the rtems_task_restart() call.
+ */
+ T_eq_int( ctx->worker_life_state & THREAD_LIFE_PROTECTED, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_Protected_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_RestartExtensions_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_RestartExtensions state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_RestartExtensions_Yes: {
+ /*
+ * The thread restart user extensions shall be invoked by the
+ * rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->calls_after_restart.thread_restart, 1 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_RestartExtensions_Nop: {
+ /*
+ * The thread restart user extensions shall not be invoked by the
+ * rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->calls_after_restart.thread_restart, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_RestartExtensions_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Post_TerminateExtensions_Check(
+ RtemsTaskReqRestart_Context *ctx,
+ RtemsTaskReqRestart_Post_TerminateExtensions state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqRestart_Post_TerminateExtensions_Yes: {
+ /*
+ * The thread terminate user extensions shall be invoked by the
+ * rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->calls_after_restart.thread_terminate, 1 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_TerminateExtensions_Nop: {
+ /*
+ * The thread terminate user extensions shall not be invoked by the
+ * rtems_task_restart() call.
+ */
+ T_eq_u32( ctx->calls_after_restart.thread_terminate, 0 );
+ break;
+ }
+
+ case RtemsTaskReqRestart_Post_TerminateExtensions_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqRestart_Setup( RtemsTaskReqRestart_Context *ctx )
+{
+ rtems_status_code sc;
+
+ ctx->runner_id = rtems_task_self();
+ ctx->scheduler_id = GetSelfScheduler();
+ ctx->mutex_id = CreateMutexNoProtocol();
+ ObtainMutex( ctx->mutex_id );
+ WrapThreadQueueInitialize( &ctx->wrap_tq_ctx, Restart, ctx );
+
+ sc = rtems_extension_create(
+ rtems_build_name( 'T', 'E', 'S', 'T' ),
+ &extensions,
+ &ctx->extension_id
+ );
+ T_rsc_success( sc );
+
+ SetFatalHandler( Fatal, ctx );
+ SetSelfPriority( PRIO_NORMAL );
+
+ ctx->deleter_id = CreateTask( "DELE", PRIO_HIGH );
+ ctx->deleter_tcb = GetThread( ctx->deleter_id );
+ StartTask( ctx->deleter_id, Deleter, NULL );
+}
+
+static void RtemsTaskReqRestart_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqRestart_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqRestart_Setup( ctx );
+}
+
+static void RtemsTaskReqRestart_Teardown( RtemsTaskReqRestart_Context *ctx )
+{
+ rtems_status_code sc;
+
+ sc = rtems_extension_delete( ctx->extension_id );
+ T_rsc_success( sc );
+
+ SetFatalHandler( NULL, NULL );
+ DeleteTask( ctx->deleter_id );
+ ReleaseMutex( ctx->mutex_id );
+ DeleteMutex( ctx->mutex_id );
+ RestoreRunnerASR();
+ RestoreRunnerPriority();
+ WrapThreadQueueDestroy( &ctx->wrap_tq_ctx );
+}
+
+static void RtemsTaskReqRestart_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqRestart_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqRestart_Teardown( ctx );
+}
+
+static void RtemsTaskReqRestart_Prepare( RtemsTaskReqRestart_Context *ctx )
+{
+ ctx->status = RTEMS_NOT_IMPLEMENTED;
+ ctx->actual_argument = UNSET_ARGUMENT;
+ ctx->restart_counter = 0;
+
+ ctx->delete_worker_expected = false;
+ ctx->worker_id = CreateTask( "WORK", PRIO_NORMAL );
+ ctx->delete_worker_expected = true;
+
+ ctx->worker_tcb = GetThread( ctx->worker_id );
+ ctx->worker_state = UINT32_MAX;
+ ctx->worker_life_state = INT_MAX;
+
+ SetPriority( ctx->deleter_id, PRIO_HIGH );
+}
+
+static void RtemsTaskReqRestart_Action( RtemsTaskReqRestart_Context *ctx )
+{
+ rtems_status_code sc;
+
+ if ( ctx->id != INVALID_ID ) {
+ if ( ctx->dormant ) {
+ PrepareRealPriority( ctx );
+ } else {
+ StartTask( ctx->worker_id, Worker, NULL );
+
+ /* Let the worker catch signals and set the thread life protection state */
+ Yield();
+
+ sc = rtems_signal_send( ctx->worker_id, RTEMS_SIGNAL_0 );
+ T_rsc_success( sc );
+
+ if (
+ ctx->restarting &&
+ ( !ctx->nested_request || ( ctx->nested_request && ctx->terminating ) )
+ ) {
+ sc = rtems_task_restart( ctx->worker_id, (rtems_task_argument) ctx );
+ T_rsc_success( sc );
+ }
+
+ if ( ctx->terminating && !ctx->nested_request ) {
+ sc = rtems_task_restart( ctx->deleter_id, (rtems_task_argument) ctx );
+ T_rsc_success( sc );
+ } else {
+ PrepareRealPriority( ctx );
+ Yield();
+ }
+ }
+ }
+
+ if ( ctx->id == RTEMS_SELF ) {
+ CaptureWorkerState( ctx );
+ } else {
+ if ( ctx->nested_request ) {
+ if ( ctx->terminating ) {
+ sc = rtems_task_restart( ctx->deleter_id, (rtems_task_argument) ctx );
+ T_rsc_success( sc );
+ } else {
+ WrapThreadQueueExtract( &ctx->wrap_tq_ctx, ctx->worker_tcb );
+
+ sc = rtems_task_restart( ctx->worker_id, (rtems_task_argument) ctx );
+ T_rsc_success( sc );
+ }
+ } else {
+ SetSelfPriority( PRIO_VERY_HIGH );
+
+ if ( ctx->interrupt ) {
+ CallWithinISR( Restart, ctx );
+ } else {
+ Restart( ctx );
+ }
+ }
+ }
+}
+
+static void RtemsTaskReqRestart_Cleanup( RtemsTaskReqRestart_Context *ctx )
+{
+ SetSelfPriority( PRIO_VERY_LOW );
+
+ if ( ctx->protected && ctx->blocked ) {
+ if ( ctx->enqueued ) {
+ ReleaseMutex( ctx->mutex_id );
+ ObtainMutex( ctx->mutex_id );
+ } else {
+ SendEvents( ctx->worker_id, RTEMS_EVENT_0 );
+ }
+ }
+
+ if ( ctx->id == INVALID_ID || ctx->dormant || !ctx->terminating ) {
+ DeleteTask( ctx->worker_id );
+ }
+
+ SetSelfPriority( PRIO_NORMAL );
+}
+
+static const RtemsTaskReqRestart_Entry
+RtemsTaskReqRestart_Entries[] = {
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA,
+ RtemsTaskReqRestart_Post_FatalError_NA,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA },
+ { 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, RtemsTaskReqRestart_Post_Status_InvId,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA,
+ RtemsTaskReqRestart_Post_FatalError_NA,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA,
+ RtemsTaskReqRestart_Post_FatalError_NA,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA,
+ RtemsTaskReqRestart_Post_FatalError_NA,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA,
+ RtemsTaskReqRestart_Post_FatalError_NA,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA,
+ RtemsTaskReqRestart_Post_FatalError_NA,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA },
+ { 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0,
+ RtemsTaskReqRestart_Post_Status_IncStat,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Nop,
+ RtemsTaskReqRestart_Post_State_DormantSuspended,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_No,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0,
+ RtemsTaskReqRestart_Post_Status_IncStat,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Nop,
+ RtemsTaskReqRestart_Post_State_Dormant,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_No,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA,
+ RtemsTaskReqRestart_Post_FatalError_NA,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA,
+ RtemsTaskReqRestart_Post_FatalError_NA,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA },
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_NA,
+ RtemsTaskReqRestart_Post_FatalError_NA,
+ RtemsTaskReqRestart_Post_Argument_NA, RtemsTaskReqRestart_Post_State_NA,
+ RtemsTaskReqRestart_Post_Enqueued_NA, RtemsTaskReqRestart_Post_Timer_NA,
+ RtemsTaskReqRestart_Post_Restarting_NA,
+ RtemsTaskReqRestart_Post_Terminating_NA,
+ RtemsTaskReqRestart_Post_Protected_NA,
+ RtemsTaskReqRestart_Post_RestartExtensions_NA,
+ RtemsTaskReqRestart_Post_TerminateExtensions_NA },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Nop,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set, RtemsTaskReqRestart_Post_State_Nop,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Blocked,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Blocked,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Active,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Blocked,
+ RtemsTaskReqRestart_Post_Enqueued_Yes,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Blocked,
+ RtemsTaskReqRestart_Post_Enqueued_Yes,
+ RtemsTaskReqRestart_Post_Timer_Active,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Blocked,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Blocked,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Active,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Blocked,
+ RtemsTaskReqRestart_Post_Enqueued_Yes,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqRestart_Post_Status_Ok,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Blocked,
+ RtemsTaskReqRestart_Post_Enqueued_Yes,
+ RtemsTaskReqRestart_Post_Timer_Active,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqRestart_Post_Status_NoReturn,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Zombie,
+ RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Yes },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqRestart_Post_Status_NoReturn,
+ RtemsTaskReqRestart_Post_FatalError_Nop,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_No,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_RestartExtensions_Yes,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqRestart_Post_Status_NoReturn,
+ RtemsTaskReqRestart_Post_FatalError_Yes,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqRestart_Post_Status_NoReturn,
+ RtemsTaskReqRestart_Post_FatalError_Yes,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_Yes,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqRestart_Post_Status_NoReturn,
+ RtemsTaskReqRestart_Post_FatalError_Yes,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_Yes,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqRestart_Post_Status_NoReturn,
+ RtemsTaskReqRestart_Post_FatalError_Yes,
+ RtemsTaskReqRestart_Post_Argument_Set,
+ RtemsTaskReqRestart_Post_State_Ready, RtemsTaskReqRestart_Post_Enqueued_No,
+ RtemsTaskReqRestart_Post_Timer_Inactive,
+ RtemsTaskReqRestart_Post_Restarting_Yes,
+ RtemsTaskReqRestart_Post_Terminating_No,
+ RtemsTaskReqRestart_Post_Protected_No,
+ RtemsTaskReqRestart_Post_RestartExtensions_Nop,
+ RtemsTaskReqRestart_Post_TerminateExtensions_Nop }
+};
+
+static const uint8_t
+RtemsTaskReqRestart_Map[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
+ 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
+ 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0,
+ 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0,
+ 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
+ 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
+ 3, 0, 3, 0, 3, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0,
+ 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
+ 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,
+ 3, 0, 3, 0, 3, 0, 3, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3,
+ 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3,
+ 0, 3, 0, 3, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3,
+ 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 28, 26, 28, 26, 10, 10,
+ 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 0, 16, 0, 10, 0,
+ 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 26, 29, 26, 10,
+ 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 0, 12, 0, 10,
+ 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 30, 27, 30, 27,
+ 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 0, 21, 0,
+ 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 31, 27, 31,
+ 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 0,
+ 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0,
+ 14, 0, 14, 0, 10, 0, 10, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0,
+ 14, 0, 28, 26, 28, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19,
+ 0, 20, 0, 20, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 29, 26, 29, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0,
+ 12, 0, 12, 0, 12, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 30, 27, 30, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24,
+ 0, 24, 0, 25, 0, 25, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 31, 27, 31, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0,
+ 13, 0, 13, 0, 13, 0, 13, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 28, 26, 28, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0,
+ 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 26, 29, 26, 10, 10, 10, 10, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0,
+ 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 30, 27, 30, 27, 10, 10, 10, 10, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22,
+ 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 31, 27, 31, 27, 10, 10, 10, 10, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0,
+ 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 14, 0, 14, 0, 10, 0, 10, 0,
+ 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 28, 26, 28, 26, 10,
+ 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 0, 16, 0, 10,
+ 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 29, 26, 29, 26,
+ 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 12, 0, 12, 0,
+ 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 30, 27, 30,
+ 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 21, 0,
+ 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 31,
+ 27, 31, 27, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0,
+ 13, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7,
+ 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0,
+ 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0,
+ 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0,
+ 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0,
+ 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0,
+ 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0,
+ 7, 0, 7, 0, 7, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0,
+ 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0,
+ 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0,
+ 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0,
+ 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0,
+ 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0,
+ 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 16, 16, 16, 16, 10, 10, 10, 10, 17, 17, 17, 17, 18,
+ 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 16, 0, 16, 0, 10, 0, 10, 0, 17,
+ 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 12, 12, 12, 12, 10, 10, 10,
+ 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0,
+ 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0,
+ 15, 0, 15, 0, 10, 0, 10, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0,
+ 15, 0, 21, 21, 21, 21, 10, 10, 10, 10, 22, 22, 22, 22, 23, 23, 23, 23, 24,
+ 24, 24, 24, 25, 25, 25, 25, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0,
+ 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 10, 0, 10, 0,
+ 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 14, 0, 14, 0, 10, 0,
+ 10, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 16, 16, 16,
+ 16, 10, 10, 10, 10, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20,
+ 20, 20, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0,
+ 20, 0, 20, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0,
+ 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 15, 0, 15, 0, 10, 0, 10, 0, 15, 0, 15, 0,
+ 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 21, 21, 21, 21, 10, 10, 10, 10, 22,
+ 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 21, 0, 21, 0, 10,
+ 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 13, 13, 13,
+ 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13,
+ 0, 13, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 16, 16, 16, 16, 10, 10, 10, 10, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19,
+ 19, 19, 20, 20, 20, 20, 16, 0, 16, 0, 10, 0, 10, 0, 17, 0, 17, 0, 18, 0, 18,
+ 0, 19, 0, 19, 0, 20, 0, 20, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 12, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 0, 10, 0, 10, 0,
+ 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 15, 0, 15, 0, 10, 0,
+ 10, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 21, 21, 21,
+ 21, 10, 10, 10, 10, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25,
+ 25, 25, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0, 23, 0, 23, 0, 24, 0, 24, 0,
+ 25, 0, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 13, 13, 13, 13, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 10, 0, 10, 0, 13, 0, 13, 0, 13, 0,
+ 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 14, 0, 14, 0, 10, 0, 10, 0, 14, 0, 14, 0,
+ 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 14, 0, 16, 16, 16, 16, 10, 10, 10, 10, 17,
+ 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 16, 0, 16, 0, 10,
+ 0, 10, 0, 17, 0, 17, 0, 18, 0, 18, 0, 19, 0, 19, 0, 20, 0, 20, 0, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 12, 12, 12, 12,
+ 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 0, 12, 0, 10, 0, 10, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12,
+ 0, 12, 0, 15, 0, 15, 0, 10, 0, 10, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15,
+ 0, 15, 0, 15, 0, 21, 21, 21, 21, 10, 10, 10, 10, 22, 22, 22, 22, 23, 23, 23,
+ 23, 24, 24, 24, 24, 25, 25, 25, 25, 21, 0, 21, 0, 10, 0, 10, 0, 22, 0, 22, 0,
+ 23, 0, 23, 0, 24, 0, 24, 0, 25, 0, 25, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 13, 13, 13, 13, 10, 10, 10, 10, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 0, 13, 0, 10, 0,
+ 10, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 13, 0, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6
+};
+
+static size_t RtemsTaskReqRestart_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqRestart_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqRestart_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqRestart_Fixture = {
+ .setup = RtemsTaskReqRestart_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqRestart_Teardown_Wrap,
+ .scope = RtemsTaskReqRestart_Scope,
+ .initial_context = &RtemsTaskReqRestart_Instance
+};
+
+static inline RtemsTaskReqRestart_Entry RtemsTaskReqRestart_PopEntry(
+ RtemsTaskReqRestart_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqRestart_Entries[
+ RtemsTaskReqRestart_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqRestart_SetPreConditionStates(
+ RtemsTaskReqRestart_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+
+ if ( ctx->Map.entry.Pre_Dormant_NA ) {
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqRestart_Pre_Dormant_NA;
+ } else {
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Suspended_NA ) {
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqRestart_Pre_Suspended_NA;
+ } else {
+ ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Restarting_NA ) {
+ ctx->Map.pcs[ 3 ] = RtemsTaskReqRestart_Pre_Restarting_NA;
+ } else {
+ ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Terminating_NA ) {
+ ctx->Map.pcs[ 4 ] = RtemsTaskReqRestart_Pre_Terminating_NA;
+ } else {
+ ctx->Map.pcs[ 4 ] = ctx->Map.pci[ 4 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Protected_NA ) {
+ ctx->Map.pcs[ 5 ] = RtemsTaskReqRestart_Pre_Protected_NA;
+ } else {
+ ctx->Map.pcs[ 5 ] = ctx->Map.pci[ 5 ];
+ }
+
+ ctx->Map.pcs[ 6 ] = ctx->Map.pci[ 6 ];
+
+ if ( ctx->Map.entry.Pre_State_NA ) {
+ ctx->Map.pcs[ 7 ] = RtemsTaskReqRestart_Pre_State_NA;
+ } else {
+ ctx->Map.pcs[ 7 ] = ctx->Map.pci[ 7 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Timer_NA ) {
+ ctx->Map.pcs[ 8 ] = RtemsTaskReqRestart_Pre_Timer_NA;
+ } else {
+ ctx->Map.pcs[ 8 ] = ctx->Map.pci[ 8 ];
+ }
+
+ if ( ctx->Map.entry.Pre_RealPriority_NA ) {
+ ctx->Map.pcs[ 9 ] = RtemsTaskReqRestart_Pre_RealPriority_NA;
+ } else {
+ ctx->Map.pcs[ 9 ] = ctx->Map.pci[ 9 ];
+ }
+
+ ctx->Map.pcs[ 10 ] = ctx->Map.pci[ 10 ];
+}
+
+static void RtemsTaskReqRestart_TestVariant( RtemsTaskReqRestart_Context *ctx )
+{
+ RtemsTaskReqRestart_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqRestart_Pre_Dormant_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqRestart_Pre_Suspended_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqRestart_Pre_Restarting_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqRestart_Pre_Terminating_Prepare( ctx, ctx->Map.pcs[ 4 ] );
+ RtemsTaskReqRestart_Pre_Protected_Prepare( ctx, ctx->Map.pcs[ 5 ] );
+ RtemsTaskReqRestart_Pre_Context_Prepare( ctx, ctx->Map.pcs[ 6 ] );
+ RtemsTaskReqRestart_Pre_State_Prepare( ctx, ctx->Map.pcs[ 7 ] );
+ RtemsTaskReqRestart_Pre_Timer_Prepare( ctx, ctx->Map.pcs[ 8 ] );
+ RtemsTaskReqRestart_Pre_RealPriority_Prepare( ctx, ctx->Map.pcs[ 9 ] );
+ RtemsTaskReqRestart_Pre_ThreadDispatch_Prepare( ctx, ctx->Map.pcs[ 10 ] );
+ RtemsTaskReqRestart_Action( ctx );
+ RtemsTaskReqRestart_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqRestart_Post_FatalError_Check(
+ ctx,
+ ctx->Map.entry.Post_FatalError
+ );
+ RtemsTaskReqRestart_Post_Argument_Check( ctx, ctx->Map.entry.Post_Argument );
+ RtemsTaskReqRestart_Post_State_Check( ctx, ctx->Map.entry.Post_State );
+ RtemsTaskReqRestart_Post_Enqueued_Check( ctx, ctx->Map.entry.Post_Enqueued );
+ RtemsTaskReqRestart_Post_Timer_Check( ctx, ctx->Map.entry.Post_Timer );
+ RtemsTaskReqRestart_Post_Restarting_Check(
+ ctx,
+ ctx->Map.entry.Post_Restarting
+ );
+ RtemsTaskReqRestart_Post_Terminating_Check(
+ ctx,
+ ctx->Map.entry.Post_Terminating
+ );
+ RtemsTaskReqRestart_Post_Protected_Check(
+ ctx,
+ ctx->Map.entry.Post_Protected
+ );
+ RtemsTaskReqRestart_Post_RestartExtensions_Check(
+ ctx,
+ ctx->Map.entry.Post_RestartExtensions
+ );
+ RtemsTaskReqRestart_Post_TerminateExtensions_Check(
+ ctx,
+ ctx->Map.entry.Post_TerminateExtensions
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqRestart( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqRestart, &RtemsTaskReqRestart_Fixture )
+{
+ RtemsTaskReqRestart_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqRestart_Pre_Id_Invalid;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqRestart_Pre_Id_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqRestart_Pre_Dormant_Yes;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqRestart_Pre_Dormant_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ for (
+ ctx->Map.pci[ 2 ] = RtemsTaskReqRestart_Pre_Suspended_Yes;
+ ctx->Map.pci[ 2 ] < RtemsTaskReqRestart_Pre_Suspended_NA;
+ ++ctx->Map.pci[ 2 ]
+ ) {
+ for (
+ ctx->Map.pci[ 3 ] = RtemsTaskReqRestart_Pre_Restarting_Yes;
+ ctx->Map.pci[ 3 ] < RtemsTaskReqRestart_Pre_Restarting_NA;
+ ++ctx->Map.pci[ 3 ]
+ ) {
+ for (
+ ctx->Map.pci[ 4 ] = RtemsTaskReqRestart_Pre_Terminating_Yes;
+ ctx->Map.pci[ 4 ] < RtemsTaskReqRestart_Pre_Terminating_NA;
+ ++ctx->Map.pci[ 4 ]
+ ) {
+ for (
+ ctx->Map.pci[ 5 ] = RtemsTaskReqRestart_Pre_Protected_Yes;
+ ctx->Map.pci[ 5 ] < RtemsTaskReqRestart_Pre_Protected_NA;
+ ++ctx->Map.pci[ 5 ]
+ ) {
+ for (
+ ctx->Map.pci[ 6 ] = RtemsTaskReqRestart_Pre_Context_Task;
+ ctx->Map.pci[ 6 ] < RtemsTaskReqRestart_Pre_Context_NA;
+ ++ctx->Map.pci[ 6 ]
+ ) {
+ for (
+ ctx->Map.pci[ 7 ] = RtemsTaskReqRestart_Pre_State_Ready;
+ ctx->Map.pci[ 7 ] < RtemsTaskReqRestart_Pre_State_NA;
+ ++ctx->Map.pci[ 7 ]
+ ) {
+ for (
+ ctx->Map.pci[ 8 ] = RtemsTaskReqRestart_Pre_Timer_Inactive;
+ ctx->Map.pci[ 8 ] < RtemsTaskReqRestart_Pre_Timer_NA;
+ ++ctx->Map.pci[ 8 ]
+ ) {
+ for (
+ ctx->Map.pci[ 9 ] = RtemsTaskReqRestart_Pre_RealPriority_Initial;
+ ctx->Map.pci[ 9 ] < RtemsTaskReqRestart_Pre_RealPriority_NA;
+ ++ctx->Map.pci[ 9 ]
+ ) {
+ for (
+ ctx->Map.pci[ 10 ] = RtemsTaskReqRestart_Pre_ThreadDispatch_Disabled;
+ ctx->Map.pci[ 10 ] < RtemsTaskReqRestart_Pre_ThreadDispatch_NA;
+ ++ctx->Map.pci[ 10 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqRestart_PopEntry( ctx );
+
+ if ( ctx->Map.entry.Skip ) {
+ continue;
+ }
+
+ RtemsTaskReqRestart_SetPreConditionStates( ctx );
+ RtemsTaskReqRestart_Prepare( ctx );
+ RtemsTaskReqRestart_TestVariant( ctx );
+ RtemsTaskReqRestart_Cleanup( ctx );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-resume.c b/testsuites/validation/tc-task-resume.c
new file mode 100644
index 0000000000..f7c63234d6
--- /dev/null
+++ b/testsuites/validation/tc-task-resume.c
@@ -0,0 +1,411 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqResume
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqResume spec:/rtems/task/req/resume
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqResume_Pre_Id_Invalid,
+ RtemsTaskReqResume_Pre_Id_Task,
+ RtemsTaskReqResume_Pre_Id_NA
+} RtemsTaskReqResume_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqResume_Pre_Suspended_Yes,
+ RtemsTaskReqResume_Pre_Suspended_No,
+ RtemsTaskReqResume_Pre_Suspended_NA
+} RtemsTaskReqResume_Pre_Suspended;
+
+typedef enum {
+ RtemsTaskReqResume_Post_Status_Ok,
+ RtemsTaskReqResume_Post_Status_InvId,
+ RtemsTaskReqResume_Post_Status_IncStat,
+ RtemsTaskReqResume_Post_Status_NA
+} RtemsTaskReqResume_Post_Status;
+
+typedef struct {
+ uint8_t Skip : 1;
+ uint8_t Pre_Id_NA : 1;
+ uint8_t Pre_Suspended_NA : 1;
+ uint8_t Post_Status : 2;
+} RtemsTaskReqResume_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/resume test case.
+ */
+typedef struct {
+ /**
+ * @brief This member contains the identifier of a task.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief If this member is true, then the worker is suspended before the
+ * rtems_task_resume() call.
+ */
+ bool suspend;
+
+ /**
+ * @brief This member contains the return value of the rtems_task_resume()
+ * call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 2 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 2 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqResume_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqResume_Context;
+
+static RtemsTaskReqResume_Context
+ RtemsTaskReqResume_Instance;
+
+static const char * const RtemsTaskReqResume_PreDesc_Id[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqResume_PreDesc_Suspended[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqResume_PreDesc[] = {
+ RtemsTaskReqResume_PreDesc_Id,
+ RtemsTaskReqResume_PreDesc_Suspended,
+ NULL
+};
+
+static void Worker( rtems_task_argument arg )
+{
+ while ( true ) {
+ /* Do nothing */
+ }
+}
+
+static void RtemsTaskReqResume_Pre_Id_Prepare(
+ RtemsTaskReqResume_Context *ctx,
+ RtemsTaskReqResume_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqResume_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqResume_Pre_Id_Task: {
+ /*
+ * While the ``id`` parameter is associated with a task.
+ */
+ ctx->id = ctx->worker_id;
+ break;
+ }
+
+ case RtemsTaskReqResume_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqResume_Pre_Suspended_Prepare(
+ RtemsTaskReqResume_Context *ctx,
+ RtemsTaskReqResume_Pre_Suspended state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqResume_Pre_Suspended_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is suspended.
+ */
+ ctx->suspend = true;
+ break;
+ }
+
+ case RtemsTaskReqResume_Pre_Suspended_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not suspended.
+ */
+ ctx->suspend = false;
+ break;
+ }
+
+ case RtemsTaskReqResume_Pre_Suspended_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqResume_Post_Status_Check(
+ RtemsTaskReqResume_Context *ctx,
+ RtemsTaskReqResume_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqResume_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_resume() shall be RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqResume_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_resume() shall be RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqResume_Post_Status_IncStat: {
+ /*
+ * The return status of rtems_task_resume() shall be
+ * RTEMS_INCORRECT_STATE.
+ */
+ T_rsc( ctx->status, RTEMS_INCORRECT_STATE );
+ break;
+ }
+
+ case RtemsTaskReqResume_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqResume_Setup( RtemsTaskReqResume_Context *ctx )
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_LOW );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+static void RtemsTaskReqResume_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqResume_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqResume_Setup( ctx );
+}
+
+static void RtemsTaskReqResume_Teardown( RtemsTaskReqResume_Context *ctx )
+{
+ DeleteTask( ctx->worker_id );
+}
+
+static void RtemsTaskReqResume_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqResume_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqResume_Teardown( ctx );
+}
+
+static void RtemsTaskReqResume_Action( RtemsTaskReqResume_Context *ctx )
+{
+ if ( ctx->suspend ) {
+ SuspendTask( ctx->worker_id );
+ }
+
+ ctx->status = rtems_task_resume( ctx->id );
+
+ if ( ctx->suspend && ctx->status != RTEMS_SUCCESSFUL ) {
+ ResumeTask( ctx->worker_id );
+ }
+}
+
+static const RtemsTaskReqResume_Entry
+RtemsTaskReqResume_Entries[] = {
+ { 0, 0, 1, RtemsTaskReqResume_Post_Status_InvId },
+ { 0, 0, 0, RtemsTaskReqResume_Post_Status_Ok },
+ { 0, 0, 0, RtemsTaskReqResume_Post_Status_IncStat }
+};
+
+static const uint8_t
+RtemsTaskReqResume_Map[] = {
+ 0, 0, 1, 2
+};
+
+static size_t RtemsTaskReqResume_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqResume_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqResume_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqResume_Fixture = {
+ .setup = RtemsTaskReqResume_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqResume_Teardown_Wrap,
+ .scope = RtemsTaskReqResume_Scope,
+ .initial_context = &RtemsTaskReqResume_Instance
+};
+
+static inline RtemsTaskReqResume_Entry RtemsTaskReqResume_PopEntry(
+ RtemsTaskReqResume_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqResume_Entries[
+ RtemsTaskReqResume_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqResume_SetPreConditionStates(
+ RtemsTaskReqResume_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+
+ if ( ctx->Map.entry.Pre_Suspended_NA ) {
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqResume_Pre_Suspended_NA;
+ } else {
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+ }
+}
+
+static void RtemsTaskReqResume_TestVariant( RtemsTaskReqResume_Context *ctx )
+{
+ RtemsTaskReqResume_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqResume_Pre_Suspended_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqResume_Action( ctx );
+ RtemsTaskReqResume_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqResume( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqResume, &RtemsTaskReqResume_Fixture )
+{
+ RtemsTaskReqResume_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqResume_Pre_Id_Invalid;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqResume_Pre_Id_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqResume_Pre_Suspended_Yes;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqResume_Pre_Suspended_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqResume_PopEntry( ctx );
+ RtemsTaskReqResume_SetPreConditionStates( ctx );
+ RtemsTaskReqResume_TestVariant( ctx );
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-set-affinity.c b/testsuites/validation/tc-task-set-affinity.c
new file mode 100644
index 0000000000..ffa40fcf58
--- /dev/null
+++ b/testsuites/validation/tc-task-set-affinity.c
@@ -0,0 +1,684 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqSetAffinity
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/test-scheduler.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqSetAffinity \
+ * spec:/rtems/task/req/set-affinity
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ * @ingroup RTEMSTestSuiteTestsuitesValidationOneCpu0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqSetAffinity_Pre_Id_Invalid,
+ RtemsTaskReqSetAffinity_Pre_Id_Task,
+ RtemsTaskReqSetAffinity_Pre_Id_NA
+} RtemsTaskReqSetAffinity_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqSetAffinity_Pre_CPUSetSize_Askew,
+ RtemsTaskReqSetAffinity_Pre_CPUSetSize_Normal,
+ RtemsTaskReqSetAffinity_Pre_CPUSetSize_Huge,
+ RtemsTaskReqSetAffinity_Pre_CPUSetSize_NA
+} RtemsTaskReqSetAffinity_Pre_CPUSetSize;
+
+typedef enum {
+ RtemsTaskReqSetAffinity_Pre_CPUSetOnline_Supported,
+ RtemsTaskReqSetAffinity_Pre_CPUSetOnline_Unsupported,
+ RtemsTaskReqSetAffinity_Pre_CPUSetOnline_NA
+} RtemsTaskReqSetAffinity_Pre_CPUSetOnline;
+
+typedef enum {
+ RtemsTaskReqSetAffinity_Pre_CPUSetHuge_NotZero,
+ RtemsTaskReqSetAffinity_Pre_CPUSetHuge_Zero,
+ RtemsTaskReqSetAffinity_Pre_CPUSetHuge_NA
+} RtemsTaskReqSetAffinity_Pre_CPUSetHuge;
+
+typedef enum {
+ RtemsTaskReqSetAffinity_Pre_CPUSet_Valid,
+ RtemsTaskReqSetAffinity_Pre_CPUSet_Null,
+ RtemsTaskReqSetAffinity_Pre_CPUSet_NA
+} RtemsTaskReqSetAffinity_Pre_CPUSet;
+
+typedef enum {
+ RtemsTaskReqSetAffinity_Post_Status_Ok,
+ RtemsTaskReqSetAffinity_Post_Status_InvAddr,
+ RtemsTaskReqSetAffinity_Post_Status_InvId,
+ RtemsTaskReqSetAffinity_Post_Status_InvNum,
+ RtemsTaskReqSetAffinity_Post_Status_NA
+} RtemsTaskReqSetAffinity_Post_Status;
+
+typedef enum {
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Set,
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Nop,
+ RtemsTaskReqSetAffinity_Post_SetAffinity_NA
+} RtemsTaskReqSetAffinity_Post_SetAffinity;
+
+typedef struct {
+ uint16_t Skip : 1;
+ uint16_t Pre_Id_NA : 1;
+ uint16_t Pre_CPUSetSize_NA : 1;
+ uint16_t Pre_CPUSetOnline_NA : 1;
+ uint16_t Pre_CPUSetHuge_NA : 1;
+ uint16_t Pre_CPUSet_NA : 1;
+ uint16_t Post_Status : 3;
+ uint16_t Post_SetAffinity : 2;
+} RtemsTaskReqSetAffinity_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/set-affinity test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides the scheduler operation records.
+ */
+ T_scheduler_log_2 scheduler_log;;
+
+ /**
+ * @brief This member provides the object referenced by the ``cpuset``
+ * parameter.
+ */
+ cpu_set_t cpuset_obj[ 2 ];
+
+ /**
+ * @brief This member contains the return value of the
+ * rtems_task_set_affinity() call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ /**
+ * @brief This member specifies if the ``cpusetsize`` parameter value.
+ */
+ size_t cpusetsize;
+
+ /**
+ * @brief This member specifies if the ``cpuset`` parameter value.
+ */
+ cpu_set_t *cpuset;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 5 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 5 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqSetAffinity_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqSetAffinity_Context;
+
+static RtemsTaskReqSetAffinity_Context
+ RtemsTaskReqSetAffinity_Instance;
+
+static const char * const RtemsTaskReqSetAffinity_PreDesc_Id[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetAffinity_PreDesc_CPUSetSize[] = {
+ "Askew",
+ "Normal",
+ "Huge",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetAffinity_PreDesc_CPUSetOnline[] = {
+ "Supported",
+ "Unsupported",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetAffinity_PreDesc_CPUSetHuge[] = {
+ "NotZero",
+ "Zero",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetAffinity_PreDesc_CPUSet[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqSetAffinity_PreDesc[] = {
+ RtemsTaskReqSetAffinity_PreDesc_Id,
+ RtemsTaskReqSetAffinity_PreDesc_CPUSetSize,
+ RtemsTaskReqSetAffinity_PreDesc_CPUSetOnline,
+ RtemsTaskReqSetAffinity_PreDesc_CPUSetHuge,
+ RtemsTaskReqSetAffinity_PreDesc_CPUSet,
+ NULL
+};
+
+static void RtemsTaskReqSetAffinity_Pre_Id_Prepare(
+ RtemsTaskReqSetAffinity_Context *ctx,
+ RtemsTaskReqSetAffinity_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetAffinity_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_Id_Task: {
+ /*
+ * While the ``id`` parameter is associated with a task.
+ */
+ ctx->id = RTEMS_SELF;
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetAffinity_Pre_CPUSetSize_Prepare(
+ RtemsTaskReqSetAffinity_Context *ctx,
+ RtemsTaskReqSetAffinity_Pre_CPUSetSize state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetAffinity_Pre_CPUSetSize_Askew: {
+ /*
+ * While the ``cpusetsize`` parameter is not an integral multiple of the
+ * size of long.
+ */
+ ctx->cpusetsize = SIZE_MAX;
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_CPUSetSize_Normal: {
+ /*
+ * While the ``cpusetsize`` parameter is an integral multiple of the size
+ * of long, while the ``cpusetsize`` parameter is less than or equal to
+ * the maximum processor set size storable in the system.
+ */
+ ctx->cpusetsize = sizeof( ctx->cpuset_obj[ 0 ] );
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_CPUSetSize_Huge: {
+ /*
+ * While the ``cpusetsize`` parameter is an integral multiple of the size
+ * of long, while the ``cpusetsize`` parameter is greater than the
+ * maximum processor set size storable in the system.
+ */
+ ctx->cpusetsize = sizeof( ctx->cpuset_obj );
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_CPUSetSize_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetAffinity_Pre_CPUSetOnline_Prepare(
+ RtemsTaskReqSetAffinity_Context *ctx,
+ RtemsTaskReqSetAffinity_Pre_CPUSetOnline state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetAffinity_Pre_CPUSetOnline_Supported: {
+ /*
+ * While the intersection of the processor set specified by the
+ * ``cpusetsize`` and ``cpuset`` parameters and the set of online
+ * processors represents an affinity set supported by the home scheduler
+ * of the task specified by the ``id`` parameter at some point during the
+ * rtems_task_set_affinity() call.
+ */
+ /* Already prepared */
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_CPUSetOnline_Unsupported: {
+ /*
+ * While the intersection of the processor set specified by the
+ * ``cpusetsize`` and ``cpuset`` parameters and the set of online
+ * processors represents an affinity set not supported by the home
+ * scheduler of the task specified by the ``id`` parameter at some point
+ * during the rtems_task_set_affinity() call.
+ */
+ CPU_CLR( 0, &ctx->cpuset_obj[ 0 ] );
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_CPUSetOnline_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetAffinity_Pre_CPUSetHuge_Prepare(
+ RtemsTaskReqSetAffinity_Context *ctx,
+ RtemsTaskReqSetAffinity_Pre_CPUSetHuge state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetAffinity_Pre_CPUSetHuge_NotZero: {
+ /*
+ * While the processor set specified by the ``cpusetsize`` and ``cpuset``
+ * parameters contains at least one processor which is not storable in a
+ * processor set supported by the system.
+ */
+ /* Already prepared */
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_CPUSetHuge_Zero: {
+ /*
+ * While the processor set specified by the ``cpusetsize`` and ``cpuset``
+ * parameters contains no processor which is not storable in a processor
+ * set supported by the system.
+ */
+ CPU_ZERO( &ctx->cpuset_obj[ 1 ] );
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_CPUSetHuge_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetAffinity_Pre_CPUSet_Prepare(
+ RtemsTaskReqSetAffinity_Context *ctx,
+ RtemsTaskReqSetAffinity_Pre_CPUSet state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetAffinity_Pre_CPUSet_Valid: {
+ /*
+ * While the ``cpuset`` parameter references an object of type cpu_set_t.
+ */
+ ctx->cpuset = &ctx->cpuset_obj[ 0 ];
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_CPUSet_Null: {
+ /*
+ * While the ``cpuset`` parameter is equal to NULL.
+ */
+ ctx->cpuset = NULL;
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Pre_CPUSet_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetAffinity_Post_Status_Check(
+ RtemsTaskReqSetAffinity_Context *ctx,
+ RtemsTaskReqSetAffinity_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetAffinity_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_set_affinity() shall be
+ * RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_set_affinity() shall be
+ * RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_set_affinity() shall be
+ * RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Post_Status_InvNum: {
+ /*
+ * The return status of rtems_task_set_affinity() shall be
+ * RTEMS_INVALID_NUMBER.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_NUMBER );
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetAffinity_Post_SetAffinity_Check(
+ RtemsTaskReqSetAffinity_Context *ctx,
+ RtemsTaskReqSetAffinity_Post_SetAffinity state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetAffinity_Post_SetAffinity_Set: {
+ /*
+ * The affinity set of the task specified by the ``id`` parameter shall
+ * be set with respect to the home scheduler of the task at some point
+ * during the rtems_task_set_affinity() call.
+ */
+ #if defined(RTEMS_SMP)
+ T_eq_sz( ctx->scheduler_log.header.recorded, 1 );
+ T_eq_int(
+ ctx->scheduler_log.events[ 0 ].operation,
+ T_SCHEDULER_SET_AFFINITY
+ );
+ T_eq_int(
+ ctx->scheduler_log.events[ 0 ].set_affinity.status,
+ STATUS_SUCCESSFUL
+ );
+ #else
+ T_eq_sz( ctx->scheduler_log.header.recorded, 0 );
+ #endif
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Post_SetAffinity_Nop: {
+ /*
+ * No task affinity shall be modified by the rtems_task_set_affinity()
+ * call.
+ */
+ #if defined(RTEMS_SMP)
+ if ( ctx->scheduler_log.header.recorded == 1 ) {
+ T_eq_int(
+ ctx->scheduler_log.events[ 0 ].operation,
+ T_SCHEDULER_SET_AFFINITY
+ );
+ T_eq_int(
+ ctx->scheduler_log.events[ 0 ].set_affinity.status,
+ STATUS_INVALID_NUMBER
+ );
+ } else {
+ T_eq_sz( ctx->scheduler_log.header.recorded, 0 );
+ }
+ #else
+ T_eq_sz( ctx->scheduler_log.header.recorded, 0 );
+ #endif
+ break;
+ }
+
+ case RtemsTaskReqSetAffinity_Post_SetAffinity_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetAffinity_Prepare(
+ RtemsTaskReqSetAffinity_Context *ctx
+)
+{
+ CPU_FILL_S( sizeof( ctx->cpuset_obj ), &ctx->cpuset_obj[ 0 ] );
+}
+
+static void RtemsTaskReqSetAffinity_Action(
+ RtemsTaskReqSetAffinity_Context *ctx
+)
+{
+ T_scheduler_log *log;
+
+ log = T_scheduler_record_2( &ctx->scheduler_log );
+ T_null( log );
+
+ ctx->status = rtems_task_set_affinity(
+ ctx->id,
+ ctx->cpusetsize,
+ ctx->cpuset
+ );
+
+ log = T_scheduler_record( NULL );
+ T_eq_ptr( &log->header, &ctx->scheduler_log.header );
+}
+
+static const RtemsTaskReqSetAffinity_Entry
+RtemsTaskReqSetAffinity_Entries[] = {
+ { 0, 0, 0, 1, 1, 0, RtemsTaskReqSetAffinity_Post_Status_InvAddr,
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Nop },
+ { 0, 0, 0, 1, 1, 0, RtemsTaskReqSetAffinity_Post_Status_InvId,
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Nop },
+ { 0, 0, 0, 0, 1, 0, RtemsTaskReqSetAffinity_Post_Status_InvNum,
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Nop },
+ { 0, 0, 0, 1, 0, 0, RtemsTaskReqSetAffinity_Post_Status_InvId,
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Nop },
+ { 0, 0, 0, 0, 1, 0, RtemsTaskReqSetAffinity_Post_Status_Ok,
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Set },
+ { 0, 0, 0, 0, 0, 0, RtemsTaskReqSetAffinity_Post_Status_Ok,
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Set },
+ { 0, 0, 0, 0, 0, 0, RtemsTaskReqSetAffinity_Post_Status_InvNum,
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Nop }
+};
+
+static const uint8_t
+RtemsTaskReqSetAffinity_Map[] = {
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 3, 0, 3, 0, 3, 0, 2, 0,
+ 2, 0, 2, 0, 2, 0, 4, 0, 4, 0, 2, 0, 2, 0, 5, 0, 5, 0, 6, 0, 6, 0
+};
+
+static size_t RtemsTaskReqSetAffinity_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqSetAffinity_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope(
+ RtemsTaskReqSetAffinity_PreDesc,
+ buf,
+ n,
+ ctx->Map.pcs
+ );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqSetAffinity_Fixture = {
+ .setup = NULL,
+ .stop = NULL,
+ .teardown = NULL,
+ .scope = RtemsTaskReqSetAffinity_Scope,
+ .initial_context = &RtemsTaskReqSetAffinity_Instance
+};
+
+static inline RtemsTaskReqSetAffinity_Entry RtemsTaskReqSetAffinity_PopEntry(
+ RtemsTaskReqSetAffinity_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqSetAffinity_Entries[
+ RtemsTaskReqSetAffinity_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqSetAffinity_SetPreConditionStates(
+ RtemsTaskReqSetAffinity_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+
+ if ( ctx->Map.entry.Pre_CPUSetOnline_NA ) {
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqSetAffinity_Pre_CPUSetOnline_NA;
+ } else {
+ ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
+ }
+
+ if ( ctx->Map.entry.Pre_CPUSetHuge_NA ) {
+ ctx->Map.pcs[ 3 ] = RtemsTaskReqSetAffinity_Pre_CPUSetHuge_NA;
+ } else {
+ ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ];
+ }
+
+ ctx->Map.pcs[ 4 ] = ctx->Map.pci[ 4 ];
+}
+
+static void RtemsTaskReqSetAffinity_TestVariant(
+ RtemsTaskReqSetAffinity_Context *ctx
+)
+{
+ RtemsTaskReqSetAffinity_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqSetAffinity_Pre_CPUSetSize_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqSetAffinity_Pre_CPUSetOnline_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqSetAffinity_Pre_CPUSetHuge_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqSetAffinity_Pre_CPUSet_Prepare( ctx, ctx->Map.pcs[ 4 ] );
+ RtemsTaskReqSetAffinity_Action( ctx );
+ RtemsTaskReqSetAffinity_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqSetAffinity_Post_SetAffinity_Check(
+ ctx,
+ ctx->Map.entry.Post_SetAffinity
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqSetAffinity( void )
+ */
+T_TEST_CASE_FIXTURE(
+ RtemsTaskReqSetAffinity,
+ &RtemsTaskReqSetAffinity_Fixture
+)
+{
+ RtemsTaskReqSetAffinity_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqSetAffinity_Pre_Id_Invalid;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqSetAffinity_Pre_Id_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqSetAffinity_Pre_CPUSetSize_Askew;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqSetAffinity_Pre_CPUSetSize_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ for (
+ ctx->Map.pci[ 2 ] = RtemsTaskReqSetAffinity_Pre_CPUSetOnline_Supported;
+ ctx->Map.pci[ 2 ] < RtemsTaskReqSetAffinity_Pre_CPUSetOnline_NA;
+ ++ctx->Map.pci[ 2 ]
+ ) {
+ for (
+ ctx->Map.pci[ 3 ] = RtemsTaskReqSetAffinity_Pre_CPUSetHuge_NotZero;
+ ctx->Map.pci[ 3 ] < RtemsTaskReqSetAffinity_Pre_CPUSetHuge_NA;
+ ++ctx->Map.pci[ 3 ]
+ ) {
+ for (
+ ctx->Map.pci[ 4 ] = RtemsTaskReqSetAffinity_Pre_CPUSet_Valid;
+ ctx->Map.pci[ 4 ] < RtemsTaskReqSetAffinity_Pre_CPUSet_NA;
+ ++ctx->Map.pci[ 4 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqSetAffinity_PopEntry( ctx );
+ RtemsTaskReqSetAffinity_SetPreConditionStates( ctx );
+ RtemsTaskReqSetAffinity_Prepare( ctx );
+ RtemsTaskReqSetAffinity_TestVariant( ctx );
+ }
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-set-priority.c b/testsuites/validation/tc-task-set-priority.c
new file mode 100644
index 0000000000..cbe4bfda2b
--- /dev/null
+++ b/testsuites/validation/tc-task-set-priority.c
@@ -0,0 +1,816 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqSetPriority
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqSetPriority \
+ * spec:/rtems/task/req/set-priority
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ * @ingroup RTEMSTestSuiteTestsuitesValidationOneCpu0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqSetPriority_Pre_Id_Invalid,
+ RtemsTaskReqSetPriority_Pre_Id_Task,
+ RtemsTaskReqSetPriority_Pre_Id_NA
+} RtemsTaskReqSetPriority_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqSetPriority_Pre_State_Dormant,
+ RtemsTaskReqSetPriority_Pre_State_Ready,
+ RtemsTaskReqSetPriority_Pre_State_Scheduled,
+ RtemsTaskReqSetPriority_Pre_State_Blocked,
+ RtemsTaskReqSetPriority_Pre_State_NA
+} RtemsTaskReqSetPriority_Pre_State;
+
+typedef enum {
+ RtemsTaskReqSetPriority_Pre_NewPriority_Current,
+ RtemsTaskReqSetPriority_Pre_NewPriority_Other,
+ RtemsTaskReqSetPriority_Pre_NewPriority_NA
+} RtemsTaskReqSetPriority_Pre_NewPriority;
+
+typedef enum {
+ RtemsTaskReqSetPriority_Pre_TaskPriority_High,
+ RtemsTaskReqSetPriority_Pre_TaskPriority_Equal,
+ RtemsTaskReqSetPriority_Pre_TaskPriority_Low,
+ RtemsTaskReqSetPriority_Pre_TaskPriority_Invalid,
+ RtemsTaskReqSetPriority_Pre_TaskPriority_NA
+} RtemsTaskReqSetPriority_Pre_TaskPriority;
+
+typedef enum {
+ RtemsTaskReqSetPriority_Pre_OldPriority_Valid,
+ RtemsTaskReqSetPriority_Pre_OldPriority_Null,
+ RtemsTaskReqSetPriority_Pre_OldPriority_NA
+} RtemsTaskReqSetPriority_Pre_OldPriority;
+
+typedef enum {
+ RtemsTaskReqSetPriority_Post_Status_Ok,
+ RtemsTaskReqSetPriority_Post_Status_InvAddr,
+ RtemsTaskReqSetPriority_Post_Status_InvId,
+ RtemsTaskReqSetPriority_Post_Status_InvPrio,
+ RtemsTaskReqSetPriority_Post_Status_NA
+} RtemsTaskReqSetPriority_Post_Status;
+
+typedef enum {
+ RtemsTaskReqSetPriority_Post_Priority_Set,
+ RtemsTaskReqSetPriority_Post_Priority_Nop,
+ RtemsTaskReqSetPriority_Post_Priority_NA
+} RtemsTaskReqSetPriority_Post_Priority;
+
+typedef enum {
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Set,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Nop,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_NA
+} RtemsTaskReqSetPriority_Post_OldPriorityObj;
+
+typedef struct {
+ uint16_t Skip : 1;
+ uint16_t Pre_Id_NA : 1;
+ uint16_t Pre_State_NA : 1;
+ uint16_t Pre_NewPriority_NA : 1;
+ uint16_t Pre_TaskPriority_NA : 1;
+ uint16_t Pre_OldPriority_NA : 1;
+ uint16_t Post_Status : 3;
+ uint16_t Post_Priority : 2;
+ uint16_t Post_OldPriorityObj : 2;
+} RtemsTaskReqSetPriority_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/set-priority test case.
+ */
+typedef struct {
+ /**
+ * @brief This member contains the worker task identifier.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief If this member is true, then the task shall be started.
+ */
+ bool started;
+
+ /**
+ * @brief If this member is true, then the task shall be blocked.
+ */
+ bool blocked;
+
+ /**
+ * @brief This member provides the object referenced by the ``old_priority``
+ * parameter.
+ */
+ rtems_task_priority old_priority_obj;
+
+ /**
+ * @brief This member contains the return value of the
+ * rtems_task_set_priority() call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ /**
+ * @brief This member specifies if the ``new_priority`` parameter value.
+ */
+ rtems_task_priority new_priority;
+
+ /**
+ * @brief This member specifies if the ``old_priority`` parameter value.
+ */
+ rtems_task_priority *old_priority;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 5 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 5 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqSetPriority_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqSetPriority_Context;
+
+static RtemsTaskReqSetPriority_Context
+ RtemsTaskReqSetPriority_Instance;
+
+static const char * const RtemsTaskReqSetPriority_PreDesc_Id[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetPriority_PreDesc_State[] = {
+ "Dormant",
+ "Ready",
+ "Scheduled",
+ "Blocked",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetPriority_PreDesc_NewPriority[] = {
+ "Current",
+ "Other",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetPriority_PreDesc_TaskPriority[] = {
+ "High",
+ "Equal",
+ "Low",
+ "Invalid",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetPriority_PreDesc_OldPriority[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqSetPriority_PreDesc[] = {
+ RtemsTaskReqSetPriority_PreDesc_Id,
+ RtemsTaskReqSetPriority_PreDesc_State,
+ RtemsTaskReqSetPriority_PreDesc_NewPriority,
+ RtemsTaskReqSetPriority_PreDesc_TaskPriority,
+ RtemsTaskReqSetPriority_PreDesc_OldPriority,
+ NULL
+};
+
+static void Worker( rtems_task_argument arg )
+{
+ (void) ReceiveAnyEvents();
+ (void) ReceiveAnyEvents();
+}
+
+static void RtemsTaskReqSetPriority_Pre_Id_Prepare(
+ RtemsTaskReqSetPriority_Context *ctx,
+ RtemsTaskReqSetPriority_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetPriority_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_Id_Task: {
+ /*
+ * While the ``id`` parameter is associated with a task.
+ */
+ ctx->id = ctx->worker_id;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetPriority_Pre_State_Prepare(
+ RtemsTaskReqSetPriority_Context *ctx,
+ RtemsTaskReqSetPriority_Pre_State state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetPriority_Pre_State_Dormant: {
+ /*
+ * While the task specified by the ``id`` parameter is dormant.
+ */
+ ctx->started = false;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_State_Ready: {
+ /*
+ * While the task specified by the ``id`` parameter is ready.
+ */
+ ctx->started = true;
+ ctx->blocked = false;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_State_Scheduled: {
+ /*
+ * While the task specified by the ``id`` parameter is scheduled.
+ */
+ ctx->started = false;
+ ctx->id = rtems_task_self();
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_State_Blocked: {
+ /*
+ * While the task specified by the ``id`` parameter is blocked.
+ */
+ ctx->started = true;
+ ctx->blocked = true;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_State_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetPriority_Pre_NewPriority_Prepare(
+ RtemsTaskReqSetPriority_Context *ctx,
+ RtemsTaskReqSetPriority_Pre_NewPriority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetPriority_Pre_NewPriority_Current: {
+ /*
+ * While the value of the ``new_priority`` parameter is equal to
+ * RTEMS_CURRENT_PRIORITY.
+ */
+ ctx->new_priority = RTEMS_CURRENT_PRIORITY;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_NewPriority_Other: {
+ /*
+ * While the value of the ``new_priority`` parameter is not equal to
+ * RTEMS_CURRENT_PRIORITY.
+ */
+ ctx->new_priority = PRIO_NORMAL;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_NewPriority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetPriority_Pre_TaskPriority_Prepare(
+ RtemsTaskReqSetPriority_Context *ctx,
+ RtemsTaskReqSetPriority_Pre_TaskPriority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetPriority_Pre_TaskPriority_High: {
+ /*
+ * While the value of the ``new_priority`` parameter is a valid task
+ * priority with respect to the home scheduler of the task specified by
+ * the ``id`` parameter when the new priority is set, while the value of
+ * the ``new_priority`` parameter is higher than the task priority with
+ * respect to the home scheduler of the task specified by the ``id``
+ * parameter at time when the scheduler evaluates the new priority.
+ */
+ ctx->new_priority = PRIO_HIGH;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_TaskPriority_Equal: {
+ /*
+ * While the value of the ``new_priority`` parameter is a valid task
+ * priority with respect to the home scheduler of the task specified by
+ * the ``id`` parameter when the new priority is set, while the value of
+ * the ``new_priority`` parameter is equal to the task priority with
+ * respect to the home scheduler of the task specified by the ``id``
+ * parameter at time when the scheduler evaluates the new priority.
+ */
+ ctx->new_priority = PRIO_NORMAL;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_TaskPriority_Low: {
+ /*
+ * While the value of the ``new_priority`` parameter is a valid task
+ * priority with respect to the home scheduler of the task specified by
+ * the ``id`` parameter when the new priority is set, while the value of
+ * the ``new_priority`` parameter is lower than the task priority with
+ * respect to the home scheduler of the task specified by the ``id``
+ * parameter at time when the scheduler evaluates the new priority.
+ */
+ ctx->new_priority = PRIO_LOW;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_TaskPriority_Invalid: {
+ /*
+ * While the value of the ``new_priority`` parameter is an invalid task
+ * priority with respect to the home scheduler of the task specified by
+ * the ``id`` parameter when the new priority is evaluated.
+ */
+ ctx->new_priority = PRIO_INVALID;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_TaskPriority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetPriority_Pre_OldPriority_Prepare(
+ RtemsTaskReqSetPriority_Context *ctx,
+ RtemsTaskReqSetPriority_Pre_OldPriority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetPriority_Pre_OldPriority_Valid: {
+ /*
+ * While the ``old_priority`` parameter references an object of type
+ * rtems_task_priority.
+ */
+ ctx->old_priority = &ctx->old_priority_obj;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_OldPriority_Null: {
+ /*
+ * While the ``old_priority`` parameter is equal to NULL.
+ */
+ ctx->old_priority = NULL;
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Pre_OldPriority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetPriority_Post_Status_Check(
+ RtemsTaskReqSetPriority_Context *ctx,
+ RtemsTaskReqSetPriority_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetPriority_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_set_priority() shall be
+ * RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_set_priority() shall be
+ * RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_set_priority() shall be
+ * RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Post_Status_InvPrio: {
+ /*
+ * The return status of rtems_task_set_priority() shall be
+ * RTEMS_INVALID_PRIORITY.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_PRIORITY );
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetPriority_Post_Priority_Check(
+ RtemsTaskReqSetPriority_Context *ctx,
+ RtemsTaskReqSetPriority_Post_Priority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetPriority_Post_Priority_Set: {
+ /*
+ * The real priority of the task specified by the ``id`` parameter shall
+ * be set to the value specified by the ``new_priority`` parameter at
+ * some point during the rtems_task_set_priority() call.
+ */
+ T_eq_u32( GetPriority( ctx->id ), ctx->new_priority );
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Post_Priority_Nop: {
+ /*
+ * No real priority of a task shall be modified by the
+ * rtems_task_set_priority() call.
+ */
+ T_eq_u32( GetPriority( ctx->worker_id ), PRIO_NORMAL );
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Post_Priority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetPriority_Post_OldPriorityObj_Check(
+ RtemsTaskReqSetPriority_Context *ctx,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetPriority_Post_OldPriorityObj_Set: {
+ /*
+ * The value of the object referenced by the ``old_priority`` parameter
+ * shall be set after the return of the rtems_task_set_priority() call to
+ * the current priority of the task specified by the ``id`` parameter at
+ * some point during the call and before the real priority is modified by
+ * the call if it is modified by the call.
+ */
+ T_eq_u32( ctx->old_priority_obj, PRIO_NORMAL );
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Post_OldPriorityObj_Nop: {
+ /*
+ * Objects referenced by the ``old_priority`` parameter in past calls to
+ * rtems_task_set_priority() shall not be accessed by the
+ * rtems_task_set_priority() call.
+ */
+ T_eq_u32( ctx->old_priority_obj, PRIO_INVALID );
+ break;
+ }
+
+ case RtemsTaskReqSetPriority_Post_OldPriorityObj_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetPriority_Setup(
+ RtemsTaskReqSetPriority_Context *ctx
+)
+{
+ SetSelfPriority( PRIO_ULTRA_HIGH );
+}
+
+static void RtemsTaskReqSetPriority_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqSetPriority_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqSetPriority_Setup( ctx );
+}
+
+static void RtemsTaskReqSetPriority_Teardown(
+ RtemsTaskReqSetPriority_Context *ctx
+)
+{
+ RestoreRunnerPriority();
+}
+
+static void RtemsTaskReqSetPriority_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqSetPriority_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqSetPriority_Teardown( ctx );
+}
+
+static void RtemsTaskReqSetPriority_Prepare(
+ RtemsTaskReqSetPriority_Context *ctx
+)
+{
+ ctx->old_priority_obj = PRIO_INVALID;
+ ctx->worker_id = CreateTask( "WORK", PRIO_NORMAL );
+ ctx->started = false;
+ ctx->blocked = false;
+}
+
+static void RtemsTaskReqSetPriority_Action(
+ RtemsTaskReqSetPriority_Context *ctx
+)
+{
+ if ( ctx->started ) {
+ SetSelfPriority( PRIO_ULTRA_HIGH );
+ StartTask( ctx->worker_id, Worker, NULL );
+
+ if ( ctx->blocked ) {
+ SetSelfPriority( PRIO_ULTRA_LOW );
+ SetSelfPriority( PRIO_ULTRA_HIGH );
+ }
+ } else {
+ SetSelfPriority( PRIO_NORMAL );
+ }
+
+ ctx->status = rtems_task_set_priority(
+ ctx->id,
+ ctx->new_priority,
+ ctx->old_priority
+ );
+
+ if ( ctx->started ) {
+ SendEvents( ctx->worker_id, RTEMS_EVENT_0 );
+ SetSelfPriority( PRIO_ULTRA_LOW );
+ SetSelfPriority( PRIO_ULTRA_HIGH );
+ }
+}
+
+static void RtemsTaskReqSetPriority_Cleanup(
+ RtemsTaskReqSetPriority_Context *ctx
+)
+{
+ DeleteTask( ctx->worker_id );
+}
+
+static const RtemsTaskReqSetPriority_Entry
+RtemsTaskReqSetPriority_Entries[] = {
+ { 0, 0, 1, 0, 1, 0, RtemsTaskReqSetPriority_Post_Status_InvId,
+ RtemsTaskReqSetPriority_Post_Priority_Nop,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Nop },
+ { 0, 0, 1, 0, 1, 0, RtemsTaskReqSetPriority_Post_Status_InvAddr,
+ RtemsTaskReqSetPriority_Post_Priority_Nop,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Nop },
+ { 0, 0, 0, 0, 1, 0, RtemsTaskReqSetPriority_Post_Status_Ok,
+ RtemsTaskReqSetPriority_Post_Priority_Nop,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Set },
+ { 0, 0, 0, 0, 1, 0, RtemsTaskReqSetPriority_Post_Status_InvAddr,
+ RtemsTaskReqSetPriority_Post_Priority_Nop,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Nop },
+ { 0, 0, 0, 0, 0, 0, RtemsTaskReqSetPriority_Post_Status_InvAddr,
+ RtemsTaskReqSetPriority_Post_Priority_Nop,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Nop },
+ { 0, 0, 0, 0, 0, 0, RtemsTaskReqSetPriority_Post_Status_Ok,
+ RtemsTaskReqSetPriority_Post_Priority_Set,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Set },
+ { 0, 0, 0, 0, 0, 0, RtemsTaskReqSetPriority_Post_Status_InvPrio,
+ RtemsTaskReqSetPriority_Post_Priority_Nop,
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Set }
+};
+
+static const uint8_t
+RtemsTaskReqSetPriority_Map[] = {
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 2, 3, 5, 4, 5, 4, 5, 4,
+ 6, 4, 2, 3, 2, 3, 2, 3, 2, 3, 5, 4, 5, 4, 5, 4, 6, 4, 2, 3, 2, 3, 2, 3, 2, 3,
+ 5, 4, 5, 4, 5, 4, 6, 4, 2, 3, 2, 3, 2, 3, 2, 3, 5, 4, 5, 4, 5, 4, 6, 4
+};
+
+static size_t RtemsTaskReqSetPriority_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqSetPriority_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope(
+ RtemsTaskReqSetPriority_PreDesc,
+ buf,
+ n,
+ ctx->Map.pcs
+ );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqSetPriority_Fixture = {
+ .setup = RtemsTaskReqSetPriority_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqSetPriority_Teardown_Wrap,
+ .scope = RtemsTaskReqSetPriority_Scope,
+ .initial_context = &RtemsTaskReqSetPriority_Instance
+};
+
+static inline RtemsTaskReqSetPriority_Entry RtemsTaskReqSetPriority_PopEntry(
+ RtemsTaskReqSetPriority_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqSetPriority_Entries[
+ RtemsTaskReqSetPriority_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqSetPriority_SetPreConditionStates(
+ RtemsTaskReqSetPriority_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+
+ if ( ctx->Map.entry.Pre_State_NA ) {
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqSetPriority_Pre_State_NA;
+ } else {
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+ }
+
+ ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
+
+ if ( ctx->Map.entry.Pre_TaskPriority_NA ) {
+ ctx->Map.pcs[ 3 ] = RtemsTaskReqSetPriority_Pre_TaskPriority_NA;
+ } else {
+ ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ];
+ }
+
+ ctx->Map.pcs[ 4 ] = ctx->Map.pci[ 4 ];
+}
+
+static void RtemsTaskReqSetPriority_TestVariant(
+ RtemsTaskReqSetPriority_Context *ctx
+)
+{
+ RtemsTaskReqSetPriority_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqSetPriority_Pre_State_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqSetPriority_Pre_NewPriority_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqSetPriority_Pre_TaskPriority_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqSetPriority_Pre_OldPriority_Prepare( ctx, ctx->Map.pcs[ 4 ] );
+ RtemsTaskReqSetPriority_Action( ctx );
+ RtemsTaskReqSetPriority_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqSetPriority_Post_Priority_Check(
+ ctx,
+ ctx->Map.entry.Post_Priority
+ );
+ RtemsTaskReqSetPriority_Post_OldPriorityObj_Check(
+ ctx,
+ ctx->Map.entry.Post_OldPriorityObj
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqSetPriority( void )
+ */
+T_TEST_CASE_FIXTURE(
+ RtemsTaskReqSetPriority,
+ &RtemsTaskReqSetPriority_Fixture
+)
+{
+ RtemsTaskReqSetPriority_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqSetPriority_Pre_Id_Invalid;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqSetPriority_Pre_Id_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqSetPriority_Pre_State_Dormant;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqSetPriority_Pre_State_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ for (
+ ctx->Map.pci[ 2 ] = RtemsTaskReqSetPriority_Pre_NewPriority_Current;
+ ctx->Map.pci[ 2 ] < RtemsTaskReqSetPriority_Pre_NewPriority_NA;
+ ++ctx->Map.pci[ 2 ]
+ ) {
+ for (
+ ctx->Map.pci[ 3 ] = RtemsTaskReqSetPriority_Pre_TaskPriority_High;
+ ctx->Map.pci[ 3 ] < RtemsTaskReqSetPriority_Pre_TaskPriority_NA;
+ ++ctx->Map.pci[ 3 ]
+ ) {
+ for (
+ ctx->Map.pci[ 4 ] = RtemsTaskReqSetPriority_Pre_OldPriority_Valid;
+ ctx->Map.pci[ 4 ] < RtemsTaskReqSetPriority_Pre_OldPriority_NA;
+ ++ctx->Map.pci[ 4 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqSetPriority_PopEntry( ctx );
+ RtemsTaskReqSetPriority_SetPreConditionStates( ctx );
+ RtemsTaskReqSetPriority_Prepare( ctx );
+ RtemsTaskReqSetPriority_TestVariant( ctx );
+ RtemsTaskReqSetPriority_Cleanup( ctx );
+ }
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-set-scheduler.c b/testsuites/validation/tc-task-set-scheduler.c
new file mode 100644
index 0000000000..018aa2c338
--- /dev/null
+++ b/testsuites/validation/tc-task-set-scheduler.c
@@ -0,0 +1,1492 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqSetScheduler
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/score/threadimpl.h>
+
+#include "ts-config.h"
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqSetScheduler \
+ * spec:/rtems/task/req/set-scheduler
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_TaskId_Task,
+ RtemsTaskReqSetScheduler_Pre_TaskId_Invalid,
+ RtemsTaskReqSetScheduler_Pre_TaskId_NA
+} RtemsTaskReqSetScheduler_Pre_TaskId;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_Scheduler_Home,
+ RtemsTaskReqSetScheduler_Pre_Scheduler_Other,
+ RtemsTaskReqSetScheduler_Pre_Scheduler_NA
+} RtemsTaskReqSetScheduler_Pre_Scheduler;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_Yes,
+ RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_No,
+ RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_NA
+} RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_SchedulerId_Scheduler,
+ RtemsTaskReqSetScheduler_Pre_SchedulerId_Invalid,
+ RtemsTaskReqSetScheduler_Pre_SchedulerId_NA
+} RtemsTaskReqSetScheduler_Pre_SchedulerId;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_Priority_Valid,
+ RtemsTaskReqSetScheduler_Pre_Priority_Invalid,
+ RtemsTaskReqSetScheduler_Pre_Priority_NA
+} RtemsTaskReqSetScheduler_Pre_Priority;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_HomePriority_Real,
+ RtemsTaskReqSetScheduler_Pre_HomePriority_More,
+ RtemsTaskReqSetScheduler_Pre_HomePriority_NA
+} RtemsTaskReqSetScheduler_Pre_HomePriority;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_EligiblePriorities_OnlyOne,
+ RtemsTaskReqSetScheduler_Pre_EligiblePriorities_More,
+ RtemsTaskReqSetScheduler_Pre_EligiblePriorities_NA
+} RtemsTaskReqSetScheduler_Pre_EligiblePriorities;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_Pinned_Yes,
+ RtemsTaskReqSetScheduler_Pre_Pinned_No,
+ RtemsTaskReqSetScheduler_Pre_Pinned_NA
+} RtemsTaskReqSetScheduler_Pre_Pinned;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_TaskState_Ready,
+ RtemsTaskReqSetScheduler_Pre_TaskState_Blocked,
+ RtemsTaskReqSetScheduler_Pre_TaskState_Enqueued,
+ RtemsTaskReqSetScheduler_Pre_TaskState_NA
+} RtemsTaskReqSetScheduler_Pre_TaskState;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Pre_AffinitySupported_Yes,
+ RtemsTaskReqSetScheduler_Pre_AffinitySupported_No,
+ RtemsTaskReqSetScheduler_Pre_AffinitySupported_NA
+} RtemsTaskReqSetScheduler_Pre_AffinitySupported;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Post_Status_Ok,
+ RtemsTaskReqSetScheduler_Post_Status_InvAddr,
+ RtemsTaskReqSetScheduler_Post_Status_InvId,
+ RtemsTaskReqSetScheduler_Post_Status_InvPrio,
+ RtemsTaskReqSetScheduler_Post_Status_InUse,
+ RtemsTaskReqSetScheduler_Post_Status_Unsat,
+ RtemsTaskReqSetScheduler_Post_Status_NA
+} RtemsTaskReqSetScheduler_Post_Status;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Post_Scheduler_Set,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA
+} RtemsTaskReqSetScheduler_Post_Scheduler;
+
+typedef enum {
+ RtemsTaskReqSetScheduler_Post_Priority_Set,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_NA
+} RtemsTaskReqSetScheduler_Post_Priority;
+
+typedef struct {
+ uint32_t Skip : 1;
+ uint32_t Pre_TaskId_NA : 1;
+ uint32_t Pre_Scheduler_NA : 1;
+ uint32_t Pre_SchedulerHasCPU_NA : 1;
+ uint32_t Pre_SchedulerId_NA : 1;
+ uint32_t Pre_Priority_NA : 1;
+ uint32_t Pre_HomePriority_NA : 1;
+ uint32_t Pre_EligiblePriorities_NA : 1;
+ uint32_t Pre_Pinned_NA : 1;
+ uint32_t Pre_TaskState_NA : 1;
+ uint32_t Pre_AffinitySupported_NA : 1;
+ uint32_t Post_Status : 3;
+ uint32_t Post_Scheduler : 2;
+ uint32_t Post_Priority : 2;
+} RtemsTaskReqSetScheduler_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/set-scheduler test case.
+ */
+typedef struct {
+ /**
+ * @brief This member contains the runner task identifier.
+ */
+ rtems_id runner_id;
+
+ /**
+ * @brief This member contains the scheduler A identifier.
+ */
+ rtems_id scheduler_a_id;
+
+ /**
+ * @brief This member contains the scheduler B identifier.
+ */
+ rtems_id scheduler_b_id;
+
+ /**
+ * @brief This member contains the scheduler D identifier.
+ */
+ rtems_id scheduler_d_id;
+
+ /**
+ * @brief This member contains the worker task identifiers.
+ */
+ rtems_id worker_id[ 3 ];
+
+ /**
+ * @brief This member contains the mutex identifiers.
+ */
+ rtems_id mutex_id[ 2 ];
+
+ /**
+ * @brief If this member is true, then the task shall have an additional
+ * priority for the home scheduler.
+ */
+ bool additional_home_priority;
+
+ /**
+ * @brief If this member is true, then the task shall have a second eligible
+ * scheduler.
+ */
+ bool second_eligible_scheduler;
+
+ /**
+ * @brief If this member is true, then the task shall be pinned to a
+ * processor.
+ */
+ bool pinned;
+
+ /**
+ * @brief If this member is true, then the task shall be blocked.
+ */
+ bool blocked;
+
+ /**
+ * @brief If this member is true, then the task shall be enqueued on a thread
+ * queue.
+ */
+ bool enqueued;
+
+ /**
+ * @brief This member specifies the scheduler identifier to set.
+ */
+ rtems_id scheduler_to_set_id;
+
+ /**
+ * @brief If this member is true, then the affinity of the task shall be
+ * supported by the scheduler.
+ */
+ bool affinity_supported;
+
+ /**
+ * @brief This member contains the return value of the
+ * rtems_task_set_scheduler() call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``task_id`` parameter value.
+ */
+ rtems_id task_id;
+
+ /**
+ * @brief This member specifies if the ``scheduler_id`` parameter value.
+ */
+ rtems_id scheduler_id;
+
+ /**
+ * @brief This member specifies if the ``priority`` parameter value.
+ */
+ rtems_task_priority priority;
+
+ /**
+ * @brief This member contains the identifier of the new scheduler.
+ */
+ rtems_id new_scheduler;;
+
+ /**
+ * @brief This member contains the new priorities of the task.
+ */
+ rtems_task_priority new_priority[ 2 ];
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 10 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 10 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqSetScheduler_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqSetScheduler_Context;
+
+static RtemsTaskReqSetScheduler_Context
+ RtemsTaskReqSetScheduler_Instance;
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_TaskId[] = {
+ "Task",
+ "Invalid",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_Scheduler[] = {
+ "Home",
+ "Other",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_SchedulerHasCPU[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_SchedulerId[] = {
+ "Scheduler",
+ "Invalid",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_Priority[] = {
+ "Valid",
+ "Invalid",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_HomePriority[] = {
+ "Real",
+ "More",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_EligiblePriorities[] = {
+ "OnlyOne",
+ "More",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_Pinned[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_TaskState[] = {
+ "Ready",
+ "Blocked",
+ "Enqueued",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSetScheduler_PreDesc_AffinitySupported[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqSetScheduler_PreDesc[] = {
+ RtemsTaskReqSetScheduler_PreDesc_TaskId,
+ RtemsTaskReqSetScheduler_PreDesc_Scheduler,
+ RtemsTaskReqSetScheduler_PreDesc_SchedulerHasCPU,
+ RtemsTaskReqSetScheduler_PreDesc_SchedulerId,
+ RtemsTaskReqSetScheduler_PreDesc_Priority,
+ RtemsTaskReqSetScheduler_PreDesc_HomePriority,
+ RtemsTaskReqSetScheduler_PreDesc_EligiblePriorities,
+ RtemsTaskReqSetScheduler_PreDesc_Pinned,
+ RtemsTaskReqSetScheduler_PreDesc_TaskState,
+ RtemsTaskReqSetScheduler_PreDesc_AffinitySupported,
+ NULL
+};
+
+typedef RtemsTaskReqSetScheduler_Context Context;
+
+#define EVENT_OBTAIN_MUTEX_A RTEMS_EVENT_0
+
+#define EVENT_RELEASE_MUTEX_A RTEMS_EVENT_1
+
+#define EVENT_OBTAIN_MUTEX_B RTEMS_EVENT_2
+
+#define EVENT_RELEASE_MUTEX_B RTEMS_EVENT_3
+
+#define EVENT_PIN RTEMS_EVENT_4
+
+#define EVENT_UNPIN RTEMS_EVENT_5
+
+#define EVENT_SET_LOW_PRIO RTEMS_EVENT_6
+
+#define EVENT_RUNNER_SYNC_0 RTEMS_EVENT_7
+
+#define EVENT_RUNNER_SYNC_1 RTEMS_EVENT_8
+
+static void Worker( rtems_task_argument arg )
+{
+ Context *ctx;
+ Thread_Control *executing;
+
+ ctx = (Context *) arg;
+ executing = _Thread_Get_executing();
+
+ while ( true ) {
+ rtems_event_set events;
+
+ events = ReceiveAnyEvents();
+
+ if ( ( events & EVENT_RUNNER_SYNC_0 ) != 0 ) {
+ SendEvents( ctx->runner_id, EVENT_RUNNER_SYNC_0 );
+ }
+
+ if ( ( events & EVENT_OBTAIN_MUTEX_A ) != 0 ) {
+ ObtainMutex( ctx->mutex_id[ 0 ] );
+ }
+
+ if ( ( events & EVENT_RELEASE_MUTEX_A ) != 0 ) {
+ ReleaseMutex( ctx->mutex_id[ 0 ] );
+ }
+
+ if ( ( events & EVENT_OBTAIN_MUTEX_B ) != 0 ) {
+ ObtainMutex( ctx->mutex_id[ 1 ] );
+ }
+
+ if ( ( events & EVENT_RELEASE_MUTEX_B ) != 0 ) {
+ ReleaseMutex( ctx->mutex_id[ 1 ] );
+ }
+
+ if ( ( events & EVENT_PIN ) != 0 ) {
+ _Thread_Pin( executing );
+ }
+
+ if ( ( events & EVENT_UNPIN ) != 0 ) {
+ _Thread_Unpin( executing, _Per_CPU_Get_snapshot() );
+ }
+
+ if ( ( events & EVENT_SET_LOW_PRIO ) != 0 ) {
+ SetSelfPriority( PRIO_LOW );
+ }
+
+ if ( ( events & EVENT_RUNNER_SYNC_1 ) != 0 ) {
+ SendEvents( ctx->runner_id, EVENT_RUNNER_SYNC_1 );
+ }
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_TaskId_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_TaskId state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_TaskId_Task: {
+ /*
+ * While the ``task_id`` parameter is associated with a task.
+ */
+ ctx->task_id = ctx->worker_id[ 0 ];
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_TaskId_Invalid: {
+ /*
+ * While the ``task_id`` parameter is not associated with a task.
+ */
+ ctx->task_id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_TaskId_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_Scheduler_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_Scheduler state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_Scheduler_Home: {
+ /*
+ * While the scheduler specified by the ``scheduler_id`` parameter is the
+ * home scheduler of the task specified by the ``task_id`` parameter.
+ */
+ ctx->scheduler_to_set_id = ctx->scheduler_a_id;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_Scheduler_Other: {
+ /*
+ * While the scheduler specified by the ``scheduler_id`` parameter is not
+ * the home scheduler of the task specified by the ``task_id`` parameter.
+ */
+ ctx->scheduler_to_set_id = ctx->scheduler_b_id;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_Scheduler_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_Yes: {
+ /*
+ * While the scheduler specified by the ``scheduler_id`` parameter owns
+ * at least one processor.
+ */
+ /* Already set by Scheduler pre-condition */
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_No: {
+ /*
+ * While the scheduler specified by the ``scheduler_id`` parameter owns
+ * no processor.
+ */
+ ctx->scheduler_to_set_id = ctx->scheduler_d_id;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_SchedulerId_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_SchedulerId state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_SchedulerId_Scheduler: {
+ /*
+ * While the ``scheduler_id`` parameter is associated with a scheduler.
+ */
+ ctx->scheduler_id = ctx->scheduler_to_set_id;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_SchedulerId_Invalid: {
+ /*
+ * While the ``scheduler_id`` parameter is not associated with a
+ * scheduler.
+ */
+ ctx->scheduler_id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_SchedulerId_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_Priority_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_Priority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_Priority_Valid: {
+ /*
+ * While the task priority specified by the ``priority`` parameter is
+ * valid with respect to the scheduler specified by the ``scheduler_id``
+ * parameter.
+ */
+ ctx->priority = PRIO_VERY_LOW;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_Priority_Invalid: {
+ /*
+ * While the task priority specified by the ``priority`` parameter is
+ * invalid with respect to the scheduler specified by the
+ * ``scheduler_id`` parameter.
+ */
+ ctx->priority = PRIO_INVALID;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_Priority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_HomePriority_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_HomePriority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_HomePriority_Real: {
+ /*
+ * While the current priority of the task specified by the ``task_id``
+ * parameter consists only of the real priority.
+ */
+ ctx->additional_home_priority = false;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_HomePriority_More: {
+ /*
+ * While the current priority of the task specified by the ``task_id``
+ * parameter consists of more than the real priority.
+ */
+ ctx->additional_home_priority = true;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_HomePriority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_EligiblePriorities_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_EligiblePriorities state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_EligiblePriorities_OnlyOne: {
+ /*
+ * While the set of eligible priorities of the task specified by the
+ * ``task_id`` parameter consists of exactly the current priority.
+ */
+ ctx->second_eligible_scheduler = false;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_EligiblePriorities_More: {
+ /*
+ * While the set of eligible priorities of the task specified by the
+ * ``task_id`` parameter consists of more than the current priority.
+ */
+ ctx->second_eligible_scheduler = true;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_EligiblePriorities_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_Pinned_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_Pinned state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_Pinned_Yes: {
+ /*
+ * While the task specified by the ``task_id`` parameter is pinned.
+ */
+ ctx->pinned = true;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_Pinned_No: {
+ /*
+ * While the task specified by the ``task_id`` parameter is not pinned.
+ */
+ ctx->pinned = false;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_Pinned_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_TaskState_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_TaskState state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_TaskState_Ready: {
+ /*
+ * While the task specified by the ``task_id`` parameter is ready.
+ */
+ ctx->blocked = false;
+ ctx->enqueued = false;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_TaskState_Blocked: {
+ /*
+ * While the task specified by the ``task_id`` parameter is blocked,
+ * while the task specified by the ``task_id`` parameter is not enqueued
+ * on a wait queue.
+ */
+ ctx->blocked = true;
+ ctx->enqueued = false;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_TaskState_Enqueued: {
+ /*
+ * While the task specified by the ``task_id`` parameter is blocked,
+ * while the task specified by the ``task_id`` parameter is enqueued on a
+ * wait queue.
+ */
+ ctx->blocked = true;
+ ctx->enqueued = true;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_TaskState_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Pre_AffinitySupported_Prepare(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Pre_AffinitySupported state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Pre_AffinitySupported_Yes: {
+ /*
+ * While the affinity set of the task specified by the ``task_id``
+ * parameter is supported by the scheduler specified by the
+ * ``scheduler_id`` parameter.
+ */
+ ctx->affinity_supported = true;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_AffinitySupported_No: {
+ /*
+ * While the affinity set of the task specified by the ``task_id``
+ * parameter is not supported by the scheduler specified by the
+ * ``scheduler_id`` parameter.
+ */
+ ctx->affinity_supported = false;
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Pre_AffinitySupported_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Post_Status_Check(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_set_scheduler() shall be
+ * RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_set_scheduler() shall be
+ * RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_set_scheduler() shall be
+ * RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Status_InvPrio: {
+ /*
+ * The return status of rtems_task_set_scheduler() shall be
+ * RTEMS_INVALID_PRIORITY.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_PRIORITY );
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Status_InUse: {
+ /*
+ * The return status of rtems_task_set_scheduler() shall be
+ * RTEMS_RESOURCE_IN_USE.
+ */
+ T_rsc( ctx->status, RTEMS_RESOURCE_IN_USE );
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Status_Unsat: {
+ /*
+ * The return status of rtems_task_set_scheduler() shall be
+ * RTEMS_UNSATISFIED.
+ */
+ T_rsc( ctx->status, RTEMS_UNSATISFIED );
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Post_Scheduler_Check(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Post_Scheduler state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Post_Scheduler_Set: {
+ /*
+ * The home scheduler of the task specified by the ``task_id`` parameter
+ * shall be set to the scheduler specified by the ``scheduler_id``
+ * parameter at some point during the rtems_task_set_scheduler() call.
+ */
+ T_eq_u32( ctx->new_scheduler, ctx->scheduler_to_set_id );
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Scheduler_Nop: {
+ /*
+ * No home scheduler of a task shall be modified by the
+ * rtems_task_set_scheduler() call.
+ */
+ T_eq_u32( ctx->new_scheduler, ctx->scheduler_a_id );
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Scheduler_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Post_Priority_Check(
+ RtemsTaskReqSetScheduler_Context *ctx,
+ RtemsTaskReqSetScheduler_Post_Priority state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSetScheduler_Post_Priority_Set: {
+ /*
+ * The real priority of the task specified by the ``task_id`` parameter
+ * shall be set to the priority specified by the ``priority`` parameter
+ * at some point during the rtems_task_set_scheduler() call.
+ */
+ if ( ctx->scheduler_to_set_id == ctx->scheduler_a_id ) {
+ T_eq_u32( ctx->new_priority[ 0 ], PRIO_VERY_LOW );
+ T_eq_u32( ctx->new_priority[ 1 ], PRIO_INVALID );
+ } else {
+ T_eq_u32( ctx->new_priority[ 0 ], PRIO_INVALID );
+ T_eq_u32( ctx->new_priority[ 1 ], PRIO_VERY_LOW );
+ }
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Priority_Nop: {
+ /*
+ * No task priority shall be modified by the rtems_task_set_scheduler()
+ * call.
+ */
+ if ( ctx->blocked ) {
+ T_eq_u32( ctx->new_priority[ 0 ], PRIO_HIGH );
+ } else {
+ T_eq_u32( ctx->new_priority[ 0 ], PRIO_LOW );
+ }
+
+ T_eq_u32( ctx->new_priority[ 1 ], PRIO_INVALID );
+ break;
+ }
+
+ case RtemsTaskReqSetScheduler_Post_Priority_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSetScheduler_Setup(
+ RtemsTaskReqSetScheduler_Context *ctx
+)
+{
+ rtems_status_code sc;
+ size_t i;
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_id = rtems_task_self();
+ SetSelfPriority( PRIO_NORMAL );
+
+ sc = rtems_scheduler_ident(
+ TEST_SCHEDULER_A_NAME,
+ &ctx->scheduler_a_id
+ );
+ T_rsc_success( sc );
+
+ for ( i = 0; i < RTEMS_ARRAY_SIZE( ctx->mutex_id ); ++i ) {
+ ctx->mutex_id[ i ] = CreateMutex();
+ }
+
+ for ( i = 0; i < RTEMS_ARRAY_SIZE( ctx->worker_id ); ++i ) {
+ ctx->worker_id[ i ] = CreateTask( "WORK", PRIO_HIGH - i );
+ StartTask( ctx->worker_id[ i ], Worker, ctx );
+ }
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident( TEST_SCHEDULER_B_NAME, &ctx->scheduler_b_id );
+ T_rsc_success( sc );
+
+ sc = rtems_scheduler_ident( TEST_SCHEDULER_D_NAME, &ctx->scheduler_d_id );
+ T_rsc_success( sc );
+
+ SetScheduler( ctx->worker_id[ 2 ], ctx->scheduler_b_id, PRIO_NORMAL );
+ #else
+ ctx->scheduler_b_id = INVALID_ID;
+ #endif
+}
+
+static void RtemsTaskReqSetScheduler_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqSetScheduler_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqSetScheduler_Setup( ctx );
+}
+
+static void RtemsTaskReqSetScheduler_Teardown(
+ RtemsTaskReqSetScheduler_Context *ctx
+)
+{
+ size_t i;
+
+ for ( i = 0; i < RTEMS_ARRAY_SIZE( ctx->worker_id ); ++i ) {
+ DeleteTask( ctx->worker_id[ i ] );
+ }
+
+ for ( i = 0; i < RTEMS_ARRAY_SIZE( ctx->mutex_id ); ++i ) {
+ DeleteMutex( ctx->mutex_id[ i ] );
+ }
+
+ RestoreRunnerPriority();
+}
+
+static void RtemsTaskReqSetScheduler_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqSetScheduler_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqSetScheduler_Teardown( ctx );
+}
+
+static void RtemsTaskReqSetScheduler_Action(
+ RtemsTaskReqSetScheduler_Context *ctx
+)
+{
+ rtems_status_code sc;
+
+ if ( ctx->additional_home_priority || ctx->second_eligible_scheduler ) {
+ SendEvents( ctx->worker_id[ 0 ], EVENT_OBTAIN_MUTEX_A );
+
+ if ( ctx->additional_home_priority ) {
+ SendEvents( ctx->worker_id[ 1 ], EVENT_OBTAIN_MUTEX_A );
+ }
+
+ if ( ctx->second_eligible_scheduler ) {
+ SendEvents(
+ ctx->worker_id[ 2 ],
+ EVENT_RUNNER_SYNC_0 | EVENT_OBTAIN_MUTEX_A
+ );
+ ReceiveAllEvents( EVENT_RUNNER_SYNC_0 );
+ WaitForExecutionStop( ctx->worker_id[ 2 ] );
+ }
+ }
+
+ if ( ctx->blocked && ctx->enqueued ) {
+ ObtainMutex( ctx->mutex_id[ 1 ] );
+ SendEvents( ctx->worker_id[ 0 ], EVENT_OBTAIN_MUTEX_B );
+ }
+
+ if ( !ctx->affinity_supported ) {
+ SetAffinityOne( ctx->worker_id[ 0 ], 0 );
+ }
+
+ if ( ctx->pinned ) {
+ SendEvents( ctx->worker_id[ 0 ], EVENT_PIN );
+ }
+
+ if ( !ctx->blocked ) {
+ SendEvents( ctx->worker_id[ 0 ], EVENT_SET_LOW_PRIO );
+ }
+
+ ctx->status = rtems_task_set_scheduler(
+ ctx->task_id,
+ ctx->scheduler_id,
+ ctx->priority
+ );
+
+ ctx->new_scheduler = GetScheduler( ctx->worker_id[ 0 ] );
+
+ if ( ctx->pinned ) {
+ SendEvents( ctx->worker_id[ 0 ], EVENT_UNPIN );
+ }
+
+ if ( !ctx->affinity_supported ) {
+ SetAffinityAll( ctx->worker_id[ 0 ] );
+ }
+
+ if ( ctx->blocked && ctx->enqueued ) {
+ ReleaseMutex( ctx->mutex_id[ 1 ] );
+ SendEvents( ctx->worker_id[ 0 ], EVENT_RELEASE_MUTEX_B );
+ }
+
+ if ( ctx->additional_home_priority || ctx->second_eligible_scheduler ) {
+ SendEvents( ctx->worker_id[ 0 ], EVENT_RELEASE_MUTEX_A );
+
+ if ( ctx->additional_home_priority ) {
+ SendEvents( ctx->worker_id[ 1 ], EVENT_RELEASE_MUTEX_A );
+ }
+
+ if ( ctx->second_eligible_scheduler ) {
+ SendEvents(
+ ctx->worker_id[ 2 ],
+ EVENT_RELEASE_MUTEX_A | EVENT_RUNNER_SYNC_1
+ );
+ ReceiveAllEvents( EVENT_RUNNER_SYNC_1 );
+ }
+ }
+
+ sc = rtems_task_get_priority(
+ ctx->worker_id[ 0 ],
+ ctx->scheduler_a_id,
+ &ctx->new_priority[ 0 ]
+ );
+
+ if ( sc == RTEMS_NOT_DEFINED ) {
+ ctx->new_priority[ 0 ] = PRIO_INVALID;
+ } else {
+ T_rsc_success( sc );
+ }
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_task_get_priority(
+ ctx->worker_id[ 0 ],
+ ctx->scheduler_b_id,
+ &ctx->new_priority[ 1 ]
+ );
+
+ if ( sc == RTEMS_NOT_DEFINED ) {
+ ctx->new_priority[ 1 ] = PRIO_INVALID;
+ } else {
+ T_rsc_success( sc );
+ }
+ #else
+ ctx->new_priority[ 1 ] = PRIO_INVALID;
+ #endif
+
+ if ( ctx->status == RTEMS_SUCCESSFUL ) {
+ SetScheduler( ctx->worker_id[ 0 ], ctx->scheduler_a_id, PRIO_HIGH );
+ } else if ( !ctx->blocked ) {
+ SetPriority( ctx->worker_id[ 0 ], PRIO_HIGH );
+ }
+}
+
+static const RtemsTaskReqSetScheduler_Entry
+RtemsTaskReqSetScheduler_Entries[] = {
+#if !defined(RTEMS_SMP)
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#else
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#endif
+#if !defined(RTEMS_SMP)
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#else
+ { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1,
+ RtemsTaskReqSetScheduler_Post_Status_InvId,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+#endif
+#if !defined(RTEMS_SMP)
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#else
+ { 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+ RtemsTaskReqSetScheduler_Post_Status_InvId,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+#endif
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#if !defined(RTEMS_SMP)
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqSetScheduler_Post_Status_InvPrio,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+#endif
+#if !defined(RTEMS_SMP)
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
+ RtemsTaskReqSetScheduler_Post_Status_InvId,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+#endif
+#if !defined(RTEMS_SMP)
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
+ RtemsTaskReqSetScheduler_Post_Status_InvPrio,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+#endif
+#if !defined(RTEMS_SMP)
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqSetScheduler_Post_Status_InUse,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+#endif
+ { 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1,
+ RtemsTaskReqSetScheduler_Post_Status_InvId,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+ { 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1,
+ RtemsTaskReqSetScheduler_Post_Status_InvId,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqSetScheduler_Post_Status_InvPrio,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+#if !defined(RTEMS_SMP)
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA },
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqSetScheduler_Post_Status_Unsat,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+#endif
+ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
+ RtemsTaskReqSetScheduler_Post_Status_InvId,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
+ RtemsTaskReqSetScheduler_Post_Status_InvPrio,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ RtemsTaskReqSetScheduler_Post_Status_InUse,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Nop,
+ RtemsTaskReqSetScheduler_Post_Priority_Nop },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_Ok,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Set,
+ RtemsTaskReqSetScheduler_Post_Priority_Set },
+#if !defined(RTEMS_SMP)
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_NA,
+ RtemsTaskReqSetScheduler_Post_Scheduler_NA,
+ RtemsTaskReqSetScheduler_Post_Priority_NA }
+#else
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTaskReqSetScheduler_Post_Status_Ok,
+ RtemsTaskReqSetScheduler_Post_Scheduler_Set,
+ RtemsTaskReqSetScheduler_Post_Priority_Set }
+#endif
+};
+
+static const uint8_t
+RtemsTaskReqSetScheduler_Map[] = {
+ 7, 0, 7, 0, 7, 0, 15, 3, 15, 3, 14, 3, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7,
+ 0, 7, 0, 7, 0, 14, 3, 14, 3, 14, 3, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 4, 0,
+ 4, 0, 4, 0, 10, 3, 10, 3, 10, 3, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4,
+ 0, 4, 0, 10, 3, 10, 3, 10, 3, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 4, 0, 1, 0, 1, 0,
+ 1, 0, 8, 3, 8, 3, 8, 3, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
+ 8, 3, 8, 3, 8, 3, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 8, 3,
+ 8, 3, 8, 3, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 8, 3, 8, 3,
+ 8, 3, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7,
+ 7, 7, 7, 7, 16, 11, 16, 11, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 11, 11, 11, 11, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 0, 5, 0,
+ 5, 0, 12, 3, 12, 3, 12, 3, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5,
+ 0, 12, 3, 12, 3, 12, 3, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 5, 0, 6, 0, 6, 0, 6, 0,
+ 13, 3, 13, 3, 13, 3, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0,
+ 13, 3, 13, 3, 13, 3, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 2, 0, 2, 0, 2, 0, 9,
+ 3, 9, 3, 9, 3, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 9, 3, 9,
+ 3, 9, 3, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 9, 3, 9, 3, 9,
+ 3, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 9, 3, 9, 3, 9, 3, 2,
+ 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
+};
+
+static size_t RtemsTaskReqSetScheduler_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqSetScheduler_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope(
+ RtemsTaskReqSetScheduler_PreDesc,
+ buf,
+ n,
+ ctx->Map.pcs
+ );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqSetScheduler_Fixture = {
+ .setup = RtemsTaskReqSetScheduler_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqSetScheduler_Teardown_Wrap,
+ .scope = RtemsTaskReqSetScheduler_Scope,
+ .initial_context = &RtemsTaskReqSetScheduler_Instance
+};
+
+static inline RtemsTaskReqSetScheduler_Entry RtemsTaskReqSetScheduler_PopEntry(
+ RtemsTaskReqSetScheduler_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqSetScheduler_Entries[
+ RtemsTaskReqSetScheduler_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqSetScheduler_SetPreConditionStates(
+ RtemsTaskReqSetScheduler_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+
+ if ( ctx->Map.entry.Pre_Scheduler_NA ) {
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqSetScheduler_Pre_Scheduler_NA;
+ } else {
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+ }
+
+ if ( ctx->Map.entry.Pre_SchedulerHasCPU_NA ) {
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_NA;
+ } else {
+ ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
+ }
+
+ ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ];
+
+ if ( ctx->Map.entry.Pre_Priority_NA ) {
+ ctx->Map.pcs[ 4 ] = RtemsTaskReqSetScheduler_Pre_Priority_NA;
+ } else {
+ ctx->Map.pcs[ 4 ] = ctx->Map.pci[ 4 ];
+ }
+
+ if ( ctx->Map.entry.Pre_HomePriority_NA ) {
+ ctx->Map.pcs[ 5 ] = RtemsTaskReqSetScheduler_Pre_HomePriority_NA;
+ } else {
+ ctx->Map.pcs[ 5 ] = ctx->Map.pci[ 5 ];
+ }
+
+ if ( ctx->Map.entry.Pre_EligiblePriorities_NA ) {
+ ctx->Map.pcs[ 6 ] = RtemsTaskReqSetScheduler_Pre_EligiblePriorities_NA;
+ } else {
+ ctx->Map.pcs[ 6 ] = ctx->Map.pci[ 6 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Pinned_NA ) {
+ ctx->Map.pcs[ 7 ] = RtemsTaskReqSetScheduler_Pre_Pinned_NA;
+ } else {
+ ctx->Map.pcs[ 7 ] = ctx->Map.pci[ 7 ];
+ }
+
+ if ( ctx->Map.entry.Pre_TaskState_NA ) {
+ ctx->Map.pcs[ 8 ] = RtemsTaskReqSetScheduler_Pre_TaskState_NA;
+ } else {
+ ctx->Map.pcs[ 8 ] = ctx->Map.pci[ 8 ];
+ }
+
+ if ( ctx->Map.entry.Pre_AffinitySupported_NA ) {
+ ctx->Map.pcs[ 9 ] = RtemsTaskReqSetScheduler_Pre_AffinitySupported_NA;
+ } else {
+ ctx->Map.pcs[ 9 ] = ctx->Map.pci[ 9 ];
+ }
+}
+
+static void RtemsTaskReqSetScheduler_TestVariant(
+ RtemsTaskReqSetScheduler_Context *ctx
+)
+{
+ RtemsTaskReqSetScheduler_Pre_TaskId_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqSetScheduler_Pre_Scheduler_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_Prepare(
+ ctx,
+ ctx->Map.pcs[ 2 ]
+ );
+ RtemsTaskReqSetScheduler_Pre_SchedulerId_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqSetScheduler_Pre_Priority_Prepare( ctx, ctx->Map.pcs[ 4 ] );
+ RtemsTaskReqSetScheduler_Pre_HomePriority_Prepare( ctx, ctx->Map.pcs[ 5 ] );
+ RtemsTaskReqSetScheduler_Pre_EligiblePriorities_Prepare(
+ ctx,
+ ctx->Map.pcs[ 6 ]
+ );
+ RtemsTaskReqSetScheduler_Pre_Pinned_Prepare( ctx, ctx->Map.pcs[ 7 ] );
+ RtemsTaskReqSetScheduler_Pre_TaskState_Prepare( ctx, ctx->Map.pcs[ 8 ] );
+ RtemsTaskReqSetScheduler_Pre_AffinitySupported_Prepare(
+ ctx,
+ ctx->Map.pcs[ 9 ]
+ );
+ RtemsTaskReqSetScheduler_Action( ctx );
+ RtemsTaskReqSetScheduler_Post_Status_Check(
+ ctx,
+ ctx->Map.entry.Post_Status
+ );
+ RtemsTaskReqSetScheduler_Post_Scheduler_Check(
+ ctx,
+ ctx->Map.entry.Post_Scheduler
+ );
+ RtemsTaskReqSetScheduler_Post_Priority_Check(
+ ctx,
+ ctx->Map.entry.Post_Priority
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqSetScheduler( void )
+ */
+T_TEST_CASE_FIXTURE(
+ RtemsTaskReqSetScheduler,
+ &RtemsTaskReqSetScheduler_Fixture
+)
+{
+ RtemsTaskReqSetScheduler_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqSetScheduler_Pre_TaskId_Task;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqSetScheduler_Pre_TaskId_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqSetScheduler_Pre_Scheduler_Home;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqSetScheduler_Pre_Scheduler_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ for (
+ ctx->Map.pci[ 2 ] = RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_Yes;
+ ctx->Map.pci[ 2 ] < RtemsTaskReqSetScheduler_Pre_SchedulerHasCPU_NA;
+ ++ctx->Map.pci[ 2 ]
+ ) {
+ for (
+ ctx->Map.pci[ 3 ] = RtemsTaskReqSetScheduler_Pre_SchedulerId_Scheduler;
+ ctx->Map.pci[ 3 ] < RtemsTaskReqSetScheduler_Pre_SchedulerId_NA;
+ ++ctx->Map.pci[ 3 ]
+ ) {
+ for (
+ ctx->Map.pci[ 4 ] = RtemsTaskReqSetScheduler_Pre_Priority_Valid;
+ ctx->Map.pci[ 4 ] < RtemsTaskReqSetScheduler_Pre_Priority_NA;
+ ++ctx->Map.pci[ 4 ]
+ ) {
+ for (
+ ctx->Map.pci[ 5 ] = RtemsTaskReqSetScheduler_Pre_HomePriority_Real;
+ ctx->Map.pci[ 5 ] < RtemsTaskReqSetScheduler_Pre_HomePriority_NA;
+ ++ctx->Map.pci[ 5 ]
+ ) {
+ for (
+ ctx->Map.pci[ 6 ] = RtemsTaskReqSetScheduler_Pre_EligiblePriorities_OnlyOne;
+ ctx->Map.pci[ 6 ] < RtemsTaskReqSetScheduler_Pre_EligiblePriorities_NA;
+ ++ctx->Map.pci[ 6 ]
+ ) {
+ for (
+ ctx->Map.pci[ 7 ] = RtemsTaskReqSetScheduler_Pre_Pinned_Yes;
+ ctx->Map.pci[ 7 ] < RtemsTaskReqSetScheduler_Pre_Pinned_NA;
+ ++ctx->Map.pci[ 7 ]
+ ) {
+ for (
+ ctx->Map.pci[ 8 ] = RtemsTaskReqSetScheduler_Pre_TaskState_Ready;
+ ctx->Map.pci[ 8 ] < RtemsTaskReqSetScheduler_Pre_TaskState_NA;
+ ++ctx->Map.pci[ 8 ]
+ ) {
+ for (
+ ctx->Map.pci[ 9 ] = RtemsTaskReqSetScheduler_Pre_AffinitySupported_Yes;
+ ctx->Map.pci[ 9 ] < RtemsTaskReqSetScheduler_Pre_AffinitySupported_NA;
+ ++ctx->Map.pci[ 9 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqSetScheduler_PopEntry(
+ ctx
+ );
+
+ if ( ctx->Map.entry.Skip ) {
+ continue;
+ }
+
+ RtemsTaskReqSetScheduler_SetPreConditionStates( ctx );
+ RtemsTaskReqSetScheduler_TestVariant( ctx );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-start.c b/testsuites/validation/tc-task-start.c
new file mode 100644
index 0000000000..ffb0012439
--- /dev/null
+++ b/testsuites/validation/tc-task-start.c
@@ -0,0 +1,859 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqStart
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/test-scheduler.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqStart spec:/rtems/task/req/start
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqStart_Pre_Id_Invalid,
+ RtemsTaskReqStart_Pre_Id_Task,
+ RtemsTaskReqStart_Pre_Id_NA
+} RtemsTaskReqStart_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqStart_Pre_EntryPoint_Valid,
+ RtemsTaskReqStart_Pre_EntryPoint_Null,
+ RtemsTaskReqStart_Pre_EntryPoint_NA
+} RtemsTaskReqStart_Pre_EntryPoint;
+
+typedef enum {
+ RtemsTaskReqStart_Pre_Argument_Pointer,
+ RtemsTaskReqStart_Pre_Argument_Number,
+ RtemsTaskReqStart_Pre_Argument_NA
+} RtemsTaskReqStart_Pre_Argument;
+
+typedef enum {
+ RtemsTaskReqStart_Pre_Dormant_Yes,
+ RtemsTaskReqStart_Pre_Dormant_No,
+ RtemsTaskReqStart_Pre_Dormant_NA
+} RtemsTaskReqStart_Pre_Dormant;
+
+typedef enum {
+ RtemsTaskReqStart_Pre_Suspended_Yes,
+ RtemsTaskReqStart_Pre_Suspended_No,
+ RtemsTaskReqStart_Pre_Suspended_NA
+} RtemsTaskReqStart_Pre_Suspended;
+
+typedef enum {
+ RtemsTaskReqStart_Post_Status_Ok,
+ RtemsTaskReqStart_Post_Status_InvAddr,
+ RtemsTaskReqStart_Post_Status_InvId,
+ RtemsTaskReqStart_Post_Status_IncStat,
+ RtemsTaskReqStart_Post_Status_NA
+} RtemsTaskReqStart_Post_Status;
+
+typedef enum {
+ RtemsTaskReqStart_Post_EntryPoint_Set,
+ RtemsTaskReqStart_Post_EntryPoint_Nop,
+ RtemsTaskReqStart_Post_EntryPoint_NA
+} RtemsTaskReqStart_Post_EntryPoint;
+
+typedef enum {
+ RtemsTaskReqStart_Post_Argument_Set,
+ RtemsTaskReqStart_Post_Argument_Nop,
+ RtemsTaskReqStart_Post_Argument_NA
+} RtemsTaskReqStart_Post_Argument;
+
+typedef enum {
+ RtemsTaskReqStart_Post_Unblock_Yes,
+ RtemsTaskReqStart_Post_Unblock_Nop,
+ RtemsTaskReqStart_Post_Unblock_NA
+} RtemsTaskReqStart_Post_Unblock;
+
+typedef enum {
+ RtemsTaskReqStart_Post_StartExtensions_Yes,
+ RtemsTaskReqStart_Post_StartExtensions_Nop,
+ RtemsTaskReqStart_Post_StartExtensions_NA
+} RtemsTaskReqStart_Post_StartExtensions;
+
+typedef struct {
+ uint32_t Skip : 1;
+ uint32_t Pre_Id_NA : 1;
+ uint32_t Pre_EntryPoint_NA : 1;
+ uint32_t Pre_Argument_NA : 1;
+ uint32_t Pre_Dormant_NA : 1;
+ uint32_t Pre_Suspended_NA : 1;
+ uint32_t Post_Status : 3;
+ uint32_t Post_EntryPoint : 2;
+ uint32_t Post_Argument : 2;
+ uint32_t Post_Unblock : 2;
+ uint32_t Post_StartExtensions : 2;
+} RtemsTaskReqStart_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/start test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides the scheduler operation records.
+ */
+ T_scheduler_log_2 scheduler_log;
+
+ /**
+ * @brief This member contains the identifier of a task.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief This member contains the identifier of the test user extensions.
+ */
+ rtems_id extension_id;
+
+ /**
+ * @brief This member contains the count of thread start extension calls.
+ */
+ uint32_t start_extension_calls;
+
+ /**
+ * @brief This member contains the actual argument passed to the entry point.
+ */
+ rtems_task_argument actual_argument;
+
+ /**
+ * @brief This member contains the entry point counter.
+ */
+ uint32_t counter;
+
+ /**
+ * @brief If this member is true, then the worker is started before the
+ * rtems_task_start() call.
+ */
+ bool start;
+
+ /**
+ * @brief If this member is true, then the worker is suspended before the
+ * rtems_task_start() call.
+ */
+ bool suspend;
+
+ /**
+ * @brief This member contains the return value of the rtems_task_start()
+ * call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ /**
+ * @brief This member specifies if the ``entry_point`` parameter value.
+ */
+ rtems_task_entry entry_point;
+
+ /**
+ * @brief This member specifies if the ``argument`` parameter value.
+ */
+ rtems_task_argument argument;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 5 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 5 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqStart_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqStart_Context;
+
+static RtemsTaskReqStart_Context
+ RtemsTaskReqStart_Instance;
+
+static const char * const RtemsTaskReqStart_PreDesc_Id[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqStart_PreDesc_EntryPoint[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const RtemsTaskReqStart_PreDesc_Argument[] = {
+ "Pointer",
+ "Number",
+ "NA"
+};
+
+static const char * const RtemsTaskReqStart_PreDesc_Dormant[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqStart_PreDesc_Suspended[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqStart_PreDesc[] = {
+ RtemsTaskReqStart_PreDesc_Id,
+ RtemsTaskReqStart_PreDesc_EntryPoint,
+ RtemsTaskReqStart_PreDesc_Argument,
+ RtemsTaskReqStart_PreDesc_Dormant,
+ RtemsTaskReqStart_PreDesc_Suspended,
+ NULL
+};
+
+typedef RtemsTaskReqStart_Context Context;
+
+static void WorkerA( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = &RtemsTaskReqStart_Instance;
+
+ while ( true ) {
+ ctx->actual_argument += arg;
+ ++ctx->counter;
+ Yield();
+ }
+}
+
+static void WorkerB( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = &RtemsTaskReqStart_Instance;
+
+ while ( true ) {
+ ctx->actual_argument += arg;
+ Yield();
+ }
+}
+
+static void ThreadStart( rtems_tcb *executing, rtems_tcb *started )
+{
+ (void) executing;
+ (void) started;
+
+ ++RtemsTaskReqStart_Instance.start_extension_calls;
+}
+
+static const rtems_extensions_table extensions = {
+ .thread_start = ThreadStart
+};
+
+static void RtemsTaskReqStart_Pre_Id_Prepare(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_Id_Task: {
+ /*
+ * While the ``id`` parameter is associated with a task.
+ */
+ ctx->id = ctx->worker_id;
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Pre_EntryPoint_Prepare(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Pre_EntryPoint state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Pre_EntryPoint_Valid: {
+ /*
+ * While the task entry point specified by the ``entry_point`` parameter
+ * is valid.
+ */
+ ctx->entry_point = WorkerA;
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_EntryPoint_Null: {
+ /*
+ * While the task entry point specified by the ``entry_point`` parameter
+ * is equal to NULL.
+ */
+ ctx->entry_point = NULL;
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_EntryPoint_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Pre_Argument_Prepare(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Pre_Argument state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Pre_Argument_Pointer: {
+ /*
+ * While the entry point argument specified by the ``argument`` parameter
+ * is a pointer.
+ */
+ ctx->argument = (rtems_task_argument) ctx;
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_Argument_Number: {
+ /*
+ * While the entry point argument specified by the ``argument`` parameter
+ * is a 32-bit number.
+ */
+ ctx->argument = UINT32_C( 0x87654321 );
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_Argument_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Pre_Dormant_Prepare(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Pre_Dormant state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Pre_Dormant_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is dormant.
+ */
+ ctx->start = false;
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_Dormant_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not dormant.
+ */
+ ctx->start = true;
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_Dormant_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Pre_Suspended_Prepare(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Pre_Suspended state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Pre_Suspended_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is suspended.
+ */
+ ctx->suspend = true;
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_Suspended_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not suspended.
+ */
+ ctx->suspend = false;
+ break;
+ }
+
+ case RtemsTaskReqStart_Pre_Suspended_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Post_Status_Check(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_start() shall be RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_start() shall be
+ * RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_start() shall be RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_Status_IncStat: {
+ /*
+ * The return status of rtems_task_start() shall be
+ * RTEMS_INCORRECT_STATE.
+ */
+ T_rsc( ctx->status, RTEMS_INCORRECT_STATE );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Post_EntryPoint_Check(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Post_EntryPoint state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Post_EntryPoint_Set: {
+ /*
+ * The entry point of the task specified by the ``id`` parameter shall be
+ * set to the function specified by the ``entry_point`` parameter before
+ * the task is unblocked by the rtems_task_start() call.
+ */
+ T_eq_u32( ctx->counter, 1 );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_EntryPoint_Nop: {
+ /*
+ * No entry point of a task shall be modified by the rtems_task_start()
+ * call.
+ */
+ T_eq_u32( ctx->counter, 0 );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_EntryPoint_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Post_Argument_Check(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Post_Argument state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Post_Argument_Set: {
+ /*
+ * The entry point argument of the task specified by the ``id`` parameter
+ * shall be set to the value specified by the ``argument`` parameter
+ * before the task is unblocked by the rtems_task_start() call.
+ */
+ T_eq_u32( ctx->actual_argument, ctx->argument );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_Argument_Nop: {
+ /*
+ * No entry point argument of a task shall be modified by the
+ * rtems_task_start() call.
+ */
+ T_eq_u32( ctx->actual_argument, 0 );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_Argument_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Post_Unblock_Check(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Post_Unblock state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Post_Unblock_Yes: {
+ /*
+ * The task specified by the ``id`` parameter shall be unblocked by the
+ * rtems_task_start() call.
+ */
+ T_eq_sz( ctx->scheduler_log.header.recorded, 1 );
+ T_eq_int(
+ ctx->scheduler_log.events[ 0 ].operation,
+ T_SCHEDULER_UNBLOCK
+ );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_Unblock_Nop: {
+ /*
+ * No task shall be unblocked by the rtems_task_start() call.
+ */
+ T_eq_sz( ctx->scheduler_log.header.recorded, 0 );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_Unblock_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Post_StartExtensions_Check(
+ RtemsTaskReqStart_Context *ctx,
+ RtemsTaskReqStart_Post_StartExtensions state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStart_Post_StartExtensions_Yes: {
+ /*
+ * The thread start user extensions shall be invoked by the
+ * rtems_task_start() call.
+ */
+ T_eq_u32( ctx->start_extension_calls, 1 );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_StartExtensions_Nop: {
+ /*
+ * The thread start user extensions shall not be invoked by the
+ * rtems_task_start() call.
+ */
+ T_eq_u32( ctx->start_extension_calls, 0 );
+ break;
+ }
+
+ case RtemsTaskReqStart_Post_StartExtensions_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStart_Setup( RtemsTaskReqStart_Context *ctx )
+{
+ rtems_status_code sc;
+
+ sc = rtems_extension_create(
+ rtems_build_name( 'T', 'E', 'S', 'T' ),
+ &extensions,
+ &ctx->extension_id
+ );
+ T_rsc_success( sc );
+}
+
+static void RtemsTaskReqStart_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqStart_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqStart_Setup( ctx );
+}
+
+static void RtemsTaskReqStart_Teardown( RtemsTaskReqStart_Context *ctx )
+{
+ rtems_status_code sc;
+
+ sc = rtems_extension_delete( ctx->extension_id );
+ T_rsc_success( sc );
+}
+
+static void RtemsTaskReqStart_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqStart_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqStart_Teardown( ctx );
+}
+
+static void RtemsTaskReqStart_Prepare( RtemsTaskReqStart_Context *ctx )
+{
+ ctx->actual_argument = 0;
+ ctx->counter = 0;
+ ctx->worker_id = CreateTask( "WORK", PRIO_DEFAULT );
+}
+
+static void RtemsTaskReqStart_Action( RtemsTaskReqStart_Context *ctx )
+{
+ T_scheduler_log *log;
+
+ if ( ctx->start ) {
+ StartTask( ctx->worker_id, WorkerB, 0 );
+ }
+
+ if ( ctx->suspend ) {
+ SuspendTask( ctx->worker_id );
+ }
+
+ ctx->start_extension_calls = 0;
+
+ log = T_scheduler_record_2( &ctx->scheduler_log );
+ T_null( log );
+
+ ctx->status = rtems_task_start( ctx->id, ctx->entry_point, ctx->argument );
+
+ log = T_scheduler_record( NULL );
+ T_eq_ptr( &log->header, &ctx->scheduler_log.header );
+
+ Yield();
+}
+
+static void RtemsTaskReqStart_Cleanup( RtemsTaskReqStart_Context *ctx )
+{
+ DeleteTask( ctx->worker_id );
+}
+
+static const RtemsTaskReqStart_Entry
+RtemsTaskReqStart_Entries[] = {
+ { 0, 0, 0, 0, 0, 0, RtemsTaskReqStart_Post_Status_InvAddr,
+ RtemsTaskReqStart_Post_EntryPoint_Nop, RtemsTaskReqStart_Post_Argument_Nop,
+ RtemsTaskReqStart_Post_Unblock_Nop,
+ RtemsTaskReqStart_Post_StartExtensions_Nop },
+ { 0, 0, 0, 0, 1, 1, RtemsTaskReqStart_Post_Status_InvId,
+ RtemsTaskReqStart_Post_EntryPoint_Nop, RtemsTaskReqStart_Post_Argument_Nop,
+ RtemsTaskReqStart_Post_Unblock_Nop,
+ RtemsTaskReqStart_Post_StartExtensions_Nop },
+ { 0, 0, 0, 0, 0, 0, RtemsTaskReqStart_Post_Status_Ok,
+ RtemsTaskReqStart_Post_EntryPoint_Set, RtemsTaskReqStart_Post_Argument_Set,
+ RtemsTaskReqStart_Post_Unblock_Yes,
+ RtemsTaskReqStart_Post_StartExtensions_Yes },
+ { 0, 0, 0, 0, 0, 0, RtemsTaskReqStart_Post_Status_IncStat,
+ RtemsTaskReqStart_Post_EntryPoint_Nop, RtemsTaskReqStart_Post_Argument_Nop,
+ RtemsTaskReqStart_Post_Unblock_Nop,
+ RtemsTaskReqStart_Post_StartExtensions_Nop }
+};
+
+static const uint8_t
+RtemsTaskReqStart_Map[] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 3, 3, 2, 2, 3, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0
+};
+
+static size_t RtemsTaskReqStart_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqStart_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqStart_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqStart_Fixture = {
+ .setup = RtemsTaskReqStart_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqStart_Teardown_Wrap,
+ .scope = RtemsTaskReqStart_Scope,
+ .initial_context = &RtemsTaskReqStart_Instance
+};
+
+static inline RtemsTaskReqStart_Entry RtemsTaskReqStart_PopEntry(
+ RtemsTaskReqStart_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqStart_Entries[
+ RtemsTaskReqStart_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqStart_SetPreConditionStates(
+ RtemsTaskReqStart_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+ ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
+
+ if ( ctx->Map.entry.Pre_Dormant_NA ) {
+ ctx->Map.pcs[ 3 ] = RtemsTaskReqStart_Pre_Dormant_NA;
+ } else {
+ ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ];
+ }
+
+ if ( ctx->Map.entry.Pre_Suspended_NA ) {
+ ctx->Map.pcs[ 4 ] = RtemsTaskReqStart_Pre_Suspended_NA;
+ } else {
+ ctx->Map.pcs[ 4 ] = ctx->Map.pci[ 4 ];
+ }
+}
+
+static void RtemsTaskReqStart_TestVariant( RtemsTaskReqStart_Context *ctx )
+{
+ RtemsTaskReqStart_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqStart_Pre_EntryPoint_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqStart_Pre_Argument_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqStart_Pre_Dormant_Prepare( ctx, ctx->Map.pcs[ 3 ] );
+ RtemsTaskReqStart_Pre_Suspended_Prepare( ctx, ctx->Map.pcs[ 4 ] );
+ RtemsTaskReqStart_Action( ctx );
+ RtemsTaskReqStart_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqStart_Post_EntryPoint_Check(
+ ctx,
+ ctx->Map.entry.Post_EntryPoint
+ );
+ RtemsTaskReqStart_Post_Argument_Check( ctx, ctx->Map.entry.Post_Argument );
+ RtemsTaskReqStart_Post_Unblock_Check( ctx, ctx->Map.entry.Post_Unblock );
+ RtemsTaskReqStart_Post_StartExtensions_Check(
+ ctx,
+ ctx->Map.entry.Post_StartExtensions
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqStart( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqStart, &RtemsTaskReqStart_Fixture )
+{
+ RtemsTaskReqStart_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqStart_Pre_Id_Invalid;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqStart_Pre_Id_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqStart_Pre_EntryPoint_Valid;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqStart_Pre_EntryPoint_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ for (
+ ctx->Map.pci[ 2 ] = RtemsTaskReqStart_Pre_Argument_Pointer;
+ ctx->Map.pci[ 2 ] < RtemsTaskReqStart_Pre_Argument_NA;
+ ++ctx->Map.pci[ 2 ]
+ ) {
+ for (
+ ctx->Map.pci[ 3 ] = RtemsTaskReqStart_Pre_Dormant_Yes;
+ ctx->Map.pci[ 3 ] < RtemsTaskReqStart_Pre_Dormant_NA;
+ ++ctx->Map.pci[ 3 ]
+ ) {
+ for (
+ ctx->Map.pci[ 4 ] = RtemsTaskReqStart_Pre_Suspended_Yes;
+ ctx->Map.pci[ 4 ] < RtemsTaskReqStart_Pre_Suspended_NA;
+ ++ctx->Map.pci[ 4 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqStart_PopEntry( ctx );
+ RtemsTaskReqStart_SetPreConditionStates( ctx );
+ RtemsTaskReqStart_Prepare( ctx );
+ RtemsTaskReqStart_TestVariant( ctx );
+ RtemsTaskReqStart_Cleanup( ctx );
+ }
+ }
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-storage-size.c b/testsuites/validation/tc-task-storage-size.c
new file mode 100644
index 0000000000..6ad8b72cbe
--- /dev/null
+++ b/testsuites/validation/tc-task-storage-size.c
@@ -0,0 +1,428 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqStorageSize
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqStorageSize \
+ * spec:/rtems/task/req/storage-size
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqStorageSize_Pre_Id_Invalid,
+ RtemsTaskReqStorageSize_Pre_Id_Task,
+ RtemsTaskReqStorageSize_Pre_Id_NA
+} RtemsTaskReqStorageSize_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqStorageSize_Pre_Suspended_Yes,
+ RtemsTaskReqStorageSize_Pre_Suspended_No,
+ RtemsTaskReqStorageSize_Pre_Suspended_NA
+} RtemsTaskReqStorageSize_Pre_Suspended;
+
+typedef enum {
+ RtemsTaskReqStorageSize_Post_Status_Ok,
+ RtemsTaskReqStorageSize_Post_Status_InvId,
+ RtemsTaskReqStorageSize_Post_Status_AlrdySus,
+ RtemsTaskReqStorageSize_Post_Status_NA
+} RtemsTaskReqStorageSize_Post_Status;
+
+typedef struct {
+ uint8_t Skip : 1;
+ uint8_t Pre_Id_NA : 1;
+ uint8_t Pre_Suspended_NA : 1;
+ uint8_t Post_Status : 2;
+} RtemsTaskReqStorageSize_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/storage-size test case.
+ */
+typedef struct {
+ /**
+ * @brief This member contains the identifier of a task.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief If this member is true, then the worker is suspended before the
+ * rtems_task_suspend() call.
+ */
+ bool suspend;
+
+ /**
+ * @brief This member contains the return value of the rtems_task_suspend()
+ * call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 2 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 2 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqStorageSize_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqStorageSize_Context;
+
+static RtemsTaskReqStorageSize_Context
+ RtemsTaskReqStorageSize_Instance;
+
+static const char * const RtemsTaskReqStorageSize_PreDesc_Id[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqStorageSize_PreDesc_Suspended[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqStorageSize_PreDesc[] = {
+ RtemsTaskReqStorageSize_PreDesc_Id,
+ RtemsTaskReqStorageSize_PreDesc_Suspended,
+ NULL
+};
+
+static void Worker( rtems_task_argument arg )
+{
+ while ( true ) {
+ /* Do nothing */
+ }
+}
+
+static void RtemsTaskReqStorageSize_Pre_Id_Prepare(
+ RtemsTaskReqStorageSize_Context *ctx,
+ RtemsTaskReqStorageSize_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStorageSize_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqStorageSize_Pre_Id_Task: {
+ /*
+ * While the ``id`` parameter is associated with a task.
+ */
+ ctx->id = ctx->worker_id;
+ break;
+ }
+
+ case RtemsTaskReqStorageSize_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStorageSize_Pre_Suspended_Prepare(
+ RtemsTaskReqStorageSize_Context *ctx,
+ RtemsTaskReqStorageSize_Pre_Suspended state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStorageSize_Pre_Suspended_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is suspended.
+ */
+ ctx->suspend = true;
+ break;
+ }
+
+ case RtemsTaskReqStorageSize_Pre_Suspended_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not suspended.
+ */
+ ctx->suspend = false;
+ break;
+ }
+
+ case RtemsTaskReqStorageSize_Pre_Suspended_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStorageSize_Post_Status_Check(
+ RtemsTaskReqStorageSize_Context *ctx,
+ RtemsTaskReqStorageSize_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqStorageSize_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_suspend() shall be RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqStorageSize_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_suspend() shall be RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqStorageSize_Post_Status_AlrdySus: {
+ /*
+ * The return status of rtems_task_suspend() shall be
+ * RTEMS_ALREADY_SUSPENDED.
+ */
+ T_rsc( ctx->status, RTEMS_ALREADY_SUSPENDED );
+ break;
+ }
+
+ case RtemsTaskReqStorageSize_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqStorageSize_Setup(
+ RtemsTaskReqStorageSize_Context *ctx
+)
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_LOW );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+static void RtemsTaskReqStorageSize_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqStorageSize_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqStorageSize_Setup( ctx );
+}
+
+static void RtemsTaskReqStorageSize_Teardown(
+ RtemsTaskReqStorageSize_Context *ctx
+)
+{
+ DeleteTask( ctx->worker_id );
+}
+
+static void RtemsTaskReqStorageSize_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqStorageSize_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqStorageSize_Teardown( ctx );
+}
+
+static void RtemsTaskReqStorageSize_Action(
+ RtemsTaskReqStorageSize_Context *ctx
+)
+{
+ if ( ctx->suspend ) {
+ SuspendTask( ctx->worker_id );
+ }
+
+ ctx->status = rtems_task_suspend( ctx->id );
+
+ if ( ctx->suspend ) {
+ ResumeTask( ctx->worker_id );
+ }
+}
+
+static const RtemsTaskReqStorageSize_Entry
+RtemsTaskReqStorageSize_Entries[] = {
+ { 0, 0, 1, RtemsTaskReqStorageSize_Post_Status_InvId },
+ { 0, 0, 0, RtemsTaskReqStorageSize_Post_Status_AlrdySus },
+ { 0, 0, 0, RtemsTaskReqStorageSize_Post_Status_Ok }
+};
+
+static const uint8_t
+RtemsTaskReqStorageSize_Map[] = {
+ 0, 0, 1, 2
+};
+
+static size_t RtemsTaskReqStorageSize_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqStorageSize_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope(
+ RtemsTaskReqStorageSize_PreDesc,
+ buf,
+ n,
+ ctx->Map.pcs
+ );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqStorageSize_Fixture = {
+ .setup = RtemsTaskReqStorageSize_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqStorageSize_Teardown_Wrap,
+ .scope = RtemsTaskReqStorageSize_Scope,
+ .initial_context = &RtemsTaskReqStorageSize_Instance
+};
+
+static inline RtemsTaskReqStorageSize_Entry RtemsTaskReqStorageSize_PopEntry(
+ RtemsTaskReqStorageSize_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqStorageSize_Entries[
+ RtemsTaskReqStorageSize_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqStorageSize_SetPreConditionStates(
+ RtemsTaskReqStorageSize_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+
+ if ( ctx->Map.entry.Pre_Suspended_NA ) {
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqStorageSize_Pre_Suspended_NA;
+ } else {
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+ }
+}
+
+static void RtemsTaskReqStorageSize_TestVariant(
+ RtemsTaskReqStorageSize_Context *ctx
+)
+{
+ RtemsTaskReqStorageSize_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqStorageSize_Pre_Suspended_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqStorageSize_Action( ctx );
+ RtemsTaskReqStorageSize_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqStorageSize( void )
+ */
+T_TEST_CASE_FIXTURE(
+ RtemsTaskReqStorageSize,
+ &RtemsTaskReqStorageSize_Fixture
+)
+{
+ RtemsTaskReqStorageSize_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqStorageSize_Pre_Id_Invalid;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqStorageSize_Pre_Id_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqStorageSize_Pre_Suspended_Yes;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqStorageSize_Pre_Suspended_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqStorageSize_PopEntry( ctx );
+ RtemsTaskReqStorageSize_SetPreConditionStates( ctx );
+ RtemsTaskReqStorageSize_TestVariant( ctx );
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-suspend.c b/testsuites/validation/tc-task-suspend.c
new file mode 100644
index 0000000000..b56b420120
--- /dev/null
+++ b/testsuites/validation/tc-task-suspend.c
@@ -0,0 +1,411 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqSuspend
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqSuspend spec:/rtems/task/req/suspend
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqSuspend_Pre_Id_Invalid,
+ RtemsTaskReqSuspend_Pre_Id_Task,
+ RtemsTaskReqSuspend_Pre_Id_NA
+} RtemsTaskReqSuspend_Pre_Id;
+
+typedef enum {
+ RtemsTaskReqSuspend_Pre_Suspended_Yes,
+ RtemsTaskReqSuspend_Pre_Suspended_No,
+ RtemsTaskReqSuspend_Pre_Suspended_NA
+} RtemsTaskReqSuspend_Pre_Suspended;
+
+typedef enum {
+ RtemsTaskReqSuspend_Post_Status_Ok,
+ RtemsTaskReqSuspend_Post_Status_InvId,
+ RtemsTaskReqSuspend_Post_Status_AlrdySus,
+ RtemsTaskReqSuspend_Post_Status_NA
+} RtemsTaskReqSuspend_Post_Status;
+
+typedef struct {
+ uint8_t Skip : 1;
+ uint8_t Pre_Id_NA : 1;
+ uint8_t Pre_Suspended_NA : 1;
+ uint8_t Post_Status : 2;
+} RtemsTaskReqSuspend_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/suspend test case.
+ */
+typedef struct {
+ /**
+ * @brief This member contains the identifier of a task.
+ */
+ rtems_id worker_id;
+
+ /**
+ * @brief If this member is true, then the worker is suspended before the
+ * rtems_task_suspend() call.
+ */
+ bool suspend;
+
+ /**
+ * @brief This member contains the return value of the rtems_task_suspend()
+ * call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies if the ``id`` parameter value.
+ */
+ rtems_id id;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 2 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 2 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqSuspend_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqSuspend_Context;
+
+static RtemsTaskReqSuspend_Context
+ RtemsTaskReqSuspend_Instance;
+
+static const char * const RtemsTaskReqSuspend_PreDesc_Id[] = {
+ "Invalid",
+ "Task",
+ "NA"
+};
+
+static const char * const RtemsTaskReqSuspend_PreDesc_Suspended[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqSuspend_PreDesc[] = {
+ RtemsTaskReqSuspend_PreDesc_Id,
+ RtemsTaskReqSuspend_PreDesc_Suspended,
+ NULL
+};
+
+static void Worker( rtems_task_argument arg )
+{
+ while ( true ) {
+ /* Do nothing */
+ }
+}
+
+static void RtemsTaskReqSuspend_Pre_Id_Prepare(
+ RtemsTaskReqSuspend_Context *ctx,
+ RtemsTaskReqSuspend_Pre_Id state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSuspend_Pre_Id_Invalid: {
+ /*
+ * While the ``id`` parameter is not associated with a task.
+ */
+ ctx->id = INVALID_ID;
+ break;
+ }
+
+ case RtemsTaskReqSuspend_Pre_Id_Task: {
+ /*
+ * While the ``id`` parameter is associated with a task.
+ */
+ ctx->id = ctx->worker_id;
+ break;
+ }
+
+ case RtemsTaskReqSuspend_Pre_Id_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSuspend_Pre_Suspended_Prepare(
+ RtemsTaskReqSuspend_Context *ctx,
+ RtemsTaskReqSuspend_Pre_Suspended state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSuspend_Pre_Suspended_Yes: {
+ /*
+ * While the task specified by the ``id`` parameter is suspended.
+ */
+ ctx->suspend = true;
+ break;
+ }
+
+ case RtemsTaskReqSuspend_Pre_Suspended_No: {
+ /*
+ * While the task specified by the ``id`` parameter is not suspended.
+ */
+ ctx->suspend = false;
+ break;
+ }
+
+ case RtemsTaskReqSuspend_Pre_Suspended_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSuspend_Post_Status_Check(
+ RtemsTaskReqSuspend_Context *ctx,
+ RtemsTaskReqSuspend_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqSuspend_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_suspend() shall be RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqSuspend_Post_Status_InvId: {
+ /*
+ * The return status of rtems_task_suspend() shall be RTEMS_INVALID_ID.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ID );
+ break;
+ }
+
+ case RtemsTaskReqSuspend_Post_Status_AlrdySus: {
+ /*
+ * The return status of rtems_task_suspend() shall be
+ * RTEMS_ALREADY_SUSPENDED.
+ */
+ T_rsc( ctx->status, RTEMS_ALREADY_SUSPENDED );
+ break;
+ }
+
+ case RtemsTaskReqSuspend_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqSuspend_Setup( RtemsTaskReqSuspend_Context *ctx )
+{
+ ctx->worker_id = CreateTask( "WORK", PRIO_LOW );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+static void RtemsTaskReqSuspend_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqSuspend_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqSuspend_Setup( ctx );
+}
+
+static void RtemsTaskReqSuspend_Teardown( RtemsTaskReqSuspend_Context *ctx )
+{
+ DeleteTask( ctx->worker_id );
+}
+
+static void RtemsTaskReqSuspend_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqSuspend_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqSuspend_Teardown( ctx );
+}
+
+static void RtemsTaskReqSuspend_Action( RtemsTaskReqSuspend_Context *ctx )
+{
+ if ( ctx->suspend ) {
+ SuspendTask( ctx->worker_id );
+ }
+
+ ctx->status = rtems_task_suspend( ctx->id );
+
+ if ( ctx->suspend ) {
+ ResumeTask( ctx->worker_id );
+ }
+}
+
+static const RtemsTaskReqSuspend_Entry
+RtemsTaskReqSuspend_Entries[] = {
+ { 0, 0, 1, RtemsTaskReqSuspend_Post_Status_InvId },
+ { 0, 0, 0, RtemsTaskReqSuspend_Post_Status_AlrdySus },
+ { 0, 0, 0, RtemsTaskReqSuspend_Post_Status_Ok }
+};
+
+static const uint8_t
+RtemsTaskReqSuspend_Map[] = {
+ 0, 0, 1, 2
+};
+
+static size_t RtemsTaskReqSuspend_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqSuspend_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqSuspend_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqSuspend_Fixture = {
+ .setup = RtemsTaskReqSuspend_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqSuspend_Teardown_Wrap,
+ .scope = RtemsTaskReqSuspend_Scope,
+ .initial_context = &RtemsTaskReqSuspend_Instance
+};
+
+static inline RtemsTaskReqSuspend_Entry RtemsTaskReqSuspend_PopEntry(
+ RtemsTaskReqSuspend_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqSuspend_Entries[
+ RtemsTaskReqSuspend_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqSuspend_SetPreConditionStates(
+ RtemsTaskReqSuspend_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+
+ if ( ctx->Map.entry.Pre_Suspended_NA ) {
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqSuspend_Pre_Suspended_NA;
+ } else {
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+ }
+}
+
+static void RtemsTaskReqSuspend_TestVariant( RtemsTaskReqSuspend_Context *ctx )
+{
+ RtemsTaskReqSuspend_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqSuspend_Pre_Suspended_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqSuspend_Action( ctx );
+ RtemsTaskReqSuspend_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqSuspend( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqSuspend, &RtemsTaskReqSuspend_Fixture )
+{
+ RtemsTaskReqSuspend_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqSuspend_Pre_Id_Invalid;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqSuspend_Pre_Id_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqSuspend_Pre_Suspended_Yes;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqSuspend_Pre_Suspended_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqSuspend_PopEntry( ctx );
+ RtemsTaskReqSuspend_SetPreConditionStates( ctx );
+ RtemsTaskReqSuspend_TestVariant( ctx );
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-wake-after.c b/testsuites/validation/tc-task-wake-after.c
new file mode 100644
index 0000000000..8966a14648
--- /dev/null
+++ b/testsuites/validation/tc-task-wake-after.c
@@ -0,0 +1,574 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqWakeAfter
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <rtems/test-scheduler.h>
+#include <rtems/score/threaddispatch.h>
+#include <rtems/score/timecounter.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqWakeAfter spec:/rtems/task/req/wake-after
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ * @ingroup RTEMSTestSuiteTestsuitesValidationOneCpu0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqWakeAfter_Pre_Ticks_Yield,
+ RtemsTaskReqWakeAfter_Pre_Ticks_Interval,
+ RtemsTaskReqWakeAfter_Pre_Ticks_NA
+} RtemsTaskReqWakeAfter_Pre_Ticks;
+
+typedef enum {
+ RtemsTaskReqWakeAfter_Pre_Suspended_Yes,
+ RtemsTaskReqWakeAfter_Pre_Suspended_No,
+ RtemsTaskReqWakeAfter_Pre_Suspended_NA
+} RtemsTaskReqWakeAfter_Pre_Suspended;
+
+typedef enum {
+ RtemsTaskReqWakeAfter_Post_Status_Ok,
+ RtemsTaskReqWakeAfter_Post_Status_NA
+} RtemsTaskReqWakeAfter_Post_Status;
+
+typedef enum {
+ RtemsTaskReqWakeAfter_Post_Timer_Inactive,
+ RtemsTaskReqWakeAfter_Post_Timer_Ticks,
+ RtemsTaskReqWakeAfter_Post_Timer_NA
+} RtemsTaskReqWakeAfter_Post_Timer;
+
+typedef enum {
+ RtemsTaskReqWakeAfter_Post_Expire_Relative,
+ RtemsTaskReqWakeAfter_Post_Expire_NA
+} RtemsTaskReqWakeAfter_Post_Expire;
+
+typedef enum {
+ RtemsTaskReqWakeAfter_Post_Scheduler_Block,
+ RtemsTaskReqWakeAfter_Post_Scheduler_Yield,
+ RtemsTaskReqWakeAfter_Post_Scheduler_Nop,
+ RtemsTaskReqWakeAfter_Post_Scheduler_NA
+} RtemsTaskReqWakeAfter_Post_Scheduler;
+
+typedef struct {
+ uint16_t Skip : 1;
+ uint16_t Pre_Ticks_NA : 1;
+ uint16_t Pre_Suspended_NA : 1;
+ uint16_t Post_Status : 1;
+ uint16_t Post_Timer : 2;
+ uint16_t Post_Expire : 1;
+ uint16_t Post_Scheduler : 2;
+} RtemsTaskReqWakeAfter_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/wake-after test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides the scheduler operation records.
+ */
+ T_scheduler_log_4 scheduler_log;;
+
+ /**
+ * @brief This member contains the clock tick value before the
+ * rtems_task_wake_after() call.
+ */
+ uint64_t now;;
+
+ /**
+ * @brief This member contains the worker task identifier.
+ */
+ rtems_id worker_id;;
+
+ /**
+ * @brief If this member is true, then the worker shall be suspended during
+ * the rtems_task_wake_after() call.
+ */
+ bool suspended;;
+
+ /**
+ * @brief This member contains the timer information of the worker task.
+ */
+ TaskTimerInfo timer_info;;
+
+ /**
+ * @brief This member contains the return value of the
+ * rtems_task_wake_after() call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies the ``ticks`` parameter value.
+ */
+ rtems_interval ticks;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 2 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqWakeAfter_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqWakeAfter_Context;
+
+static RtemsTaskReqWakeAfter_Context
+ RtemsTaskReqWakeAfter_Instance;
+
+static const char * const RtemsTaskReqWakeAfter_PreDesc_Ticks[] = {
+ "Yield",
+ "Interval",
+ "NA"
+};
+
+static const char * const RtemsTaskReqWakeAfter_PreDesc_Suspended[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqWakeAfter_PreDesc[] = {
+ RtemsTaskReqWakeAfter_PreDesc_Ticks,
+ RtemsTaskReqWakeAfter_PreDesc_Suspended,
+ NULL
+};
+
+typedef RtemsTaskReqWakeAfter_Context Context;
+
+static void Worker( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = (Context *) arg;
+
+ while ( true ) {
+ T_scheduler_log *log;
+
+ SuspendSelf();
+
+ ctx->now = rtems_clock_get_ticks_since_boot();
+
+ if ( ctx->suspended ) {
+ Per_CPU_Control *cpu_self;
+
+ /*
+ * The rtems_task_wake_after() disables thread dispatching to carry out
+ * its operations. While thread dispatching is disabled, when an
+ * interrupt suspends the calling task, the suspended task executes
+ * until it enables thread dispatching. We simulate this situation
+ * with the code below. Where the system was built with SMP support
+ * enabled, other processors may suspend an executing task in parallel.
+ * This case is also simulated by the code below.
+ */
+ cpu_self = _Thread_Dispatch_disable();
+ SuspendSelf();
+ cpu_self->dispatch_necessary = false;
+ _Thread_Dispatch_enable( cpu_self );
+ }
+
+ log = T_scheduler_record_4( &ctx->scheduler_log );
+ T_null( log );
+
+ ctx->status = rtems_task_wake_after( ctx->ticks );
+
+ (void) T_scheduler_record( NULL );
+ }
+}
+
+static void RtemsTaskReqWakeAfter_Pre_Ticks_Prepare(
+ RtemsTaskReqWakeAfter_Context *ctx,
+ RtemsTaskReqWakeAfter_Pre_Ticks state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeAfter_Pre_Ticks_Yield: {
+ /*
+ * While the ``ticks`` parameter is equal to RTEMS_YIELD_PROCESSOR.
+ */
+ ctx->ticks = RTEMS_YIELD_PROCESSOR;
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Pre_Ticks_Interval: {
+ /*
+ * While the ``ticks`` parameter is not equal to RTEMS_YIELD_PROCESSOR.
+ */
+ ctx->ticks = UINT32_MAX;
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Pre_Ticks_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeAfter_Pre_Suspended_Prepare(
+ RtemsTaskReqWakeAfter_Context *ctx,
+ RtemsTaskReqWakeAfter_Pre_Suspended state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeAfter_Pre_Suspended_Yes: {
+ /*
+ * While the calling task is suspended.
+ */
+ ctx->suspended = true;
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Pre_Suspended_No: {
+ /*
+ * While the calling task is not suspended.
+ */
+ ctx->suspended = false;
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Pre_Suspended_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeAfter_Post_Status_Check(
+ RtemsTaskReqWakeAfter_Context *ctx,
+ RtemsTaskReqWakeAfter_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeAfter_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_wake_after() shall be
+ * RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeAfter_Post_Timer_Check(
+ RtemsTaskReqWakeAfter_Context *ctx,
+ RtemsTaskReqWakeAfter_Post_Timer state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeAfter_Post_Timer_Inactive: {
+ /*
+ * The timer of the calling task shall be inactive.
+ */
+ T_eq_int( ctx->timer_info.state, TASK_TIMER_INACTIVE );
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Post_Timer_Ticks: {
+ /*
+ * The timer of the calling task shall be active using the clock tick.
+ */
+ T_eq_int( ctx->timer_info.state, TASK_TIMER_TICKS );
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Post_Timer_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeAfter_Post_Expire_Check(
+ RtemsTaskReqWakeAfter_Context *ctx,
+ RtemsTaskReqWakeAfter_Post_Expire state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeAfter_Post_Expire_Relative: {
+ /*
+ * The timer of the calling task shall expire at the time point specified
+ * by the sum of the current clock tick and the interval specified by the
+ * ``ticks`` parameter.
+ */
+ T_eq_u64( ctx->timer_info.expire_ticks, ctx->now + UINT32_MAX );
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Post_Expire_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeAfter_Post_Scheduler_Check(
+ RtemsTaskReqWakeAfter_Context *ctx,
+ RtemsTaskReqWakeAfter_Post_Scheduler state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeAfter_Post_Scheduler_Block: {
+ /*
+ * The calling task shall be blocked by the scheduler exactly once by the
+ * rtems_task_wake_after() call.
+ */
+ T_eq_sz( ctx->scheduler_log.header.recorded, 1 );
+ T_eq_int(
+ ctx->scheduler_log.events[ 0 ].operation,
+ T_SCHEDULER_BLOCK
+ );
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Post_Scheduler_Yield: {
+ /*
+ * The calling task shall yield by the scheduler exactly once by the
+ * rtems_task_wake_after() call.
+ */
+ T_eq_sz( ctx->scheduler_log.header.recorded, 1 );
+ T_eq_int(
+ ctx->scheduler_log.events[ 0 ].operation,
+ T_SCHEDULER_YIELD
+ );
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Post_Scheduler_Nop: {
+ /*
+ * The calling task shall not carry out a scheduler operation through the
+ * rtems_task_wake_after() call.
+ */
+ T_eq_sz( ctx->scheduler_log.header.recorded, 0 );
+ break;
+ }
+
+ case RtemsTaskReqWakeAfter_Post_Scheduler_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeAfter_Setup( RtemsTaskReqWakeAfter_Context *ctx )
+{
+ SetSelfPriority( PRIO_NORMAL );
+ ctx->worker_id = CreateTask( "WORK", PRIO_HIGH );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+static void RtemsTaskReqWakeAfter_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqWakeAfter_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqWakeAfter_Setup( ctx );
+}
+
+static void RtemsTaskReqWakeAfter_Teardown(
+ RtemsTaskReqWakeAfter_Context *ctx
+)
+{
+ DeleteTask( ctx->worker_id );
+ RestoreRunnerPriority();
+}
+
+static void RtemsTaskReqWakeAfter_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqWakeAfter_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqWakeAfter_Teardown( ctx );
+}
+
+static void RtemsTaskReqWakeAfter_Prepare( RtemsTaskReqWakeAfter_Context *ctx )
+{
+ ctx->status = RTEMS_NOT_IMPLEMENTED;
+}
+
+static void RtemsTaskReqWakeAfter_Action( RtemsTaskReqWakeAfter_Context *ctx )
+{
+ ResumeTask( ctx->worker_id );
+ (void) T_scheduler_record( NULL );
+ GetTaskTimerInfo( ctx->worker_id, &ctx->timer_info );
+
+ if ( ctx->suspended ) {
+ ResumeTask( ctx->worker_id );
+ }
+
+ FinalClockTick();
+}
+
+static const RtemsTaskReqWakeAfter_Entry
+RtemsTaskReqWakeAfter_Entries[] = {
+ { 0, 0, 0, RtemsTaskReqWakeAfter_Post_Status_Ok,
+ RtemsTaskReqWakeAfter_Post_Timer_Inactive,
+ RtemsTaskReqWakeAfter_Post_Expire_NA,
+ RtemsTaskReqWakeAfter_Post_Scheduler_Nop },
+ { 0, 0, 0, RtemsTaskReqWakeAfter_Post_Status_Ok,
+ RtemsTaskReqWakeAfter_Post_Timer_Inactive,
+ RtemsTaskReqWakeAfter_Post_Expire_NA,
+ RtemsTaskReqWakeAfter_Post_Scheduler_Yield },
+ { 0, 0, 0, RtemsTaskReqWakeAfter_Post_Status_Ok,
+ RtemsTaskReqWakeAfter_Post_Timer_Ticks,
+ RtemsTaskReqWakeAfter_Post_Expire_Relative,
+ RtemsTaskReqWakeAfter_Post_Scheduler_Nop },
+ { 0, 0, 0, RtemsTaskReqWakeAfter_Post_Status_Ok,
+ RtemsTaskReqWakeAfter_Post_Timer_Ticks,
+ RtemsTaskReqWakeAfter_Post_Expire_Relative,
+ RtemsTaskReqWakeAfter_Post_Scheduler_Block }
+};
+
+static const uint8_t
+RtemsTaskReqWakeAfter_Map[] = {
+ 0, 1, 2, 3
+};
+
+static size_t RtemsTaskReqWakeAfter_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqWakeAfter_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqWakeAfter_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqWakeAfter_Fixture = {
+ .setup = RtemsTaskReqWakeAfter_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqWakeAfter_Teardown_Wrap,
+ .scope = RtemsTaskReqWakeAfter_Scope,
+ .initial_context = &RtemsTaskReqWakeAfter_Instance
+};
+
+static inline RtemsTaskReqWakeAfter_Entry RtemsTaskReqWakeAfter_PopEntry(
+ RtemsTaskReqWakeAfter_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqWakeAfter_Entries[
+ RtemsTaskReqWakeAfter_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqWakeAfter_TestVariant(
+ RtemsTaskReqWakeAfter_Context *ctx
+)
+{
+ RtemsTaskReqWakeAfter_Pre_Ticks_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqWakeAfter_Pre_Suspended_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqWakeAfter_Action( ctx );
+ RtemsTaskReqWakeAfter_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqWakeAfter_Post_Timer_Check( ctx, ctx->Map.entry.Post_Timer );
+ RtemsTaskReqWakeAfter_Post_Expire_Check( ctx, ctx->Map.entry.Post_Expire );
+ RtemsTaskReqWakeAfter_Post_Scheduler_Check(
+ ctx,
+ ctx->Map.entry.Post_Scheduler
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqWakeAfter( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqWakeAfter, &RtemsTaskReqWakeAfter_Fixture )
+{
+ RtemsTaskReqWakeAfter_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pcs[ 0 ] = RtemsTaskReqWakeAfter_Pre_Ticks_Yield;
+ ctx->Map.pcs[ 0 ] < RtemsTaskReqWakeAfter_Pre_Ticks_NA;
+ ++ctx->Map.pcs[ 0 ]
+ ) {
+ for (
+ ctx->Map.pcs[ 1 ] = RtemsTaskReqWakeAfter_Pre_Suspended_Yes;
+ ctx->Map.pcs[ 1 ] < RtemsTaskReqWakeAfter_Pre_Suspended_NA;
+ ++ctx->Map.pcs[ 1 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqWakeAfter_PopEntry( ctx );
+ RtemsTaskReqWakeAfter_Prepare( ctx );
+ RtemsTaskReqWakeAfter_TestVariant( ctx );
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task-wake-when.c b/testsuites/validation/tc-task-wake-when.c
new file mode 100644
index 0000000000..223fbfd55f
--- /dev/null
+++ b/testsuites/validation/tc-task-wake-when.c
@@ -0,0 +1,665 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskReqWakeWhen
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <string.h>
+#include <rtems/test-scheduler.h>
+#include <rtems/score/timecounter.h>
+
+#include "tx-support.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskReqWakeWhen spec:/rtems/task/req/wake-when
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @{
+ */
+
+typedef enum {
+ RtemsTaskReqWakeWhen_Pre_TODSet_Yes,
+ RtemsTaskReqWakeWhen_Pre_TODSet_No,
+ RtemsTaskReqWakeWhen_Pre_TODSet_NA
+} RtemsTaskReqWakeWhen_Pre_TODSet;
+
+typedef enum {
+ RtemsTaskReqWakeWhen_Pre_TOD_Valid,
+ RtemsTaskReqWakeWhen_Pre_TOD_Null,
+ RtemsTaskReqWakeWhen_Pre_TOD_NA
+} RtemsTaskReqWakeWhen_Pre_TOD;
+
+typedef enum {
+ RtemsTaskReqWakeWhen_Pre_TODObj_Future,
+ RtemsTaskReqWakeWhen_Pre_TODObj_PastOrNow,
+ RtemsTaskReqWakeWhen_Pre_TODObj_Invalid,
+ RtemsTaskReqWakeWhen_Pre_TODObj_NA
+} RtemsTaskReqWakeWhen_Pre_TODObj;
+
+typedef enum {
+ RtemsTaskReqWakeWhen_Post_Status_Ok,
+ RtemsTaskReqWakeWhen_Post_Status_NotDef,
+ RtemsTaskReqWakeWhen_Post_Status_InvAddr,
+ RtemsTaskReqWakeWhen_Post_Status_InvClock,
+ RtemsTaskReqWakeWhen_Post_Status_NA
+} RtemsTaskReqWakeWhen_Post_Status;
+
+typedef enum {
+ RtemsTaskReqWakeWhen_Post_Timer_Inactive,
+ RtemsTaskReqWakeWhen_Post_Timer_Realtime,
+ RtemsTaskReqWakeWhen_Post_Timer_NA
+} RtemsTaskReqWakeWhen_Post_Timer;
+
+typedef enum {
+ RtemsTaskReqWakeWhen_Post_Expire_Absolute,
+ RtemsTaskReqWakeWhen_Post_Expire_NA
+} RtemsTaskReqWakeWhen_Post_Expire;
+
+typedef enum {
+ RtemsTaskReqWakeWhen_Post_Scheduler_Block,
+ RtemsTaskReqWakeWhen_Post_Scheduler_Nop,
+ RtemsTaskReqWakeWhen_Post_Scheduler_NA
+} RtemsTaskReqWakeWhen_Post_Scheduler;
+
+typedef struct {
+ uint16_t Skip : 1;
+ uint16_t Pre_TODSet_NA : 1;
+ uint16_t Pre_TOD_NA : 1;
+ uint16_t Pre_TODObj_NA : 1;
+ uint16_t Post_Status : 3;
+ uint16_t Post_Timer : 2;
+ uint16_t Post_Expire : 1;
+ uint16_t Post_Scheduler : 2;
+} RtemsTaskReqWakeWhen_Entry;
+
+/**
+ * @brief Test context for spec:/rtems/task/req/wake-when test case.
+ */
+typedef struct {
+ /**
+ * @brief This member provides the scheduler operation records.
+ */
+ T_scheduler_log_4 scheduler_log;;
+
+ /**
+ * @brief This member contains the CLOCK_REALTIME value before the
+ * rtems_task_wake_when() call.
+ */
+ struct timespec now;;
+
+ /**
+ * @brief This member contains the worker task identifier.
+ */
+ rtems_id worker_id;;
+
+ /**
+ * @brief This member contains the timer information of the worker task.
+ */
+ TaskTimerInfo timer_info;;
+
+ /**
+ * @brief This member provides the object referenced by the ``time_buffer``
+ * parameter.
+ */
+ rtems_time_of_day tod_obj;
+
+ /**
+ * @brief This member contains the return value of the rtems_task_wake_when()
+ * call.
+ */
+ rtems_status_code status;
+
+ /**
+ * @brief This member specifies the ``time_buffer`` parameter value.
+ */
+ const rtems_time_of_day *tod;
+
+ struct {
+ /**
+ * @brief This member defines the pre-condition indices for the next
+ * action.
+ */
+ size_t pci[ 3 ];
+
+ /**
+ * @brief This member defines the pre-condition states for the next action.
+ */
+ size_t pcs[ 3 ];
+
+ /**
+ * @brief If this member is true, then the test action loop is executed.
+ */
+ bool in_action_loop;
+
+ /**
+ * @brief This member contains the next transition map index.
+ */
+ size_t index;
+
+ /**
+ * @brief This member contains the current transition map entry.
+ */
+ RtemsTaskReqWakeWhen_Entry entry;
+
+ /**
+ * @brief If this member is true, then the current transition variant
+ * should be skipped.
+ */
+ bool skip;
+ } Map;
+} RtemsTaskReqWakeWhen_Context;
+
+static RtemsTaskReqWakeWhen_Context
+ RtemsTaskReqWakeWhen_Instance;
+
+static const char * const RtemsTaskReqWakeWhen_PreDesc_TODSet[] = {
+ "Yes",
+ "No",
+ "NA"
+};
+
+static const char * const RtemsTaskReqWakeWhen_PreDesc_TOD[] = {
+ "Valid",
+ "Null",
+ "NA"
+};
+
+static const char * const RtemsTaskReqWakeWhen_PreDesc_TODObj[] = {
+ "Future",
+ "PastOrNow",
+ "Invalid",
+ "NA"
+};
+
+static const char * const * const RtemsTaskReqWakeWhen_PreDesc[] = {
+ RtemsTaskReqWakeWhen_PreDesc_TODSet,
+ RtemsTaskReqWakeWhen_PreDesc_TOD,
+ RtemsTaskReqWakeWhen_PreDesc_TODObj,
+ NULL
+};
+
+typedef RtemsTaskReqWakeWhen_Context Context;
+
+static void SetTOD( rtems_time_of_day *tod, uint32_t year )
+{
+ memset( tod, 0, sizeof( *tod ) );
+ tod->year = year;
+ tod->month = 1;
+ tod->day = 1;
+}
+
+static void Worker( rtems_task_argument arg )
+{
+ Context *ctx;
+
+ ctx = (Context *) arg;
+
+ while ( true ) {
+ T_scheduler_log *log;
+
+ SuspendSelf();
+
+ log = T_scheduler_record_4( &ctx->scheduler_log );
+ T_null( log );
+
+ _Timecounter_Getnanotime( &ctx->now );
+
+ ctx->status = rtems_task_wake_when( ctx->tod );
+
+ (void) T_scheduler_record( NULL );
+ }
+}
+
+static void RtemsTaskReqWakeWhen_Pre_TODSet_Prepare(
+ RtemsTaskReqWakeWhen_Context *ctx,
+ RtemsTaskReqWakeWhen_Pre_TODSet state
+)
+{
+ rtems_status_code sc;
+ rtems_time_of_day tod;
+
+ switch ( state ) {
+ case RtemsTaskReqWakeWhen_Pre_TODSet_Yes: {
+ /*
+ * While the CLOCK_REALTIME was set at least once.
+ */
+ SetTOD( &tod, 2000 );
+ sc = rtems_clock_set( &tod );
+ T_rsc_success( sc );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Pre_TODSet_No: {
+ /*
+ * While the CLOCK_REALTIME was never set.
+ */
+ UnsetClock();
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Pre_TODSet_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeWhen_Pre_TOD_Prepare(
+ RtemsTaskReqWakeWhen_Context *ctx,
+ RtemsTaskReqWakeWhen_Pre_TOD state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeWhen_Pre_TOD_Valid: {
+ /*
+ * While the ``time_buffer`` parameter references an object of type
+ * rtems_time_of_day.
+ */
+ ctx->tod = &ctx->tod_obj;
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Pre_TOD_Null: {
+ /*
+ * While the ``time_buffer`` parameter is equal to NULL.
+ */
+ ctx->tod = NULL;
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Pre_TOD_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeWhen_Pre_TODObj_Prepare(
+ RtemsTaskReqWakeWhen_Context *ctx,
+ RtemsTaskReqWakeWhen_Pre_TODObj state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeWhen_Pre_TODObj_Future: {
+ /*
+ * While the object referenced by the ``time_buffer`` parameter specifies
+ * a valid time of day in the future.
+ */
+ SetTOD( &ctx->tod_obj, 2010 );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Pre_TODObj_PastOrNow: {
+ /*
+ * While the object referenced by the ``time_buffer`` parameter specifies
+ * a valid time of day in the past or at the time of the
+ * rtems_task_wake_when() call.
+ */
+ SetTOD( &ctx->tod_obj, 1990 );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Pre_TODObj_Invalid: {
+ /*
+ * While the object referenced by the ``time_buffer`` parameter specifies
+ * an invalid time of day.
+ */
+ memset( &ctx->tod_obj, 0xff, sizeof( ctx->tod_obj ) );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Pre_TODObj_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeWhen_Post_Status_Check(
+ RtemsTaskReqWakeWhen_Context *ctx,
+ RtemsTaskReqWakeWhen_Post_Status state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeWhen_Post_Status_Ok: {
+ /*
+ * The return status of rtems_task_wake_when() shall be RTEMS_SUCCESSFUL.
+ */
+ T_rsc_success( ctx->status );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Post_Status_NotDef: {
+ /*
+ * The return status of rtems_task_wake_when() shall be
+ * RTEMS_NOT_DEFINED.
+ */
+ T_rsc( ctx->status, RTEMS_NOT_DEFINED );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Post_Status_InvAddr: {
+ /*
+ * The return status of rtems_task_wake_when() shall be
+ * RTEMS_INVALID_ADDRESS.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Post_Status_InvClock: {
+ /*
+ * The return status of rtems_task_wake_when() shall be
+ * RTEMS_INVALID_CLOCK.
+ */
+ T_rsc( ctx->status, RTEMS_INVALID_CLOCK );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Post_Status_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeWhen_Post_Timer_Check(
+ RtemsTaskReqWakeWhen_Context *ctx,
+ RtemsTaskReqWakeWhen_Post_Timer state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeWhen_Post_Timer_Inactive: {
+ /*
+ * The timer of the calling task shall be inactive.
+ */
+ T_eq_int( ctx->timer_info.state, TASK_TIMER_INACTIVE );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Post_Timer_Realtime: {
+ /*
+ * The timer of the calling task shall be active using the
+ * CLOCK_REALTIME.
+ */
+ T_eq_int( ctx->timer_info.state, TASK_TIMER_REALTIME );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Post_Timer_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeWhen_Post_Expire_Check(
+ RtemsTaskReqWakeWhen_Context *ctx,
+ RtemsTaskReqWakeWhen_Post_Expire state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeWhen_Post_Expire_Absolute: {
+ /*
+ * The timer of the calling task shall expire at the time point specified
+ * by the ``time_buffer`` parameter.
+ */
+ T_eq_i64( ctx->timer_info.expire_timespec.tv_sec, 1262304000 );
+ T_eq_long( ctx->timer_info.expire_timespec.tv_nsec, 0 );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Post_Expire_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeWhen_Post_Scheduler_Check(
+ RtemsTaskReqWakeWhen_Context *ctx,
+ RtemsTaskReqWakeWhen_Post_Scheduler state
+)
+{
+ switch ( state ) {
+ case RtemsTaskReqWakeWhen_Post_Scheduler_Block: {
+ /*
+ * The calling task shall be blocked by the scheduler exactly once by the
+ * rtems_task_wake_when() call.
+ */
+ T_eq_sz( ctx->scheduler_log.header.recorded, 1 );
+ T_eq_int(
+ ctx->scheduler_log.events[ 0 ].operation,
+ T_SCHEDULER_BLOCK
+ );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Post_Scheduler_Nop: {
+ /*
+ * The calling task shall not be altered by the scheduler by the
+ * rtems_task_wake_when() call.
+ */
+ T_eq_sz( ctx->scheduler_log.header.recorded, 0 );
+ break;
+ }
+
+ case RtemsTaskReqWakeWhen_Post_Scheduler_NA:
+ break;
+ }
+}
+
+static void RtemsTaskReqWakeWhen_Setup( RtemsTaskReqWakeWhen_Context *ctx )
+{
+ SetSelfPriority( PRIO_NORMAL );
+ ctx->worker_id = CreateTask( "WORK", PRIO_HIGH );
+ StartTask( ctx->worker_id, Worker, ctx );
+}
+
+static void RtemsTaskReqWakeWhen_Setup_Wrap( void *arg )
+{
+ RtemsTaskReqWakeWhen_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqWakeWhen_Setup( ctx );
+}
+
+static void RtemsTaskReqWakeWhen_Teardown( RtemsTaskReqWakeWhen_Context *ctx )
+{
+ DeleteTask( ctx->worker_id );
+ RestoreRunnerPriority();
+}
+
+static void RtemsTaskReqWakeWhen_Teardown_Wrap( void *arg )
+{
+ RtemsTaskReqWakeWhen_Context *ctx;
+
+ ctx = arg;
+ ctx->Map.in_action_loop = false;
+ RtemsTaskReqWakeWhen_Teardown( ctx );
+}
+
+static void RtemsTaskReqWakeWhen_Prepare( RtemsTaskReqWakeWhen_Context *ctx )
+{
+ ctx->status = RTEMS_NOT_IMPLEMENTED;
+}
+
+static void RtemsTaskReqWakeWhen_Action( RtemsTaskReqWakeWhen_Context *ctx )
+{
+ ResumeTask( ctx->worker_id );
+ (void) T_scheduler_record( NULL );
+ GetTaskTimerInfo( ctx->worker_id, &ctx->timer_info );
+ FinalClockTick();
+}
+
+static const RtemsTaskReqWakeWhen_Entry
+RtemsTaskReqWakeWhen_Entries[] = {
+ { 0, 0, 0, 1, RtemsTaskReqWakeWhen_Post_Status_InvAddr,
+ RtemsTaskReqWakeWhen_Post_Timer_Inactive,
+ RtemsTaskReqWakeWhen_Post_Expire_NA,
+ RtemsTaskReqWakeWhen_Post_Scheduler_Nop },
+ { 0, 0, 0, 0, RtemsTaskReqWakeWhen_Post_Status_NotDef,
+ RtemsTaskReqWakeWhen_Post_Timer_Inactive,
+ RtemsTaskReqWakeWhen_Post_Expire_NA,
+ RtemsTaskReqWakeWhen_Post_Scheduler_Nop },
+ { 0, 0, 0, 1, RtemsTaskReqWakeWhen_Post_Status_NotDef,
+ RtemsTaskReqWakeWhen_Post_Timer_Inactive,
+ RtemsTaskReqWakeWhen_Post_Expire_NA,
+ RtemsTaskReqWakeWhen_Post_Scheduler_Nop },
+ { 0, 0, 0, 0, RtemsTaskReqWakeWhen_Post_Status_InvClock,
+ RtemsTaskReqWakeWhen_Post_Timer_Inactive,
+ RtemsTaskReqWakeWhen_Post_Expire_NA,
+ RtemsTaskReqWakeWhen_Post_Scheduler_Nop },
+ { 0, 0, 0, 0, RtemsTaskReqWakeWhen_Post_Status_Ok,
+ RtemsTaskReqWakeWhen_Post_Timer_Realtime,
+ RtemsTaskReqWakeWhen_Post_Expire_Absolute,
+ RtemsTaskReqWakeWhen_Post_Scheduler_Block }
+};
+
+static const uint8_t
+RtemsTaskReqWakeWhen_Map[] = {
+ 4, 3, 3, 0, 0, 0, 1, 1, 1, 2, 2, 2
+};
+
+static size_t RtemsTaskReqWakeWhen_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsTaskReqWakeWhen_Context *ctx;
+
+ ctx = arg;
+
+ if ( ctx->Map.in_action_loop ) {
+ return T_get_scope( RtemsTaskReqWakeWhen_PreDesc, buf, n, ctx->Map.pcs );
+ }
+
+ return 0;
+}
+
+static T_fixture RtemsTaskReqWakeWhen_Fixture = {
+ .setup = RtemsTaskReqWakeWhen_Setup_Wrap,
+ .stop = NULL,
+ .teardown = RtemsTaskReqWakeWhen_Teardown_Wrap,
+ .scope = RtemsTaskReqWakeWhen_Scope,
+ .initial_context = &RtemsTaskReqWakeWhen_Instance
+};
+
+static inline RtemsTaskReqWakeWhen_Entry RtemsTaskReqWakeWhen_PopEntry(
+ RtemsTaskReqWakeWhen_Context *ctx
+)
+{
+ size_t index;
+
+ index = ctx->Map.index;
+ ctx->Map.index = index + 1;
+ return RtemsTaskReqWakeWhen_Entries[
+ RtemsTaskReqWakeWhen_Map[ index ]
+ ];
+}
+
+static void RtemsTaskReqWakeWhen_SetPreConditionStates(
+ RtemsTaskReqWakeWhen_Context *ctx
+)
+{
+ ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
+ ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
+
+ if ( ctx->Map.entry.Pre_TODObj_NA ) {
+ ctx->Map.pcs[ 2 ] = RtemsTaskReqWakeWhen_Pre_TODObj_NA;
+ } else {
+ ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
+ }
+}
+
+static void RtemsTaskReqWakeWhen_TestVariant(
+ RtemsTaskReqWakeWhen_Context *ctx
+)
+{
+ RtemsTaskReqWakeWhen_Pre_TODSet_Prepare( ctx, ctx->Map.pcs[ 0 ] );
+ RtemsTaskReqWakeWhen_Pre_TOD_Prepare( ctx, ctx->Map.pcs[ 1 ] );
+ RtemsTaskReqWakeWhen_Pre_TODObj_Prepare( ctx, ctx->Map.pcs[ 2 ] );
+ RtemsTaskReqWakeWhen_Action( ctx );
+ RtemsTaskReqWakeWhen_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
+ RtemsTaskReqWakeWhen_Post_Timer_Check( ctx, ctx->Map.entry.Post_Timer );
+ RtemsTaskReqWakeWhen_Post_Expire_Check( ctx, ctx->Map.entry.Post_Expire );
+ RtemsTaskReqWakeWhen_Post_Scheduler_Check(
+ ctx,
+ ctx->Map.entry.Post_Scheduler
+ );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskReqWakeWhen( void )
+ */
+T_TEST_CASE_FIXTURE( RtemsTaskReqWakeWhen, &RtemsTaskReqWakeWhen_Fixture )
+{
+ RtemsTaskReqWakeWhen_Context *ctx;
+
+ ctx = T_fixture_context();
+ ctx->Map.in_action_loop = true;
+ ctx->Map.index = 0;
+
+ for (
+ ctx->Map.pci[ 0 ] = RtemsTaskReqWakeWhen_Pre_TODSet_Yes;
+ ctx->Map.pci[ 0 ] < RtemsTaskReqWakeWhen_Pre_TODSet_NA;
+ ++ctx->Map.pci[ 0 ]
+ ) {
+ for (
+ ctx->Map.pci[ 1 ] = RtemsTaskReqWakeWhen_Pre_TOD_Valid;
+ ctx->Map.pci[ 1 ] < RtemsTaskReqWakeWhen_Pre_TOD_NA;
+ ++ctx->Map.pci[ 1 ]
+ ) {
+ for (
+ ctx->Map.pci[ 2 ] = RtemsTaskReqWakeWhen_Pre_TODObj_Future;
+ ctx->Map.pci[ 2 ] < RtemsTaskReqWakeWhen_Pre_TODObj_NA;
+ ++ctx->Map.pci[ 2 ]
+ ) {
+ ctx->Map.entry = RtemsTaskReqWakeWhen_PopEntry( ctx );
+ RtemsTaskReqWakeWhen_SetPreConditionStates( ctx );
+ RtemsTaskReqWakeWhen_Prepare( ctx );
+ RtemsTaskReqWakeWhen_TestVariant( ctx );
+ }
+ }
+ }
+}
+
+/** @} */
diff --git a/testsuites/validation/tc-task.c b/testsuites/validation/tc-task.c
new file mode 100644
index 0000000000..068c807a34
--- /dev/null
+++ b/testsuites/validation/tc-task.c
@@ -0,0 +1,305 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsTaskValTask
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+#include <string.h>
+#include <rtems/score/apimutex.h>
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsTaskValTask spec:/rtems/task/val/task
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationNoClock0
+ *
+ * @brief This test case collection provides validation test cases for
+ * requirements of the @ref RTEMSAPIClassicTasks.
+ *
+ * This test case performs the following actions:
+ *
+ * - Call rtems_task_self() check the returned value.
+ *
+ * - Check that the returned value is equal to the object identifier of the
+ * calling task.
+ *
+ * - Call rtems_task_iterate() with a visitor which always returns false.
+ *
+ * - Check that the all counter is equal to the count of tasks. Check that
+ * the calling task was visited exacly once. Firstly, this shows that
+ * rtems_task_iterate() used the parameters specified by ``visitor`` and
+ * ``arg``. Secondly, this shows that the iteration was done over all
+ * tasks.
+ *
+ * - Check that the object alloctor mutex was not owned before and after the
+ * call. Check that the object alloctor mutex was owned during the
+ * iteration.
+ *
+ * - Call rtems_task_iterate() with a visitor which returns true.
+ *
+ * - Check that the all counter is equal to one. This shows that the
+ * iteration stops when the visitor returns true.
+ *
+ * - Assert that RTEMS_TASK_STORAGE_ALIGNMENT is a constant expression which
+ * evaluates to the expected value.
+ *
+ * - Assert that RTEMS_NO_PRIORITY is a constant expression which evaluates to
+ * the expected value.
+ *
+ * - Assert that RTEMS_MINIMUM_STACK_SIZE is a constant expression which
+ * evaluates to the expected value.
+ *
+ * - Assert that RTEMS_CONFIGURED_MINIMUM_STACK_SIZE is a constant expression
+ * which evaluates to the expected value.
+ *
+ * - Assert that RTEMS_MINIMUM_PRIORITY is a constant expression which
+ * evaluates to the expected value.
+ *
+ * - Validate RTEMS_SELF using a sample directive call.
+ *
+ * - Check that rtems_task_is_suspended() returns the expected status if
+ * called with a task identifier parameter of RTEMS_SELF.
+ *
+ * @{
+ */
+
+typedef struct {
+ bool owner_before;
+ bool owner_in_visitor;
+ bool owner_after;
+ uint32_t counter_all;
+ uint32_t counter_self;
+ bool done;
+} TaskIterateContext;
+
+static bool TaskVisitor( rtems_tcb *tcb, void *arg )
+{
+ TaskIterateContext *ctx;
+
+ ctx = arg;
+ ++ctx->counter_all;
+
+ if ( rtems_task_self() == tcb->Object.id ) {
+ ++ctx->counter_self;
+ }
+
+ ctx->owner_in_visitor = _RTEMS_Allocator_is_owner();
+
+ return ctx->done;
+}
+
+/**
+ * @brief Call rtems_task_self() check the returned value.
+ */
+static void RtemsTaskValTask_Action_0( void )
+{
+ rtems_id id;
+
+ id = rtems_task_self();
+
+ /*
+ * Check that the returned value is equal to the object identifier of the
+ * calling task.
+ */
+ T_step_eq_u32( 0, id, 0x0a010001 );
+}
+
+/**
+ * @brief Call rtems_task_iterate() with a visitor which always returns false.
+ */
+static void RtemsTaskValTask_Action_1( void )
+{
+ TaskIterateContext ctx;
+ uint32_t task_count;
+
+ task_count = rtems_scheduler_get_processor_maximum();
+
+ if ( task_count > 4 ) {
+ task_count = 4;
+ }
+
+ ++task_count;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+ ctx.owner_before = _RTEMS_Allocator_is_owner();
+ rtems_task_iterate( TaskVisitor, &ctx );
+ ctx.owner_after = _RTEMS_Allocator_is_owner();
+
+ /*
+ * Check that the all counter is equal to the count of tasks. Check that the
+ * calling task was visited exacly once. Firstly, this shows that
+ * rtems_task_iterate() used the parameters specified by ``visitor`` and
+ * ``arg``. Secondly, this shows that the iteration was done over all tasks.
+ */
+ T_step_eq_u32( 1, ctx.counter_all, task_count );
+ T_step_eq_u32( 2, ctx.counter_self, 1 );
+
+ /*
+ * Check that the object alloctor mutex was not owned before and after the
+ * call. Check that the object alloctor mutex was owned during the
+ * iteration.
+ */
+ T_step_false( 3, ctx.owner_before );
+ T_step_true( 4, ctx.owner_in_visitor );
+ T_step_false( 5, ctx.owner_after );
+}
+
+/**
+ * @brief Call rtems_task_iterate() with a visitor which returns true.
+ */
+static void RtemsTaskValTask_Action_2( void )
+{
+ TaskIterateContext ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+ ctx.done = true;
+ rtems_task_iterate( TaskVisitor, &ctx );
+
+ /*
+ * Check that the all counter is equal to one. This shows that the iteration
+ * stops when the visitor returns true.
+ */
+ T_step_eq_u32( 6, ctx.counter_all, 1 );
+}
+
+/**
+ * @brief Assert that RTEMS_TASK_STORAGE_ALIGNMENT is a constant expression
+ * which evaluates to the expected value.
+ */
+static void RtemsTaskValTask_Action_3( void )
+{
+ RTEMS_STATIC_ASSERT(
+ RTEMS_TASK_STORAGE_ALIGNMENT == CPU_STACK_ALIGNMENT,
+ STORAGE_ALIGNMENT
+ );
+}
+
+/**
+ * @brief Assert that RTEMS_NO_PRIORITY is a constant expression which
+ * evaluates to the expected value.
+ */
+static void RtemsTaskValTask_Action_4( void )
+{
+ RTEMS_STATIC_ASSERT(
+ RTEMS_NO_PRIORITY == RTEMS_CURRENT_PRIORITY,
+ NO_PRIORITY
+ );
+}
+
+/**
+ * @brief Assert that RTEMS_MINIMUM_STACK_SIZE is a constant expression which
+ * evaluates to the expected value.
+ */
+static void RtemsTaskValTask_Action_5( void )
+{
+ RTEMS_STATIC_ASSERT(
+ RTEMS_MINIMUM_STACK_SIZE == STACK_MINIMUM_SIZE,
+ MINIMUM_STACK_SIZE
+ );
+}
+
+/**
+ * @brief Assert that RTEMS_CONFIGURED_MINIMUM_STACK_SIZE is a constant
+ * expression which evaluates to the expected value.
+ */
+static void RtemsTaskValTask_Action_6( void )
+{
+ RTEMS_STATIC_ASSERT(
+ RTEMS_CONFIGURED_MINIMUM_STACK_SIZE == 0,
+ CONFIGURED_MINIMUM_STACK_SIZE
+ );
+}
+
+/**
+ * @brief Assert that RTEMS_MINIMUM_PRIORITY is a constant expression which
+ * evaluates to the expected value.
+ */
+static void RtemsTaskValTask_Action_7( void )
+{
+ RTEMS_STATIC_ASSERT( RTEMS_MINIMUM_PRIORITY == 1, MINIMUM_PRIORITY );
+}
+
+/**
+ * @brief Validate RTEMS_SELF using a sample directive call.
+ */
+static void RtemsTaskValTask_Action_8( void )
+{
+ rtems_status_code sc;
+
+ /*
+ * Check that rtems_task_is_suspended() returns the expected status if called
+ * with a task identifier parameter of RTEMS_SELF.
+ */
+ sc = rtems_task_is_suspended( RTEMS_SELF );
+ T_step_rsc_success( 7, sc );
+}
+
+/**
+ * @fn void T_case_body_RtemsTaskValTask( void )
+ */
+T_TEST_CASE( RtemsTaskValTask )
+{
+ T_plan( 8 );
+
+ RtemsTaskValTask_Action_0();
+ RtemsTaskValTask_Action_1();
+ RtemsTaskValTask_Action_2();
+ RtemsTaskValTask_Action_3();
+ RtemsTaskValTask_Action_4();
+ RtemsTaskValTask_Action_5();
+ RtemsTaskValTask_Action_6();
+ RtemsTaskValTask_Action_7();
+ RtemsTaskValTask_Action_8();
+}
+
+/** @} */
diff --git a/testsuites/validation/ts-validation-one-cpu-1.c b/testsuites/validation/ts-validation-one-cpu-1.c
new file mode 100644
index 0000000000..e1be3ddd02
--- /dev/null
+++ b/testsuites/validation/ts-validation-one-cpu-1.c
@@ -0,0 +1,80 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidationOneCpu1
+ */
+
+/*
+ * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestSuiteTestsuitesValidationOneCpu1 \
+ * spec:/testsuites/validation-one-cpu-1
+ *
+ * @ingroup RTEMSTestSuites
+ *
+ * @brief This general purpose validation test suite provides enough resources
+ * to run basic tests with exactly one processor and without a Clock Driver.
+ *
+ * Two test suites of this configuration are provided to limit test run
+ * duration.
+ *
+ * @{
+ */
+
+const char rtems_test_name[] = "ValidationOneCpu1";
+
+#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_PROCESSORS 1
+
+#include "ts-default.h"
+
+/** @} */