source: rtems/testsuites/validation/ts-default.h @ 2846b17

Last change on this file since 2846b17 was 2846b17, checked in by Sebastian Huber <sebastian.huber@…>, on 09/26/22 at 07:31:29

config: Changeable size for IDLE stack allocator

Allow the IDLE stack allocator to change the stack size. This can be
used by applications with a very dynamic thread-local storage size to
adjust the thread storage area of the IDLE tasks dynamically.

Update #4524.

  • Property mode set to 100644
File size: 9.3 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @brief This header file provides the default validation test suite runner
7 *   and application configuration.
8 */
9
10/*
11 * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 *    notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 *    notice, this list of conditions and the following disclaimer in the
20 *    documentation and/or other materials provided with the distribution.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#include <bsp.h>
36#include <rtems/bspIo.h>
37#include <rtems/chain.h>
38#include <rtems/test-info.h>
39#include <rtems/testopts.h>
40
41#include <rtems/test.h>
42#include <rtems/test-scheduler.h>
43
44#include "ts-config.h"
45#include "tx-support.h"
46
47#if !defined( MAX_TLS_SIZE )
48#define MAX_TLS_SIZE TEST_MAXIMUM_TLS_SIZE
49#endif
50
51#define MAX_TASKS ( TEST_MAXIMUM_TASKS - 1 )
52
53#define TASK_ATTRIBUTES RTEMS_FLOATING_POINT
54
55#define TASK_STORAGE_SIZE \
56  RTEMS_TASK_STORAGE_SIZE( \
57    MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE + \
58      CPU_STACK_ALIGNMENT - CPU_HEAP_ALIGNMENT, \
59    TASK_ATTRIBUTES \
60  )
61
62static char buffer[ 512 ];
63
64static const T_action actions[] = {
65  T_report_hash_sha256,
66  T_memory_action,
67  T_check_task_context,
68  T_check_rtems_barriers,
69  T_check_rtems_extensions,
70  T_check_rtems_message_queues,
71  T_check_rtems_partitions,
72  T_check_rtems_periods,
73  T_check_rtems_semaphores,
74  T_check_rtems_tasks,
75  T_check_rtems_timers
76};
77
78static const T_config test_config = {
79  .name = rtems_test_name,
80  .buf = buffer,
81  .buf_size = sizeof( buffer ),
82  .putchar = rtems_put_char,
83  .verbosity = RTEMS_TEST_VERBOSITY,
84#if defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER)
85  .now = T_now_clock,
86#else
87  .now = T_now_tick,
88#endif
89  .allocate = T_memory_allocate,
90  .deallocate = T_memory_deallocate,
91  .action_count = T_ARRAY_SIZE( actions ),
92  .actions = actions
93};
94
95static rtems_chain_control free_task_storage =
96  RTEMS_CHAIN_INITIALIZER_EMPTY( free_task_storage );
97
98static union {
99  RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) char
100    storage[ TASK_STORAGE_SIZE ];
101  rtems_chain_node node;
102} task_storage[ MAX_TASKS ];
103
104rtems_task_argument test_runner_argument;
105
106rtems_task_priority test_runner_initial_priority;
107
108rtems_mode test_runner_initial_modes;
109
110static void Runner( rtems_task_argument arg )
111{
112  int exit_code;
113
114  test_runner_argument = arg;
115
116  (void) rtems_task_mode(
117    RTEMS_ASR,
118    RTEMS_ASR_MASK,
119    &test_runner_initial_modes
120  );
121
122  (void) rtems_task_set_priority(
123    RTEMS_SELF,
124    PRIO_DEFAULT,
125    &test_runner_initial_priority
126  );
127
128  rtems_chain_initialize(
129    &free_task_storage,
130    task_storage,
131    RTEMS_ARRAY_SIZE( task_storage ),
132    sizeof( task_storage[ 0 ] )
133  );
134
135  rtems_test_begin( rtems_test_name, TEST_STATE );
136  T_register();
137  exit_code = T_main( &test_config );
138
139  if ( exit_code == 0 ) {
140    rtems_test_end( rtems_test_name );
141  }
142
143  rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, (uint32_t) exit_code );
144}
145
146void *test_task_stack_allocate( size_t size )
147{
148  if ( size > sizeof( task_storage[ 0 ] ) ) {
149    return NULL;
150  }
151
152  T_quiet_ge_sz( size, TEST_MINIMUM_STACK_SIZE );
153
154  return rtems_chain_get_unprotected( &free_task_storage );
155}
156
157void test_task_stack_deallocate( void *stack )
158{
159  rtems_chain_append_unprotected(
160    &free_task_storage,
161    (rtems_chain_node *) stack
162  );
163}
164
165#if !defined( CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER )
166#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
167#endif
168
169#define CONFIGURE_MINIMUM_TASK_STACK_SIZE TEST_MINIMUM_STACK_SIZE
170
171#define CONFIGURE_INTERRUPT_STACK_SIZE TEST_INTERRUPT_STACK_SIZE
172
173#define CONFIGURE_MAXIMUM_BARRIERS TEST_MAXIMUM_BARRIERS
174
175#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES TEST_MAXIMUM_MESSAGE_QUEUES
176
177#define CONFIGURE_MAXIMUM_PARTITIONS TEST_MAXIMUM_PARTITIONS
178
179#define CONFIGURE_MAXIMUM_PERIODS TEST_MAXIMUM_PERIODS
180
181#define CONFIGURE_MAXIMUM_SEMAPHORES TEST_MAXIMUM_SEMAPHORES
182
183#define CONFIGURE_MAXIMUM_TASKS TEST_MAXIMUM_TASKS
184
185#define CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE \
186  CONFIGURE_MAXIMUM_TASKS
187
188#define CONFIGURE_MAXIMUM_TIMERS TEST_MAXIMUM_TIMERS
189
190#define CONFIGURE_MAXIMUM_USER_EXTENSIONS TEST_MAXIMUM_USER_EXTENSIONS
191
192#define CONFIGURE_MICROSECONDS_PER_TICK TEST_MICROSECONDS_PER_TICK
193
194#define CONFIGURE_TICKS_PER_TIMESLICE TEST_TICKS_PER_TIMESLICE
195
196#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 0
197
198#define CONFIGURE_DISABLE_NEWLIB_REENTRANCY
199
200#define CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
201
202#define CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE MAX_TLS_SIZE
203
204#define CONFIGURE_TASK_STACK_ALLOCATOR_AVOIDS_WORK_SPACE
205
206#define CONFIGURE_TASK_STACK_ALLOCATOR test_task_stack_allocate
207
208#define CONFIGURE_TASK_STACK_DEALLOCATOR test_task_stack_deallocate
209
210#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
211
212#define CONFIGURE_INIT_TASK_ARGUMENTS TEST_RUNNER_ARGUMENT
213
214#define CONFIGURE_INIT_TASK_ATTRIBUTES ( RTEMS_SYSTEM_TASK | TASK_ATTRIBUTES )
215
216#define CONFIGURE_INIT_TASK_CONSTRUCT_STORAGE_SIZE TASK_STORAGE_SIZE
217
218#define CONFIGURE_INIT_TASK_ENTRY_POINT Runner
219
220#define CONFIGURE_INIT_TASK_INITIAL_MODES TEST_RUNNER_INITIAL_MODES
221
222#define CONFIGURE_INIT_TASK_NAME TEST_RUNNER_NAME
223
224#define CONFIGURE_INIT_TASK_PRIORITY 0
225
226#if !defined( CONFIGURE_INITIAL_EXTENSIONS )
227#define CONFIGURE_INITIAL_EXTENSIONS { .fatal = FatalInitialExtension }
228#endif
229
230#if defined( RTEMS_SMP ) && \
231  ( CONFIGURE_MAXIMUM_PROCESSORS == 4 || CONFIGURE_MAXIMUM_PROCESSORS == 5 )
232
233#include <rtems/score/scheduleredfsmp.h>
234
235const Scheduler_Operations
236T_scheduler_operations[ CONFIGURE_MAXIMUM_PROCESSORS ] = {
237   SCHEDULER_EDF_SMP_ENTRY_POINTS,
238   SCHEDULER_EDF_SMP_ENTRY_POINTS,
239   SCHEDULER_EDF_SMP_ENTRY_POINTS,
240#if CONFIGURE_MAXIMUM_PROCESSORS >= 5
241   SCHEDULER_EDF_SMP_ENTRY_POINTS,
242#endif
243   SCHEDULER_EDF_SMP_ENTRY_POINTS
244};
245
246#undef SCHEDULER_EDF_SMP_ENTRY_POINTS
247
248#define SCHEDULER_EDF_SMP_ENTRY_POINTS T_SCHEDULER_ENTRY_POINTS
249
250#define CONFIGURE_SCHEDULER_EDF_SMP
251
252#include <rtems/scheduler.h>
253
254RTEMS_SCHEDULER_EDF_SMP( a );
255
256RTEMS_SCHEDULER_EDF_SMP( b );
257
258RTEMS_SCHEDULER_EDF_SMP( c );
259
260RTEMS_SCHEDULER_EDF_SMP( d );
261
262#define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
263  RTEMS_SCHEDULER_TABLE_EDF_SMP( a, TEST_SCHEDULER_A_NAME ), \
264  RTEMS_SCHEDULER_TABLE_EDF_SMP( b, TEST_SCHEDULER_B_NAME ), \
265  RTEMS_SCHEDULER_TABLE_EDF_SMP( c, TEST_SCHEDULER_C_NAME ), \
266  RTEMS_SCHEDULER_TABLE_EDF_SMP( d, TEST_SCHEDULER_D_NAME )
267
268#if CONFIGURE_MAXIMUM_PROCESSORS == 5
269#define CONFIGURE_SCHEDULER_ASSIGNMENTS \
270  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
271  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
272  RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
273  RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
274  RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER
275#else
276#define CONFIGURE_SCHEDULER_ASSIGNMENTS \
277  RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
278  RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
279  RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
280  RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
281#endif
282
283#elif !defined( CONFIGURE_SCHEDULER_ASSIGNMENTS )
284
285#include <rtems/score/schedulerpriority.h>
286
287#undef CONFIGURE_MAXIMUM_PROCESSORS
288#define CONFIGURE_MAXIMUM_PROCESSORS 1
289
290const Scheduler_Operations
291T_scheduler_operations[ CONFIGURE_MAXIMUM_PROCESSORS ] = {
292   SCHEDULER_PRIORITY_ENTRY_POINTS
293};
294
295#undef SCHEDULER_PRIORITY_ENTRY_POINTS
296
297#define SCHEDULER_PRIORITY_ENTRY_POINTS T_SCHEDULER_ENTRY_POINTS
298
299#define CONFIGURE_SCHEDULER_PRIORITY
300
301#if defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
302
303#include <rtems/scheduler.h>
304
305RTEMS_SCHEDULER_PRIORITY( a, 64 );
306
307#else /* CONFIGURE_SCHEDULER_TABLE_ENTRIES */
308
309#define CONFIGURE_SCHEDULER_NAME TEST_SCHEDULER_A_NAME
310
311#define CONFIGURE_MAXIMUM_PRIORITY 127
312
313#endif /* CONFIGURE_SCHEDULER_TABLE_ENTRIES */
314
315#endif
316
317#define CONFIGURE_IDLE_TASK_STACK_SIZE TEST_IDLE_STACK_SIZE
318
319static char test_idle_stacks[ CONFIGURE_MAXIMUM_PROCESSORS ][
320  ( TEST_IDLE_STACK_SIZE + CPU_IDLE_TASK_IS_FP * CONTEXT_FP_SIZE )
321]
322RTEMS_ALIGNED( CPU_INTERRUPT_STACK_ALIGNMENT )
323RTEMS_SECTION( ".rtemsstack.idle" );
324
325void *test_idle_task_stack_allocate( uint32_t cpu_index, size_t *size )
326{
327  if ( *size > sizeof( test_idle_stacks[ 0 ] ) ) {
328    rtems_fatal( RTEMS_FATAL_SOURCE_APPLICATION, 0xABAD1DEA );
329  }
330
331  return &test_idle_stacks[ cpu_index ][0];
332}
333
334#define CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE test_idle_task_stack_allocate
335
336#define CONFIGURE_INIT
337
338#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.