Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RtemsIntrReqGetAffinity
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 <string.h>
0056 #include <bsp/irq-generic.h>
0057 #include <rtems/irq-extension.h>
0058 
0059 #include "tx-support.h"
0060 
0061 #include <rtems/test.h>
0062 
0063 /**
0064  * @defgroup RtemsIntrReqGetAffinity spec:/rtems/intr/req/get-affinity
0065  *
0066  * @ingroup TestsuitesValidationIntr
0067  *
0068  * @{
0069  */
0070 
0071 typedef enum {
0072   RtemsIntrReqGetAffinity_Pre_Vector_Valid,
0073   RtemsIntrReqGetAffinity_Pre_Vector_Invalid,
0074   RtemsIntrReqGetAffinity_Pre_Vector_NA
0075 } RtemsIntrReqGetAffinity_Pre_Vector;
0076 
0077 typedef enum {
0078   RtemsIntrReqGetAffinity_Pre_CPUSetSize_Valid,
0079   RtemsIntrReqGetAffinity_Pre_CPUSetSize_TooSmall,
0080   RtemsIntrReqGetAffinity_Pre_CPUSetSize_Askew,
0081   RtemsIntrReqGetAffinity_Pre_CPUSetSize_NA
0082 } RtemsIntrReqGetAffinity_Pre_CPUSetSize;
0083 
0084 typedef enum {
0085   RtemsIntrReqGetAffinity_Pre_CPUSet_Valid,
0086   RtemsIntrReqGetAffinity_Pre_CPUSet_Null,
0087   RtemsIntrReqGetAffinity_Pre_CPUSet_NA
0088 } RtemsIntrReqGetAffinity_Pre_CPUSet;
0089 
0090 typedef enum {
0091   RtemsIntrReqGetAffinity_Pre_CanGetAffinity_Yes,
0092   RtemsIntrReqGetAffinity_Pre_CanGetAffinity_No,
0093   RtemsIntrReqGetAffinity_Pre_CanGetAffinity_NA
0094 } RtemsIntrReqGetAffinity_Pre_CanGetAffinity;
0095 
0096 typedef enum {
0097   RtemsIntrReqGetAffinity_Post_Status_Ok,
0098   RtemsIntrReqGetAffinity_Post_Status_InvAddr,
0099   RtemsIntrReqGetAffinity_Post_Status_InvId,
0100   RtemsIntrReqGetAffinity_Post_Status_InvSize,
0101   RtemsIntrReqGetAffinity_Post_Status_Unsat,
0102   RtemsIntrReqGetAffinity_Post_Status_NA
0103 } RtemsIntrReqGetAffinity_Post_Status;
0104 
0105 typedef enum {
0106   RtemsIntrReqGetAffinity_Post_CPUSetObj_Set,
0107   RtemsIntrReqGetAffinity_Post_CPUSetObj_Partial,
0108   RtemsIntrReqGetAffinity_Post_CPUSetObj_Zero,
0109   RtemsIntrReqGetAffinity_Post_CPUSetObj_Nop,
0110   RtemsIntrReqGetAffinity_Post_CPUSetObj_NA
0111 } RtemsIntrReqGetAffinity_Post_CPUSetObj;
0112 
0113 typedef struct {
0114   uint16_t Skip : 1;
0115   uint16_t Pre_Vector_NA : 1;
0116   uint16_t Pre_CPUSetSize_NA : 1;
0117   uint16_t Pre_CPUSet_NA : 1;
0118   uint16_t Pre_CanGetAffinity_NA : 1;
0119   uint16_t Post_Status : 3;
0120   uint16_t Post_CPUSetObj : 3;
0121 } RtemsIntrReqGetAffinity_Entry;
0122 
0123 /**
0124  * @brief Test context for spec:/rtems/intr/req/get-affinity test case.
0125  */
0126 typedef struct {
0127   /**
0128    * @brief This member contains the current vector number.
0129    */
0130   rtems_vector_number vector;
0131 
0132   /**
0133    * @brief This member contains some valid vector number.
0134    */
0135   rtems_vector_number some_vector;
0136 
0137   /**
0138    * @brief This member provides the object referenced by the ``affinity``
0139    *   parameter.
0140    */
0141   cpu_set_t cpuset_obj[ 2 ];
0142 
0143   /**
0144    * @brief This member contains the return value of the
0145    *   rtems_interrupt_get_affinity() call.
0146    */
0147   rtems_status_code status;
0148 
0149   /**
0150    * @brief If this member is true, then the ``vector`` parameter shall be
0151    *   valid.
0152    */
0153   bool valid_vector;
0154 
0155   /**
0156    * @brief This member specifies if the ``affinity_size`` parameter value.
0157    */
0158   size_t cpusetsize;
0159 
0160   /**
0161    * @brief This member specifies if the ``affinity`` parameter value.
0162    */
0163   cpu_set_t *cpuset;
0164 
0165   struct {
0166     /**
0167      * @brief This member defines the pre-condition indices for the next
0168      *   action.
0169      */
0170     size_t pci[ 4 ];
0171 
0172     /**
0173      * @brief This member defines the pre-condition states for the next action.
0174      */
0175     size_t pcs[ 4 ];
0176 
0177     /**
0178      * @brief If this member is true, then the test action loop is executed.
0179      */
0180     bool in_action_loop;
0181 
0182     /**
0183      * @brief This member contains the next transition map index.
0184      */
0185     size_t index;
0186 
0187     /**
0188      * @brief This member contains the current transition map entry.
0189      */
0190     RtemsIntrReqGetAffinity_Entry entry;
0191 
0192     /**
0193      * @brief If this member is true, then the current transition variant
0194      *   should be skipped.
0195      */
0196     bool skip;
0197   } Map;
0198 } RtemsIntrReqGetAffinity_Context;
0199 
0200 static RtemsIntrReqGetAffinity_Context
0201   RtemsIntrReqGetAffinity_Instance;
0202 
0203 static const char * const RtemsIntrReqGetAffinity_PreDesc_Vector[] = {
0204   "Valid",
0205   "Invalid",
0206   "NA"
0207 };
0208 
0209 static const char * const RtemsIntrReqGetAffinity_PreDesc_CPUSetSize[] = {
0210   "Valid",
0211   "TooSmall",
0212   "Askew",
0213   "NA"
0214 };
0215 
0216 static const char * const RtemsIntrReqGetAffinity_PreDesc_CPUSet[] = {
0217   "Valid",
0218   "Null",
0219   "NA"
0220 };
0221 
0222 static const char * const RtemsIntrReqGetAffinity_PreDesc_CanGetAffinity[] = {
0223   "Yes",
0224   "No",
0225   "NA"
0226 };
0227 
0228 static const char * const * const RtemsIntrReqGetAffinity_PreDesc[] = {
0229   RtemsIntrReqGetAffinity_PreDesc_Vector,
0230   RtemsIntrReqGetAffinity_PreDesc_CPUSetSize,
0231   RtemsIntrReqGetAffinity_PreDesc_CPUSet,
0232   RtemsIntrReqGetAffinity_PreDesc_CanGetAffinity,
0233   NULL
0234 };
0235 
0236 typedef RtemsIntrReqGetAffinity_Context Context;
0237 
0238 static void CheckGetAffinity(
0239   Context                          *ctx,
0240   const rtems_interrupt_attributes *attr
0241 )
0242 {
0243   rtems_status_code sc;
0244   cpu_set_t         set[ 2 ];
0245 
0246   #pragma GCC diagnostic push
0247   #pragma GCC diagnostic ignored "-Warray-bounds"
0248 
0249   if ( attr->can_get_affinity ) {
0250     CPU_ZERO_S( sizeof( ctx->cpuset_obj ), ctx->cpuset_obj );
0251   } else {
0252     CPU_FILL_S( sizeof( ctx->cpuset_obj ), ctx->cpuset_obj );
0253   }
0254 
0255   sc = rtems_interrupt_get_affinity(
0256     ctx->vector,
0257     ctx->cpusetsize,
0258     ctx->cpuset
0259   );
0260 
0261   CPU_ZERO_S( sizeof( set ), set );
0262 
0263   if ( attr->can_get_affinity ) {
0264     T_rsc_success( sc );
0265     T_false( CPU_EQUAL_S( sizeof( set ), ctx->cpuset_obj, set ) );
0266   } else {
0267     T_rsc( sc, RTEMS_UNSATISFIED );
0268     T_true( CPU_EQUAL_S( sizeof( set ), ctx->cpuset_obj, set ) );
0269   }
0270 
0271   #pragma GCC diagnostic pop
0272 }
0273 
0274 static void RtemsIntrReqGetAffinity_Pre_Vector_Prepare(
0275   RtemsIntrReqGetAffinity_Context   *ctx,
0276   RtemsIntrReqGetAffinity_Pre_Vector state
0277 )
0278 {
0279   switch ( state ) {
0280     case RtemsIntrReqGetAffinity_Pre_Vector_Valid: {
0281       /*
0282        * While the ``vector`` parameter is associated with an interrupt vector.
0283        */
0284       ctx->valid_vector = true;
0285       break;
0286     }
0287 
0288     case RtemsIntrReqGetAffinity_Pre_Vector_Invalid: {
0289       /*
0290        * While the ``vector`` parameter is not associated with an interrupt
0291        * vector.
0292        */
0293       ctx->valid_vector = false;
0294       break;
0295     }
0296 
0297     case RtemsIntrReqGetAffinity_Pre_Vector_NA:
0298       break;
0299   }
0300 }
0301 
0302 static void RtemsIntrReqGetAffinity_Pre_CPUSetSize_Prepare(
0303   RtemsIntrReqGetAffinity_Context       *ctx,
0304   RtemsIntrReqGetAffinity_Pre_CPUSetSize state
0305 )
0306 {
0307   switch ( state ) {
0308     case RtemsIntrReqGetAffinity_Pre_CPUSetSize_Valid: {
0309       /*
0310        * While the ``affinity_size`` parameter is an integral multiple of the
0311        * size of ``long``, while the ``affinity_size`` parameter specifies a
0312        * processor set which is large enough to contain the processor affinity
0313        * set of the interrupt specified by ``vector``.
0314        */
0315       ctx->cpusetsize = sizeof( ctx->cpuset_obj );
0316       break;
0317     }
0318 
0319     case RtemsIntrReqGetAffinity_Pre_CPUSetSize_TooSmall: {
0320       /*
0321        * While the ``affinity_size`` parameter is an integral multiple of the
0322        * size of ``long``, while the ``affinity_size`` parameter specifies a
0323        * processor set which is not large enough to contain the processor
0324        * affinity set of the interrupt specified by ``vector``.
0325        */
0326       ctx->cpusetsize = 0;
0327       break;
0328     }
0329 
0330     case RtemsIntrReqGetAffinity_Pre_CPUSetSize_Askew: {
0331       /*
0332        * While the ``affinity_size`` parameter is not an integral multiple of
0333        * the size of ``long``.
0334        */
0335       ctx->cpusetsize = SIZE_MAX;
0336       break;
0337     }
0338 
0339     case RtemsIntrReqGetAffinity_Pre_CPUSetSize_NA:
0340       break;
0341   }
0342 }
0343 
0344 static void RtemsIntrReqGetAffinity_Pre_CPUSet_Prepare(
0345   RtemsIntrReqGetAffinity_Context   *ctx,
0346   RtemsIntrReqGetAffinity_Pre_CPUSet state
0347 )
0348 {
0349   switch ( state ) {
0350     case RtemsIntrReqGetAffinity_Pre_CPUSet_Valid: {
0351       /*
0352        * While the ``affinity`` parameter references an object of type
0353        * cpu_set_t.
0354        */
0355       ctx->cpuset = ctx->cpuset_obj;
0356       break;
0357     }
0358 
0359     case RtemsIntrReqGetAffinity_Pre_CPUSet_Null: {
0360       /*
0361        * While the ``affinity`` parameter is equal to NULL.
0362        */
0363       ctx->cpuset = NULL;
0364       break;
0365     }
0366 
0367     case RtemsIntrReqGetAffinity_Pre_CPUSet_NA:
0368       break;
0369   }
0370 }
0371 
0372 static void RtemsIntrReqGetAffinity_Pre_CanGetAffinity_Prepare(
0373   RtemsIntrReqGetAffinity_Context           *ctx,
0374   RtemsIntrReqGetAffinity_Pre_CanGetAffinity state
0375 )
0376 {
0377   switch ( state ) {
0378     case RtemsIntrReqGetAffinity_Pre_CanGetAffinity_Yes: {
0379       /*
0380        * While getting the affinity for the interrupt vector specified by
0381        * ``vector`` parameter is supported.
0382        */
0383       /* Validation done by CheckGetAffinity() for each interrupt vector */
0384       break;
0385     }
0386 
0387     case RtemsIntrReqGetAffinity_Pre_CanGetAffinity_No: {
0388       /*
0389        * While getting the affinity for the interrupt vector specified by
0390        * ``vector`` parameter is not supported.
0391        */
0392       /* Validation done by CheckGetAffinity() for each interrupt vector */
0393       break;
0394     }
0395 
0396     case RtemsIntrReqGetAffinity_Pre_CanGetAffinity_NA:
0397       break;
0398   }
0399 }
0400 
0401 static void RtemsIntrReqGetAffinity_Post_Status_Check(
0402   RtemsIntrReqGetAffinity_Context    *ctx,
0403   RtemsIntrReqGetAffinity_Post_Status state
0404 )
0405 {
0406   switch ( state ) {
0407     case RtemsIntrReqGetAffinity_Post_Status_Ok: {
0408       /*
0409        * The return status of rtems_interrupt_get_affinity() shall be
0410        * RTEMS_SUCCESSFUL.
0411        */
0412       /* Validation done by CheckGetAffinity() for each interrupt vector */
0413       break;
0414     }
0415 
0416     case RtemsIntrReqGetAffinity_Post_Status_InvAddr: {
0417       /*
0418        * The return status of rtems_interrupt_get_affinity() shall be
0419        * RTEMS_INVALID_ADDRESS.
0420        */
0421       T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
0422       break;
0423     }
0424 
0425     case RtemsIntrReqGetAffinity_Post_Status_InvId: {
0426       /*
0427        * The return status of rtems_interrupt_get_affinity() shall be
0428        * RTEMS_INVALID_ID.
0429        */
0430       T_rsc( ctx->status, RTEMS_INVALID_ID );
0431       break;
0432     }
0433 
0434     case RtemsIntrReqGetAffinity_Post_Status_InvSize: {
0435       /*
0436        * The return status of rtems_interrupt_get_affinity() shall be
0437        * RTEMS_INVALID_SIZE.
0438        */
0439       T_rsc( ctx->status, RTEMS_INVALID_SIZE );
0440       break;
0441     }
0442 
0443     case RtemsIntrReqGetAffinity_Post_Status_Unsat: {
0444       /*
0445        * The return status of rtems_interrupt_get_affinity() shall be
0446        * RTEMS_UNSATISFIED.
0447        */
0448       /* Validation done by CheckGetAffinity() for each interrupt vector */
0449       break;
0450     }
0451 
0452     case RtemsIntrReqGetAffinity_Post_Status_NA:
0453       break;
0454   }
0455 }
0456 
0457 static void RtemsIntrReqGetAffinity_Post_CPUSetObj_Check(
0458   RtemsIntrReqGetAffinity_Context       *ctx,
0459   RtemsIntrReqGetAffinity_Post_CPUSetObj state
0460 )
0461 {
0462   switch ( state ) {
0463     case RtemsIntrReqGetAffinity_Post_CPUSetObj_Set: {
0464       /*
0465        * The value of the object referenced by the ``affinity`` parameter shall
0466        * be set to the processor affinity set of the interrupt specified by the
0467        * ``vector`` parameter at some point during the call after the return of
0468        * the rtems_interrupt_get_affinity() call.
0469        */
0470       /* Validation done by CheckGetAffinity() for each interrupt vector */
0471       break;
0472     }
0473 
0474     case RtemsIntrReqGetAffinity_Post_CPUSetObj_Partial: {
0475       /*
0476        * The value of the object referenced by the ``affinity`` parameter shall
0477        * be set to the subset of the processor affinity set which fits into the
0478        * object of the interrupt specified by the ``vector`` parameter at some
0479        * point during the call after the return of the
0480        * rtems_interrupt_get_affinity() call.
0481        */
0482       /* Validation done by CheckGetAffinity() for each interrupt vector */
0483       break;
0484     }
0485 
0486     case RtemsIntrReqGetAffinity_Post_CPUSetObj_Zero: {
0487       /*
0488        * The value of the object referenced by the ``affinity`` parameter shall
0489        * be set to zero.
0490        */
0491       /*
0492        * Validation done by CheckGetAffinity() for each interrupt vector and in
0493        * the action code.
0494        */
0495       break;
0496     }
0497 
0498     case RtemsIntrReqGetAffinity_Post_CPUSetObj_Nop: {
0499       /*
0500        * Objects referenced by the ``affinity`` parameter in past calls to
0501        * rtems_interrupt_get_affinity() shall not be accessed by the
0502        * rtems_interrupt_get_affinity() call.
0503        */
0504       /*
0505        * Validation done by CheckGetAffinity() for each interrupt vector and in
0506        * the action code.
0507        */
0508       break;
0509     }
0510 
0511     case RtemsIntrReqGetAffinity_Post_CPUSetObj_NA:
0512       break;
0513   }
0514 }
0515 
0516 static void RtemsIntrReqGetAffinity_Setup(
0517   RtemsIntrReqGetAffinity_Context *ctx
0518 )
0519 {
0520   rtems_interrupt_attributes required;
0521 
0522   memset( &required, 0, sizeof( required ) );
0523   required.can_get_affinity = true;
0524   ctx->some_vector = GetValidInterruptVectorNumber( &required );
0525 }
0526 
0527 static void RtemsIntrReqGetAffinity_Setup_Wrap( void *arg )
0528 {
0529   RtemsIntrReqGetAffinity_Context *ctx;
0530 
0531   ctx = arg;
0532   ctx->Map.in_action_loop = false;
0533   RtemsIntrReqGetAffinity_Setup( ctx );
0534 }
0535 
0536 static void RtemsIntrReqGetAffinity_Action(
0537   RtemsIntrReqGetAffinity_Context *ctx
0538 )
0539 {
0540   if (
0541     ctx->valid_vector && ctx->cpusetsize == sizeof( ctx->cpuset_obj ) &&
0542     ctx->cpuset == ctx->cpuset_obj
0543   ) {
0544     for (
0545       ctx->vector = 0;
0546       ctx->vector < BSP_INTERRUPT_VECTOR_COUNT;
0547       ++ctx->vector
0548     ) {
0549       rtems_status_code          sc;
0550       rtems_interrupt_attributes attr;
0551 
0552       memset( &attr, 0, sizeof( attr ) );
0553       sc = rtems_interrupt_get_attributes( ctx->vector, &attr );
0554 
0555       if ( sc == RTEMS_INVALID_ID ) {
0556         continue;
0557       }
0558 
0559       T_rsc_success( sc );
0560 
0561       CheckGetAffinity( ctx, &attr );
0562     }
0563   } else {
0564     cpu_set_t set[ 2 ];
0565 
0566     if ( ctx->valid_vector ) {
0567       ctx->vector = ctx->some_vector;
0568     } else {
0569       ctx->vector = BSP_INTERRUPT_VECTOR_COUNT;
0570     }
0571 
0572     #pragma GCC diagnostic push
0573     #pragma GCC diagnostic ignored "-Warray-bounds"
0574 
0575     CPU_FILL_S( sizeof( ctx->cpuset_obj ), ctx->cpuset_obj );
0576 
0577     ctx->status = rtems_interrupt_get_affinity(
0578       ctx->vector,
0579       ctx->cpusetsize,
0580       ctx->cpuset
0581     );
0582 
0583     if (
0584       ctx->cpuset == NULL ||
0585       ctx->cpusetsize != sizeof( ctx->cpuset_obj )
0586     ) {
0587       CPU_FILL_S( sizeof( set ), set );
0588     } else {
0589       CPU_ZERO_S( sizeof( set ), set );
0590     }
0591 
0592     T_true( CPU_EQUAL_S( sizeof( set ), ctx->cpuset_obj, set ) );
0593 
0594     #pragma GCC diagnostic pop
0595   }
0596 }
0597 
0598 static const RtemsIntrReqGetAffinity_Entry
0599 RtemsIntrReqGetAffinity_Entries[] = {
0600   { 0, 0, 0, 0, 0, RtemsIntrReqGetAffinity_Post_Status_InvAddr,
0601     RtemsIntrReqGetAffinity_Post_CPUSetObj_Nop },
0602   { 0, 0, 0, 0, 1, RtemsIntrReqGetAffinity_Post_Status_InvId,
0603     RtemsIntrReqGetAffinity_Post_CPUSetObj_Zero },
0604   { 0, 0, 0, 0, 1, RtemsIntrReqGetAffinity_Post_Status_InvAddr,
0605     RtemsIntrReqGetAffinity_Post_CPUSetObj_Nop },
0606   { 0, 0, 0, 0, 0, RtemsIntrReqGetAffinity_Post_Status_Unsat,
0607     RtemsIntrReqGetAffinity_Post_CPUSetObj_Zero },
0608   { 0, 0, 0, 0, 0, RtemsIntrReqGetAffinity_Post_Status_InvSize,
0609     RtemsIntrReqGetAffinity_Post_CPUSetObj_Nop },
0610   { 0, 0, 0, 0, 0, RtemsIntrReqGetAffinity_Post_Status_Ok,
0611     RtemsIntrReqGetAffinity_Post_CPUSetObj_Set },
0612   { 0, 0, 0, 0, 0, RtemsIntrReqGetAffinity_Post_Status_InvSize,
0613     RtemsIntrReqGetAffinity_Post_CPUSetObj_Partial }
0614 };
0615 
0616 static const uint8_t
0617 RtemsIntrReqGetAffinity_Map[] = {
0618   5, 3, 0, 0, 6, 3, 0, 0, 4, 4, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2
0619 };
0620 
0621 static size_t RtemsIntrReqGetAffinity_Scope( void *arg, char *buf, size_t n )
0622 {
0623   RtemsIntrReqGetAffinity_Context *ctx;
0624 
0625   ctx = arg;
0626 
0627   if ( ctx->Map.in_action_loop ) {
0628     return T_get_scope(
0629       RtemsIntrReqGetAffinity_PreDesc,
0630       buf,
0631       n,
0632       ctx->Map.pcs
0633     );
0634   }
0635 
0636   return 0;
0637 }
0638 
0639 static T_fixture RtemsIntrReqGetAffinity_Fixture = {
0640   .setup = RtemsIntrReqGetAffinity_Setup_Wrap,
0641   .stop = NULL,
0642   .teardown = NULL,
0643   .scope = RtemsIntrReqGetAffinity_Scope,
0644   .initial_context = &RtemsIntrReqGetAffinity_Instance
0645 };
0646 
0647 static inline RtemsIntrReqGetAffinity_Entry RtemsIntrReqGetAffinity_PopEntry(
0648   RtemsIntrReqGetAffinity_Context *ctx
0649 )
0650 {
0651   size_t index;
0652 
0653   index = ctx->Map.index;
0654   ctx->Map.index = index + 1;
0655   return RtemsIntrReqGetAffinity_Entries[
0656     RtemsIntrReqGetAffinity_Map[ index ]
0657   ];
0658 }
0659 
0660 static void RtemsIntrReqGetAffinity_SetPreConditionStates(
0661   RtemsIntrReqGetAffinity_Context *ctx
0662 )
0663 {
0664   ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
0665   ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
0666   ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
0667 
0668   if ( ctx->Map.entry.Pre_CanGetAffinity_NA ) {
0669     ctx->Map.pcs[ 3 ] = RtemsIntrReqGetAffinity_Pre_CanGetAffinity_NA;
0670   } else {
0671     ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ];
0672   }
0673 }
0674 
0675 static void RtemsIntrReqGetAffinity_TestVariant(
0676   RtemsIntrReqGetAffinity_Context *ctx
0677 )
0678 {
0679   RtemsIntrReqGetAffinity_Pre_Vector_Prepare( ctx, ctx->Map.pcs[ 0 ] );
0680   RtemsIntrReqGetAffinity_Pre_CPUSetSize_Prepare( ctx, ctx->Map.pcs[ 1 ] );
0681   RtemsIntrReqGetAffinity_Pre_CPUSet_Prepare( ctx, ctx->Map.pcs[ 2 ] );
0682   RtemsIntrReqGetAffinity_Pre_CanGetAffinity_Prepare( ctx, ctx->Map.pcs[ 3 ] );
0683   RtemsIntrReqGetAffinity_Action( ctx );
0684   RtemsIntrReqGetAffinity_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
0685   RtemsIntrReqGetAffinity_Post_CPUSetObj_Check(
0686     ctx,
0687     ctx->Map.entry.Post_CPUSetObj
0688   );
0689 }
0690 
0691 /**
0692  * @fn void T_case_body_RtemsIntrReqGetAffinity( void )
0693  */
0694 T_TEST_CASE_FIXTURE(
0695   RtemsIntrReqGetAffinity,
0696   &RtemsIntrReqGetAffinity_Fixture
0697 )
0698 {
0699   RtemsIntrReqGetAffinity_Context *ctx;
0700 
0701   ctx = T_fixture_context();
0702   ctx->Map.in_action_loop = true;
0703   ctx->Map.index = 0;
0704 
0705   for (
0706     ctx->Map.pci[ 0 ] = RtemsIntrReqGetAffinity_Pre_Vector_Valid;
0707     ctx->Map.pci[ 0 ] < RtemsIntrReqGetAffinity_Pre_Vector_NA;
0708     ++ctx->Map.pci[ 0 ]
0709   ) {
0710     for (
0711       ctx->Map.pci[ 1 ] = RtemsIntrReqGetAffinity_Pre_CPUSetSize_Valid;
0712       ctx->Map.pci[ 1 ] < RtemsIntrReqGetAffinity_Pre_CPUSetSize_NA;
0713       ++ctx->Map.pci[ 1 ]
0714     ) {
0715       for (
0716         ctx->Map.pci[ 2 ] = RtemsIntrReqGetAffinity_Pre_CPUSet_Valid;
0717         ctx->Map.pci[ 2 ] < RtemsIntrReqGetAffinity_Pre_CPUSet_NA;
0718         ++ctx->Map.pci[ 2 ]
0719       ) {
0720         for (
0721           ctx->Map.pci[ 3 ] = RtemsIntrReqGetAffinity_Pre_CanGetAffinity_Yes;
0722           ctx->Map.pci[ 3 ] < RtemsIntrReqGetAffinity_Pre_CanGetAffinity_NA;
0723           ++ctx->Map.pci[ 3 ]
0724         ) {
0725           ctx->Map.entry = RtemsIntrReqGetAffinity_PopEntry( ctx );
0726           RtemsIntrReqGetAffinity_SetPreConditionStates( ctx );
0727           RtemsIntrReqGetAffinity_TestVariant( ctx );
0728         }
0729       }
0730     }
0731   }
0732 }
0733 
0734 /** @} */