Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RtemsSchedulerValSmpOnly
0007  */
0008 
0009 /*
0010  * Copyright (C) 2021 embedded brains GmbH & Co. KG
0011  *
0012  * Redistribution and use in source and binary forms, with or without
0013  * modification, are permitted provided that the following conditions
0014  * are met:
0015  * 1. Redistributions of source code must retain the above copyright
0016  *    notice, this list of conditions and the following disclaimer.
0017  * 2. Redistributions in binary form must reproduce the above copyright
0018  *    notice, this list of conditions and the following disclaimer in the
0019  *    documentation and/or other materials provided with the distribution.
0020  *
0021  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0022  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0023  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0024  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0025  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0026  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0027  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0028  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0029  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0030  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0031  * POSSIBILITY OF SUCH DAMAGE.
0032  */
0033 
0034 /*
0035  * This file is part of the RTEMS quality process and was automatically
0036  * generated.  If you find something that needs to be fixed or
0037  * worded better please post a report or patch to an RTEMS mailing list
0038  * or raise a bug report:
0039  *
0040  * https://www.rtems.org/bugs.html
0041  *
0042  * For information on updating and regenerating please refer to the How-To
0043  * section in the Software Requirements Engineering chapter of the
0044  * RTEMS Software Engineering manual.  The manual is provided as a part of
0045  * a release.  For development sources please refer to the online
0046  * documentation at:
0047  *
0048  * https://docs.rtems.org
0049  */
0050 
0051 #ifdef HAVE_CONFIG_H
0052 #include "config.h"
0053 #endif
0054 
0055 #include <limits.h>
0056 #include <rtems.h>
0057 
0058 #include "ts-config.h"
0059 #include "tx-support.h"
0060 
0061 #include <rtems/test.h>
0062 
0063 /**
0064  * @defgroup RtemsSchedulerValSmpOnly spec:/rtems/scheduler/val/smp-only
0065  *
0066  * @ingroup TestsuitesValidationSmpOnly0
0067  *
0068  * @brief This test case collection provides validation test cases for SMP-only
0069  *   requirements of the @ref RTEMSAPIClassicScheduler.
0070  *
0071  * This test case performs the following actions:
0072  *
0073  * - Call rtems_scheduler_get_processor() on all online processors and check
0074  *   the returned value.
0075  *
0076  * - Call rtems_scheduler_get_processor_maximum() and check the returned value.
0077  *
0078  *   - Check that the returned value is greater than or equal to one.
0079  *
0080  *   - Check that the returned value is less than or equal to
0081  *     rtems_configuration_get_maximum_processors().
0082  *
0083  * - Call rtems_scheduler_ident() for each configured scheduler.
0084  *
0085  *   - Check that the object index of scheduler A has the expected value.
0086  *
0087  *   - Check that the object index of scheduler B has the expected value.
0088  *
0089  *   - Check that the object index of scheduler C has the expected value.
0090  *
0091  *   - Check that the object index of scheduler D has the expected value.
0092  *
0093  *   - Check that processor 0 has scheduler A assigned.
0094  *
0095  *   - Check that processor 1 has scheduler B assigned.
0096  *
0097  *   - Check that scheduler B has the maximum priority of the EDF SMP
0098  *     scheduler.
0099  *
0100  *   - Check that processor 2 has scheduler C assigned if it is present.
0101  *
0102  *   - Check that processor 3 has scheduler C assigned if it is present.
0103  *
0104  * @{
0105  */
0106 
0107 /**
0108  * @brief Call rtems_scheduler_get_processor() on all online processors and
0109  *   check the returned value.
0110  */
0111 static void RtemsSchedulerValSmpOnly_Action_0( void )
0112 {
0113   rtems_id            scheduler_id;
0114   rtems_task_priority priority;
0115   uint32_t            cpu_index;
0116   uint32_t            cpu_max;
0117 
0118   scheduler_id = GetSelfScheduler();
0119   priority = GetSelfPriority();
0120   cpu_max = rtems_scheduler_get_processor_maximum();
0121   T_step_ge_u32( 0, cpu_max, 1 );
0122 
0123   for ( cpu_index = 0; cpu_index < cpu_max; ++cpu_index ) {
0124     rtems_status_code sc;
0125     rtems_id          id;
0126 
0127     sc = rtems_scheduler_ident_by_processor( cpu_index, &id );
0128     T_quiet_rsc_success( sc );
0129 
0130     SetSelfScheduler( id, priority );
0131     SetSelfAffinityOne( cpu_index );
0132 
0133     T_quiet_eq_u32( rtems_scheduler_get_processor(), cpu_index );
0134 
0135     SetSelfAffinityAll();
0136   }
0137 
0138   SetSelfScheduler( scheduler_id, priority );
0139 }
0140 
0141 /**
0142  * @brief Call rtems_scheduler_get_processor_maximum() and check the returned
0143  *   value.
0144  */
0145 static void RtemsSchedulerValSmpOnly_Action_1( void )
0146 {
0147   uint32_t cpu_max;
0148 
0149   cpu_max = rtems_scheduler_get_processor_maximum();
0150 
0151   /*
0152    * Check that the returned value is greater than or equal to one.
0153    */
0154   T_step_ge_u32( 1, cpu_max, 1 );
0155 
0156   /*
0157    * Check that the returned value is less than or equal to
0158    * rtems_configuration_get_maximum_processors().
0159    */
0160   T_step_le_u32(
0161     2,
0162     cpu_max,
0163     rtems_configuration_get_maximum_processors()
0164   );
0165 }
0166 
0167 /**
0168  * @brief Call rtems_scheduler_ident() for each configured scheduler.
0169  */
0170 static void RtemsSchedulerValSmpOnly_Action_2( void )
0171 {
0172   rtems_status_code   sc;
0173   rtems_id            id[ 4 ];
0174   rtems_id            id_by_cpu;
0175   rtems_task_priority priority;
0176 
0177   sc = rtems_scheduler_ident( TEST_SCHEDULER_A_NAME, &id[ 0 ]);
0178   T_step_rsc_success( 3, sc );
0179 
0180   sc = rtems_scheduler_ident( TEST_SCHEDULER_B_NAME, &id[ 1 ]);
0181   T_step_rsc_success( 4, sc );
0182 
0183   sc = rtems_scheduler_ident( TEST_SCHEDULER_C_NAME, &id[ 2 ]);
0184   T_step_rsc_success( 5, sc );
0185 
0186   sc = rtems_scheduler_ident( TEST_SCHEDULER_D_NAME, &id[ 3 ]);
0187   T_step_rsc_success( 6, sc );
0188 
0189   /*
0190    * Check that the object index of scheduler A has the expected value.
0191    */
0192   T_step_eq_u16( 7, rtems_object_id_get_index( id[ 0 ] ), 1 );
0193 
0194   /*
0195    * Check that the object index of scheduler B has the expected value.
0196    */
0197   T_step_eq_u16( 8, rtems_object_id_get_index( id[ 1 ] ), 2 );
0198 
0199   /*
0200    * Check that the object index of scheduler C has the expected value.
0201    */
0202   T_step_eq_u16( 9, rtems_object_id_get_index( id[ 2 ] ), 3 );
0203 
0204   /*
0205    * Check that the object index of scheduler D has the expected value.
0206    */
0207   T_step_eq_u16( 10, rtems_object_id_get_index( id[ 3 ] ), 4 );
0208 
0209   /*
0210    * Check that processor 0 has scheduler A assigned.
0211    */
0212   sc = rtems_scheduler_ident_by_processor( 0, &id_by_cpu );
0213   T_step_rsc_success( 11, sc );
0214   T_step_eq_u32( 12, id[ 0 ], id_by_cpu );
0215 
0216   /*
0217    * Check that processor 1 has scheduler B assigned.
0218    */
0219   sc = rtems_scheduler_ident_by_processor( 1, &id_by_cpu );
0220   T_step_rsc_success( 13, sc );
0221   T_step_eq_u32( 14, id[ 1 ], id_by_cpu );
0222 
0223   /*
0224    * Check that scheduler B has the maximum priority of the EDF SMP scheduler.
0225    */
0226   sc = rtems_scheduler_get_maximum_priority( id_by_cpu, &priority );
0227   T_step_rsc_success( 15, sc );
0228   T_step_eq_u32( 16, priority, (uint32_t) INT_MAX );
0229 
0230   /*
0231    * Check that processor 2 has scheduler C assigned if it is present.
0232    */
0233   sc = rtems_scheduler_ident_by_processor( 2, &id_by_cpu );
0234   T_step_true( 17, sc == RTEMS_INVALID_NAME || id[ 2 ] == id_by_cpu );
0235 
0236   /*
0237    * Check that processor 3 has scheduler C assigned if it is present.
0238    */
0239   sc = rtems_scheduler_ident_by_processor( 3, &id_by_cpu );
0240   T_step_true( 18, sc == RTEMS_INVALID_NAME || id[ 2 ] == id_by_cpu );
0241 }
0242 
0243 /**
0244  * @fn void T_case_body_RtemsSchedulerValSmpOnly( void )
0245  */
0246 T_TEST_CASE( RtemsSchedulerValSmpOnly )
0247 {
0248   T_plan( 19 );
0249 
0250   RtemsSchedulerValSmpOnly_Action_0();
0251   RtemsSchedulerValSmpOnly_Action_1();
0252   RtemsSchedulerValSmpOnly_Action_2();
0253 }
0254 
0255 /** @} */