Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:53

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RTEMSTestSuitesValidation
0007  *
0008  * @brief This header file provides the default validation test suite runner
0009  *   and application configuration.
0010  */
0011 
0012 /*
0013  * Copyright (C) 2020 embedded brains GmbH & Co. KG
0014  *
0015  * Redistribution and use in source and binary forms, with or without
0016  * modification, are permitted provided that the following conditions
0017  * are met:
0018  * 1. Redistributions of source code must retain the above copyright
0019  *    notice, this list of conditions and the following disclaimer.
0020  * 2. Redistributions in binary form must reproduce the above copyright
0021  *    notice, this list of conditions and the following disclaimer in the
0022  *    documentation and/or other materials provided with the distribution.
0023  *
0024  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0025  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0026  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0027  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0028  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0029  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0030  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0031  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0032  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0033  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0034  * POSSIBILITY OF SUCH DAMAGE.
0035  */
0036 
0037 #include <bsp.h>
0038 #include <rtems/bspIo.h>
0039 #include <rtems/chain.h>
0040 #include <rtems/test-info.h>
0041 #include <rtems/testopts.h>
0042 
0043 #include <rtems/test.h>
0044 #include <rtems/test-scheduler.h>
0045 
0046 #include "ts-config.h"
0047 #include "tx-support.h"
0048 
0049 #if !defined( MAX_TLS_SIZE )
0050 #define MAX_TLS_SIZE TEST_MAXIMUM_TLS_SIZE
0051 #endif
0052 
0053 #define MAX_TASKS ( TEST_MAXIMUM_TASKS - 1 )
0054 
0055 #define TASK_ATTRIBUTES RTEMS_FLOATING_POINT
0056 
0057 #define TASK_STORAGE_SIZE \
0058   RTEMS_TASK_STORAGE_SIZE( \
0059     MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE + \
0060       CPU_STACK_ALIGNMENT - CPU_HEAP_ALIGNMENT, \
0061     TASK_ATTRIBUTES \
0062   )
0063 
0064 static char buffer[ 512 ];
0065 
0066 static const T_action actions[] = {
0067   T_report_hash_sha256,
0068   T_memory_action,
0069   T_check_task_context,
0070   T_check_rtems_barriers,
0071   T_check_rtems_extensions,
0072   T_check_rtems_message_queues,
0073   T_check_rtems_partitions,
0074   T_check_rtems_periods,
0075   T_check_rtems_semaphores,
0076   T_check_rtems_tasks,
0077   T_check_rtems_timers
0078 };
0079 
0080 static const T_config test_config = {
0081   .name = rtems_test_name,
0082   .buf = buffer,
0083   .buf_size = sizeof( buffer ),
0084   .putchar = rtems_put_char,
0085   .verbosity = RTEMS_TEST_VERBOSITY,
0086 #if defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER)
0087   .now = T_now_clock,
0088 #else
0089   .now = T_now_tick,
0090 #endif
0091   .allocate = T_memory_allocate,
0092   .deallocate = T_memory_deallocate,
0093   .action_count = T_ARRAY_SIZE( actions ),
0094   .actions = actions
0095 };
0096 
0097 static rtems_chain_control free_task_storage =
0098   RTEMS_CHAIN_INITIALIZER_EMPTY( free_task_storage );
0099 
0100 static union {
0101   RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) char
0102     storage[ TASK_STORAGE_SIZE ];
0103   rtems_chain_node node;
0104 } task_storage[ MAX_TASKS ];
0105 
0106 rtems_task_argument test_runner_argument;
0107 
0108 rtems_task_priority test_runner_initial_priority;
0109 
0110 rtems_mode test_runner_initial_modes;
0111 
0112 static void Runner( rtems_task_argument arg )
0113 {
0114   int exit_code;
0115 
0116   test_runner_argument = arg;
0117 
0118   (void) rtems_task_mode(
0119     RTEMS_ASR,
0120     RTEMS_ASR_MASK,
0121     &test_runner_initial_modes
0122   );
0123 
0124   (void) rtems_task_set_priority(
0125     RTEMS_SELF,
0126     PRIO_DEFAULT,
0127     &test_runner_initial_priority
0128   );
0129 
0130   rtems_chain_initialize(
0131     &free_task_storage,
0132     task_storage,
0133     RTEMS_ARRAY_SIZE( task_storage ),
0134     sizeof( task_storage[ 0 ] )
0135   );
0136 
0137   rtems_test_begin( rtems_test_name, TEST_STATE );
0138   T_register();
0139   exit_code = T_main( &test_config );
0140 
0141   if ( exit_code == 0 ) {
0142     rtems_test_end( rtems_test_name );
0143   }
0144 
0145   rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, (uint32_t) exit_code );
0146 }
0147 
0148 void *test_task_stack_allocate( size_t size )
0149 {
0150   if ( size > sizeof( task_storage[ 0 ] ) ) {
0151     return NULL;
0152   }
0153 
0154   T_quiet_ge_sz( size, TEST_MINIMUM_STACK_SIZE );
0155 
0156   return rtems_chain_get_unprotected( &free_task_storage );
0157 }
0158 
0159 void test_task_stack_deallocate( void *stack )
0160 {
0161   rtems_chain_append_unprotected(
0162     &free_task_storage,
0163     (rtems_chain_node *) stack
0164   );
0165 }
0166 
0167 #if !defined( CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER )
0168 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0169 #endif
0170 
0171 #define CONFIGURE_MINIMUM_TASK_STACK_SIZE TEST_MINIMUM_STACK_SIZE
0172 
0173 #define CONFIGURE_INTERRUPT_STACK_SIZE TEST_INTERRUPT_STACK_SIZE
0174 
0175 #define CONFIGURE_MAXIMUM_BARRIERS TEST_MAXIMUM_BARRIERS
0176 
0177 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES TEST_MAXIMUM_MESSAGE_QUEUES
0178 
0179 #define CONFIGURE_MAXIMUM_PARTITIONS TEST_MAXIMUM_PARTITIONS
0180 
0181 #define CONFIGURE_MAXIMUM_PERIODS TEST_MAXIMUM_PERIODS
0182 
0183 #define CONFIGURE_MAXIMUM_SEMAPHORES TEST_MAXIMUM_SEMAPHORES
0184 
0185 #define CONFIGURE_MAXIMUM_TASKS TEST_MAXIMUM_TASKS
0186 
0187 #define CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE \
0188   CONFIGURE_MAXIMUM_TASKS
0189 
0190 #define CONFIGURE_MAXIMUM_TIMERS TEST_MAXIMUM_TIMERS
0191 
0192 #define CONFIGURE_MAXIMUM_USER_EXTENSIONS TEST_MAXIMUM_USER_EXTENSIONS
0193 
0194 #define CONFIGURE_MICROSECONDS_PER_TICK TEST_MICROSECONDS_PER_TICK
0195 
0196 #define CONFIGURE_TICKS_PER_TIMESLICE TEST_TICKS_PER_TIMESLICE
0197 
0198 #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 0
0199 
0200 #define CONFIGURE_DISABLE_NEWLIB_REENTRANCY
0201 
0202 #define CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
0203 
0204 #define CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE MAX_TLS_SIZE
0205 
0206 #define CONFIGURE_TASK_STACK_ALLOCATOR_AVOIDS_WORK_SPACE
0207 
0208 #define CONFIGURE_TASK_STACK_ALLOCATOR test_task_stack_allocate
0209 
0210 #define CONFIGURE_TASK_STACK_DEALLOCATOR test_task_stack_deallocate
0211 
0212 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0213 
0214 #define CONFIGURE_INIT_TASK_ARGUMENTS TEST_RUNNER_ARGUMENT
0215 
0216 #define CONFIGURE_INIT_TASK_ATTRIBUTES ( RTEMS_SYSTEM_TASK | TASK_ATTRIBUTES )
0217 
0218 #define CONFIGURE_INIT_TASK_CONSTRUCT_STORAGE_SIZE TASK_STORAGE_SIZE
0219 
0220 #define CONFIGURE_INIT_TASK_ENTRY_POINT Runner
0221 
0222 #define CONFIGURE_INIT_TASK_INITIAL_MODES TEST_RUNNER_INITIAL_MODES
0223 
0224 #define CONFIGURE_INIT_TASK_NAME TEST_RUNNER_NAME
0225 
0226 #define CONFIGURE_INIT_TASK_PRIORITY 0
0227 
0228 #if !defined( CONFIGURE_INITIAL_EXTENSIONS )
0229 #define CONFIGURE_INITIAL_EXTENSIONS { .fatal = FatalInitialExtension }
0230 #endif
0231 
0232 #if defined( RTEMS_SMP ) && \
0233   ( CONFIGURE_MAXIMUM_PROCESSORS == 4 || CONFIGURE_MAXIMUM_PROCESSORS == 5 )
0234 
0235 #include <rtems/score/scheduleredfsmp.h>
0236 
0237 const Scheduler_Operations
0238 T_scheduler_operations[ CONFIGURE_MAXIMUM_PROCESSORS ] = {
0239    SCHEDULER_EDF_SMP_ENTRY_POINTS,
0240    SCHEDULER_EDF_SMP_ENTRY_POINTS,
0241    SCHEDULER_EDF_SMP_ENTRY_POINTS,
0242 #if CONFIGURE_MAXIMUM_PROCESSORS >= 5
0243    SCHEDULER_EDF_SMP_ENTRY_POINTS,
0244 #endif
0245    SCHEDULER_EDF_SMP_ENTRY_POINTS
0246 };
0247 
0248 #undef SCHEDULER_EDF_SMP_ENTRY_POINTS
0249 
0250 #define SCHEDULER_EDF_SMP_ENTRY_POINTS T_SCHEDULER_ENTRY_POINTS
0251 
0252 #define CONFIGURE_SCHEDULER_EDF_SMP
0253 
0254 #include <rtems/scheduler.h>
0255 
0256 RTEMS_SCHEDULER_EDF_SMP( a );
0257 
0258 RTEMS_SCHEDULER_EDF_SMP( b );
0259 
0260 RTEMS_SCHEDULER_EDF_SMP( c );
0261 
0262 RTEMS_SCHEDULER_EDF_SMP( d );
0263 
0264 #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0265   RTEMS_SCHEDULER_TABLE_EDF_SMP( a, TEST_SCHEDULER_A_NAME ), \
0266   RTEMS_SCHEDULER_TABLE_EDF_SMP( b, TEST_SCHEDULER_B_NAME ), \
0267   RTEMS_SCHEDULER_TABLE_EDF_SMP( c, TEST_SCHEDULER_C_NAME ), \
0268   RTEMS_SCHEDULER_TABLE_EDF_SMP( d, TEST_SCHEDULER_D_NAME )
0269 
0270 #if CONFIGURE_MAXIMUM_PROCESSORS == 5
0271 #define CONFIGURE_SCHEDULER_ASSIGNMENTS \
0272   RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
0273   RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0274   RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0275   RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0276   RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER
0277 #else
0278 #define CONFIGURE_SCHEDULER_ASSIGNMENTS \
0279   RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
0280   RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0281   RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0282   RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
0283 #endif
0284 
0285 #elif !defined( CONFIGURE_SCHEDULER_ASSIGNMENTS )
0286 
0287 #include <rtems/score/schedulerpriority.h>
0288 
0289 #undef CONFIGURE_MAXIMUM_PROCESSORS
0290 #define CONFIGURE_MAXIMUM_PROCESSORS 1
0291 
0292 const Scheduler_Operations
0293 T_scheduler_operations[ CONFIGURE_MAXIMUM_PROCESSORS ] = {
0294    SCHEDULER_PRIORITY_ENTRY_POINTS
0295 };
0296 
0297 #undef SCHEDULER_PRIORITY_ENTRY_POINTS
0298 
0299 #define SCHEDULER_PRIORITY_ENTRY_POINTS T_SCHEDULER_ENTRY_POINTS
0300 
0301 #define CONFIGURE_SCHEDULER_PRIORITY
0302 
0303 #if defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
0304 
0305 #include <rtems/scheduler.h>
0306 
0307 RTEMS_SCHEDULER_PRIORITY( a, 64 );
0308 
0309 #else /* CONFIGURE_SCHEDULER_TABLE_ENTRIES */
0310 
0311 #define CONFIGURE_SCHEDULER_NAME TEST_SCHEDULER_A_NAME
0312 
0313 #define CONFIGURE_MAXIMUM_PRIORITY 127
0314 
0315 #endif /* CONFIGURE_SCHEDULER_TABLE_ENTRIES */
0316 
0317 #endif
0318 
0319 #define CONFIGURE_IDLE_TASK_STACK_SIZE TEST_IDLE_STACK_SIZE
0320 
0321 static char test_idle_stacks[ CONFIGURE_MAXIMUM_PROCESSORS ][
0322   RTEMS_ALIGN_UP(
0323     MAX_TLS_SIZE + TEST_IDLE_STACK_SIZE + CPU_IDLE_TASK_IS_FP * CONTEXT_FP_SIZE,
0324     CPU_INTERRUPT_STACK_ALIGNMENT
0325   )
0326 ]
0327 RTEMS_ALIGNED( CPU_INTERRUPT_STACK_ALIGNMENT )
0328 RTEMS_SECTION( ".rtemsstack.idle" );
0329 
0330 void *test_idle_task_stack_allocate( uint32_t cpu_index, size_t *size )
0331 {
0332   if ( *size > sizeof( test_idle_stacks[ 0 ] ) ) {
0333     rtems_fatal( RTEMS_FATAL_SOURCE_APPLICATION, 0xABAD1DEA );
0334   }
0335 
0336   return &test_idle_stacks[ cpu_index ][0];
0337 }
0338 
0339 #define CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE test_idle_task_stack_allocate
0340 
0341 #define CONFIGURE_INIT
0342 
0343 #include <rtems/confdefs.h>