Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RTEMSTestSuitesValidation
0007  *
0008  * @brief This header file provides a configurable validation test suite runner
0009  *   and application configuration for fatal error tests which occur during
0010  *   system initialization.
0011  */
0012 
0013 /*
0014  * Copyright (C) 2021 embedded brains GmbH & Co. KG
0015  *
0016  * Redistribution and use in source and binary forms, with or without
0017  * modification, are permitted provided that the following conditions
0018  * are met:
0019  * 1. Redistributions of source code must retain the above copyright
0020  *    notice, this list of conditions and the following disclaimer.
0021  * 2. Redistributions in binary form must reproduce the above copyright
0022  *    notice, this list of conditions and the following disclaimer in the
0023  *    documentation and/or other materials provided with the distribution.
0024  *
0025  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0026  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0027  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0028  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0029  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0030  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0031  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0032  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0033  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0034  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0035  * POSSIBILITY OF SUCH DAMAGE.
0036  */
0037 
0038 #include <rtems.h>
0039 #include <rtems/bspIo.h>
0040 #include <rtems/sysinit.h>
0041 #include <rtems/test-info.h>
0042 #include <rtems/testopts.h>
0043 #include <rtems/score/atomic.h>
0044 
0045 #include <rtems/test.h>
0046 
0047 #include "tx-support.h"
0048 
0049 static char buffer[ 512 ];
0050 
0051 static const T_action actions[] = {
0052   T_report_hash_sha256
0053 };
0054 
0055 static const T_config test_config = {
0056   .name = rtems_test_name,
0057   .buf = buffer,
0058   .buf_size = sizeof( buffer ),
0059   .putchar = rtems_put_char,
0060   .verbosity = RTEMS_TEST_VERBOSITY,
0061 #if defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER)
0062   .now = T_now_clock,
0063 #else
0064   .now = T_now_tick,
0065 #endif
0066   .allocate = T_memory_allocate,
0067   .deallocate = T_memory_deallocate,
0068   .action_count = T_ARRAY_SIZE( actions ),
0069   .actions = actions
0070 };
0071 
0072 static Atomic_Uint counter;
0073 
0074 static void TestSuiteFatalExtension(
0075   rtems_fatal_source source,
0076   bool always_set_to_false,
0077   rtems_fatal_code code
0078 )
0079 {
0080   rtems_fatal_code exit_code;
0081 
0082   (void) always_set_to_false;
0083 
0084   if ( source == RTEMS_FATAL_SOURCE_EXIT ) {
0085     return;
0086   }
0087 
0088   if ( _Atomic_Fetch_add_uint( &counter, 1, ATOMIC_ORDER_RELAXED ) != 0 ) {
0089     return;
0090   }
0091 
0092   T_make_runner();
0093   FATAL_SYSINIT_RUN( source, code );
0094 
0095   if ( T_run_finalize() ) {
0096     rtems_test_end( rtems_test_name );
0097     exit_code = 0;
0098   } else {
0099     exit_code = 1;
0100   }
0101 
0102 #if defined(FATAL_SYSINIT_EXIT)
0103   FATAL_SYSINIT_EXIT( exit_code );
0104 #else
0105   rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, exit_code );
0106 #endif
0107 }
0108 
0109 static void TestRunInitialize( void )
0110 {
0111   rtems_test_begin( rtems_test_name, TEST_STATE );
0112   T_run_initialize( &test_config );
0113 }
0114 
0115 RTEMS_SYSINIT_ITEM(
0116   TestRunInitialize,
0117   RTEMS_SYSINIT_BSP_EARLY,
0118   RTEMS_SYSINIT_ORDER_FIRST
0119 );
0120 
0121 #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 0
0122 
0123 #define CONFIGURE_DISABLE_NEWLIB_REENTRANCY
0124 
0125 #define CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
0126 
0127 #ifdef FATAL_SYSINIT_INITIAL_EXTENSION
0128 #define OPTIONAL_FATAL_SYSINIT_INITIAL_EXTENSION FATAL_SYSINIT_INITIAL_EXTENSION,
0129 #else
0130 #define OPTIONAL_FATAL_SYSINIT_INITIAL_EXTENSION
0131 #endif
0132 
0133 #define CONFIGURE_INITIAL_EXTENSIONS \
0134   OPTIONAL_FATAL_SYSINIT_INITIAL_EXTENSION \
0135   { .fatal = FatalInitialExtension }, \
0136   { .fatal = TestSuiteFatalExtension }
0137 
0138 #define CONFIGURE_IDLE_TASK_STORAGE_SIZE RTEMS_MINIMUM_STACK_SIZE
0139 
0140 #if !defined(CONFIGURE_RTEMS_INIT_TASKS_TABLE)
0141 
0142 #define CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION
0143 
0144 #if !defined(CONFIGURE_IDLE_TASK_BODY)
0145 
0146 #define CONFIGURE_IDLE_TASK_BODY IdleBody
0147 
0148 void *IdleBody( uintptr_t ignored )
0149 {
0150   (void) ignored;
0151 
0152   rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, 1 );
0153 }
0154 
0155 #endif /* CONFIGURE_IDLE_TASK_BODY */
0156 
0157 #endif /* CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION */
0158 
0159 #define CONFIGURE_INIT
0160 
0161 #include <rtems/confdefs.h>