diff options
Diffstat (limited to '')
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" + +/** @} */ |