diff options
Diffstat (limited to 'testsuites/validation/tc-intr-set-affinity.c')
-rw-r--r-- | testsuites/validation/tc-intr-set-affinity.c | 281 |
1 files changed, 217 insertions, 64 deletions
diff --git a/testsuites/validation/tc-intr-set-affinity.c b/testsuites/validation/tc-intr-set-affinity.c index a2a6a45e09..3354681b47 100644 --- a/testsuites/validation/tc-intr-set-affinity.c +++ b/testsuites/validation/tc-intr-set-affinity.c @@ -3,11 +3,11 @@ /** * @file * - * @ingroup RTEMSTestCaseRtemsIntrReqSetAffinity + * @ingroup RtemsIntrReqSetAffinity */ /* - * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de) + * Copyright (C) 2021, 2022 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -60,10 +60,9 @@ #include <rtems/test.h> /** - * @defgroup RTEMSTestCaseRtemsIntrReqSetAffinity \ - * spec:/rtems/intr/req/set-affinity + * @defgroup RtemsIntrReqSetAffinity spec:/rtems/intr/req/set-affinity * - * @ingroup RTEMSTestSuiteTestsuitesValidation0 + * @ingroup TestsuitesValidationIntr * * @{ */ @@ -75,11 +74,23 @@ typedef enum { } RtemsIntrReqSetAffinity_Pre_Vector; typedef enum { - RtemsIntrReqSetAffinity_Pre_CPUSetKind_Valid, - RtemsIntrReqSetAffinity_Pre_CPUSetKind_Huge, - RtemsIntrReqSetAffinity_Pre_CPUSetKind_Askew, - RtemsIntrReqSetAffinity_Pre_CPUSetKind_NA -} RtemsIntrReqSetAffinity_Pre_CPUSetKind; + RtemsIntrReqSetAffinity_Pre_CPUSetSize_Askew, + RtemsIntrReqSetAffinity_Pre_CPUSetSize_Normal, + RtemsIntrReqSetAffinity_Pre_CPUSetSize_Huge, + RtemsIntrReqSetAffinity_Pre_CPUSetSize_NA +} RtemsIntrReqSetAffinity_Pre_CPUSetSize; + +typedef enum { + RtemsIntrReqSetAffinity_Pre_CPUSetOnline_Valid, + RtemsIntrReqSetAffinity_Pre_CPUSetOnline_Empty, + RtemsIntrReqSetAffinity_Pre_CPUSetOnline_NA +} RtemsIntrReqSetAffinity_Pre_CPUSetOnline; + +typedef enum { + RtemsIntrReqSetAffinity_Pre_CPUSetHuge_NotZero, + RtemsIntrReqSetAffinity_Pre_CPUSetHuge_Zero, + RtemsIntrReqSetAffinity_Pre_CPUSetHuge_NA +} RtemsIntrReqSetAffinity_Pre_CPUSetHuge; typedef enum { RtemsIntrReqSetAffinity_Pre_CPUSet_Valid, @@ -103,7 +114,7 @@ typedef enum { } RtemsIntrReqSetAffinity_Post_Status; typedef enum { - RtemsIntrReqSetAffinity_Post_SetAffinity_Yes, + RtemsIntrReqSetAffinity_Post_SetAffinity_Set, RtemsIntrReqSetAffinity_Post_SetAffinity_Nop, RtemsIntrReqSetAffinity_Post_SetAffinity_NA } RtemsIntrReqSetAffinity_Post_SetAffinity; @@ -111,7 +122,9 @@ typedef enum { typedef struct { uint16_t Skip : 1; uint16_t Pre_Vector_NA : 1; - uint16_t Pre_CPUSetKind_NA : 1; + uint16_t Pre_CPUSetSize_NA : 1; + uint16_t Pre_CPUSetOnline_NA : 1; + uint16_t Pre_CPUSetHuge_NA : 1; uint16_t Pre_CPUSet_NA : 1; uint16_t Pre_CanSetAffinity_NA : 1; uint16_t Post_Status : 3; @@ -162,9 +175,15 @@ typedef struct { struct { /** + * @brief This member defines the pre-condition indices for the next + * action. + */ + size_t pci[ 6 ]; + + /** * @brief This member defines the pre-condition states for the next action. */ - size_t pcs[ 4 ]; + size_t pcs[ 6 ]; /** * @brief If this member is true, then the test action loop is executed. @@ -198,10 +217,22 @@ static const char * const RtemsIntrReqSetAffinity_PreDesc_Vector[] = { "NA" }; -static const char * const RtemsIntrReqSetAffinity_PreDesc_CPUSetKind[] = { - "Valid", - "Huge", +static const char * const RtemsIntrReqSetAffinity_PreDesc_CPUSetSize[] = { "Askew", + "Normal", + "Huge", + "NA" +}; + +static const char * const RtemsIntrReqSetAffinity_PreDesc_CPUSetOnline[] = { + "Valid", + "Empty", + "NA" +}; + +static const char * const RtemsIntrReqSetAffinity_PreDesc_CPUSetHuge[] = { + "NotZero", + "Zero", "NA" }; @@ -219,7 +250,9 @@ static const char * const RtemsIntrReqSetAffinity_PreDesc_CanSetAffinity[] = { static const char * const * const RtemsIntrReqSetAffinity_PreDesc[] = { RtemsIntrReqSetAffinity_PreDesc_Vector, - RtemsIntrReqSetAffinity_PreDesc_CPUSetKind, + RtemsIntrReqSetAffinity_PreDesc_CPUSetSize, + RtemsIntrReqSetAffinity_PreDesc_CPUSetOnline, + RtemsIntrReqSetAffinity_PreDesc_CPUSetHuge, RtemsIntrReqSetAffinity_PreDesc_CPUSet, RtemsIntrReqSetAffinity_PreDesc_CanSetAffinity, NULL @@ -295,43 +328,107 @@ static void RtemsIntrReqSetAffinity_Pre_Vector_Prepare( } } -static void RtemsIntrReqSetAffinity_Pre_CPUSetKind_Prepare( +static void RtemsIntrReqSetAffinity_Pre_CPUSetSize_Prepare( RtemsIntrReqSetAffinity_Context *ctx, - RtemsIntrReqSetAffinity_Pre_CPUSetKind state + RtemsIntrReqSetAffinity_Pre_CPUSetSize state ) { switch ( state ) { - case RtemsIntrReqSetAffinity_Pre_CPUSetKind_Valid: { + case RtemsIntrReqSetAffinity_Pre_CPUSetSize_Askew: { + /* + * While the ``affinity_size`` parameter is not an integral multiple of + * the size of long. + */ + ctx->cpusetsize = SIZE_MAX; + break; + } + + case RtemsIntrReqSetAffinity_Pre_CPUSetSize_Normal: { /* * While the ``affinity_size`` parameter is an integral multiple of the - * size of long, while the ``affinity_size`` and ``affinity`` parameter - * specify a processor set which is within the implementation limits. + * size of long, while the ``affinity_size`` parameter is less than or + * equal to the maximum processor set size storable in the system. */ ctx->cpusetsize = sizeof( ctx->cpuset_obj[ 0 ] ); break; } - case RtemsIntrReqSetAffinity_Pre_CPUSetKind_Huge: { + case RtemsIntrReqSetAffinity_Pre_CPUSetSize_Huge: { /* * While the ``affinity_size`` parameter is an integral multiple of the - * size of long, while the ``affinity_size`` and ``affinity`` parameter - * specify a processor set which exceeds the implementation limits. + * size of long, while the ``affinity_size`` parameter is greater than + * the maximum processor set size storable in the system. */ ctx->cpusetsize = sizeof( ctx->cpuset_obj ); + break; + } + + case RtemsIntrReqSetAffinity_Pre_CPUSetSize_NA: + break; + } +} + +static void RtemsIntrReqSetAffinity_Pre_CPUSetOnline_Prepare( + RtemsIntrReqSetAffinity_Context *ctx, + RtemsIntrReqSetAffinity_Pre_CPUSetOnline state +) +{ + switch ( state ) { + case RtemsIntrReqSetAffinity_Pre_CPUSetOnline_Valid: { + /* + * While the intersection of the processor set specified by the + * ``affinity_size`` and ``affinity`` parameters and the set of online + * processors is not empty, while the intersection of the processor set + * specified by the ``affinity_size`` and ``affinity`` parameters and the + * set of online processors is a processor affinity set supported by the + * interrupt vector. + */ + /* Already prepared */ + break; + } + + case RtemsIntrReqSetAffinity_Pre_CPUSetOnline_Empty: { + /* + * While the intersection of the processor set specified by the + * ``affinity_size`` and ``affinity`` parameters and the set of online + * processors is empty. + */ CPU_ZERO( &ctx->cpuset_obj[ 0 ] ); break; } - case RtemsIntrReqSetAffinity_Pre_CPUSetKind_Askew: { + case RtemsIntrReqSetAffinity_Pre_CPUSetOnline_NA: + break; + } +} + +static void RtemsIntrReqSetAffinity_Pre_CPUSetHuge_Prepare( + RtemsIntrReqSetAffinity_Context *ctx, + RtemsIntrReqSetAffinity_Pre_CPUSetHuge state +) +{ + switch ( state ) { + case RtemsIntrReqSetAffinity_Pre_CPUSetHuge_NotZero: { /* - * While the ``affinity_size`` parameter is not an integral multiple of - * the size of long. + * While the processor set specified by the ``affinity_size`` and + * ``affinity`` parameters contains at least one processor which is not + * storable in a processor set supported by the system. */ - ctx->cpusetsize = SIZE_MAX; + /* Already prepared */ + break; + } + + case RtemsIntrReqSetAffinity_Pre_CPUSetHuge_Zero: { + /* + * While the processor set specified by the ``affinity_size`` and + * ``affinity`` parameters contains no processor which is not storable in + * a processor set supported by the system. + */ + CPU_ZERO( &ctx->cpuset_obj[ 1 ] ); break; } - case RtemsIntrReqSetAffinity_Pre_CPUSetKind_NA: + case RtemsIntrReqSetAffinity_Pre_CPUSetHuge_NA: break; } } @@ -455,7 +552,7 @@ static void RtemsIntrReqSetAffinity_Post_SetAffinity_Check( ) { switch ( state ) { - case RtemsIntrReqSetAffinity_Post_SetAffinity_Yes: { + case RtemsIntrReqSetAffinity_Post_SetAffinity_Set: { /* * The affinity set of the interrupt specified by ``vector`` shall be set * to the processor set specified by ``affinity_size`` and ``affinity`` @@ -513,7 +610,7 @@ static void RtemsIntrReqSetAffinity_Action( if ( ctx->valid_vector && ctx->cpusetsize == sizeof( ctx->cpuset_obj[ 0 ] ) && - ctx->cpuset == &ctx->cpuset_obj[ 0 ] + ctx->cpuset == &ctx->cpuset_obj[ 0 ] && !CPU_EMPTY( &ctx->cpuset_obj[ 0 ] ) ) { for ( ctx->vector = 0; @@ -532,6 +629,7 @@ static void RtemsIntrReqSetAffinity_Action( T_rsc_success( sc ); CheckSetAffinity( ctx, &attr ); + ctx->status = RTEMS_SUCCESSFUL; } } else { cpu_set_t set; @@ -539,6 +637,8 @@ static void RtemsIntrReqSetAffinity_Action( CPU_ZERO( &set ); CPU_ZERO( &set2 ); + CPU_SET( 0, &set ); + CPU_SET( 0, &set2 ); if ( ctx->valid_vector ) { ctx->vector = ctx->some_vector; @@ -549,7 +649,9 @@ static void RtemsIntrReqSetAffinity_Action( ctx->vector = BSP_INTERRUPT_VECTOR_COUNT; } - CPU_ZERO( &ctx->cpuset_obj[ 0 ] ); + if ( !CPU_EMPTY( &ctx->cpuset_obj[ 0 ] ) ) { + CPU_COPY( &set, &ctx->cpuset_obj[ 0 ] ); + } ctx->status = rtems_interrupt_set_affinity( ctx->vector, @@ -567,23 +669,34 @@ static void RtemsIntrReqSetAffinity_Action( static const RtemsIntrReqSetAffinity_Entry RtemsIntrReqSetAffinity_Entries[] = { - { 0, 0, 0, 0, 0, RtemsIntrReqSetAffinity_Post_Status_InvAddr, + { 0, 0, 0, 1, 1, 0, 0, RtemsIntrReqSetAffinity_Post_Status_InvAddr, + RtemsIntrReqSetAffinity_Post_SetAffinity_Nop }, + { 0, 0, 0, 1, 1, 0, 1, RtemsIntrReqSetAffinity_Post_Status_InvAddr, + RtemsIntrReqSetAffinity_Post_SetAffinity_Nop }, + { 0, 0, 0, 1, 1, 0, 1, RtemsIntrReqSetAffinity_Post_Status_InvId, RtemsIntrReqSetAffinity_Post_SetAffinity_Nop }, - { 0, 0, 0, 0, 1, RtemsIntrReqSetAffinity_Post_Status_InvId, - RtemsIntrReqSetAffinity_Post_SetAffinity_NA }, - { 0, 0, 0, 0, 1, RtemsIntrReqSetAffinity_Post_Status_InvAddr, - RtemsIntrReqSetAffinity_Post_SetAffinity_NA }, - { 0, 0, 0, 0, 0, RtemsIntrReqSetAffinity_Post_Status_InvNum, + { 0, 0, 0, 0, 1, 0, 0, RtemsIntrReqSetAffinity_Post_Status_InvNum, RtemsIntrReqSetAffinity_Post_SetAffinity_Nop }, - { 0, 0, 0, 0, 0, RtemsIntrReqSetAffinity_Post_Status_Ok, - RtemsIntrReqSetAffinity_Post_SetAffinity_Yes }, - { 0, 0, 0, 0, 0, RtemsIntrReqSetAffinity_Post_Status_Unsat, + { 0, 0, 0, 1, 0, 0, 1, RtemsIntrReqSetAffinity_Post_Status_InvId, + RtemsIntrReqSetAffinity_Post_SetAffinity_Nop }, + { 0, 0, 0, 0, 0, 0, 0, RtemsIntrReqSetAffinity_Post_Status_InvNum, + RtemsIntrReqSetAffinity_Post_SetAffinity_Nop }, + { 0, 0, 0, 0, 1, 0, 0, RtemsIntrReqSetAffinity_Post_Status_Ok, + RtemsIntrReqSetAffinity_Post_SetAffinity_Set }, + { 0, 0, 0, 0, 1, 0, 0, RtemsIntrReqSetAffinity_Post_Status_Unsat, + RtemsIntrReqSetAffinity_Post_SetAffinity_Nop }, + { 0, 0, 0, 0, 0, 0, 0, RtemsIntrReqSetAffinity_Post_Status_Ok, + RtemsIntrReqSetAffinity_Post_SetAffinity_Set }, + { 0, 0, 0, 0, 0, 0, 0, RtemsIntrReqSetAffinity_Post_Status_Unsat, RtemsIntrReqSetAffinity_Post_SetAffinity_Nop } }; static const uint8_t RtemsIntrReqSetAffinity_Map[] = { - 4, 5, 0, 0, 3, 3, 0, 0, 3, 3, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2 + 3, 3, 0, 0, 3, 3, 0, 0, 3, 3, 0, 0, 3, 3, 0, 0, 6, 7, 0, 0, 6, 7, 0, 0, 3, 3, + 0, 0, 3, 3, 0, 0, 8, 9, 0, 0, 8, 9, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0, 2, 2, 1, 1, + 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, + 1, 1, 4, 4, 1, 1, 4, 4, 1, 1, 4, 4, 1, 1, 4, 4, 1, 1 }; static size_t RtemsIntrReqSetAffinity_Scope( void *arg, char *buf, size_t n ) @@ -625,17 +738,44 @@ static inline RtemsIntrReqSetAffinity_Entry RtemsIntrReqSetAffinity_PopEntry( ]; } +static void RtemsIntrReqSetAffinity_SetPreConditionStates( + RtemsIntrReqSetAffinity_Context *ctx +) +{ + ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ]; + ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ]; + + if ( ctx->Map.entry.Pre_CPUSetOnline_NA ) { + ctx->Map.pcs[ 2 ] = RtemsIntrReqSetAffinity_Pre_CPUSetOnline_NA; + } else { + ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ]; + } + + if ( ctx->Map.entry.Pre_CPUSetHuge_NA ) { + ctx->Map.pcs[ 3 ] = RtemsIntrReqSetAffinity_Pre_CPUSetHuge_NA; + } else { + ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ]; + } + + ctx->Map.pcs[ 4 ] = ctx->Map.pci[ 4 ]; + + if ( ctx->Map.entry.Pre_CanSetAffinity_NA ) { + ctx->Map.pcs[ 5 ] = RtemsIntrReqSetAffinity_Pre_CanSetAffinity_NA; + } else { + ctx->Map.pcs[ 5 ] = ctx->Map.pci[ 5 ]; + } +} + static void RtemsIntrReqSetAffinity_TestVariant( RtemsIntrReqSetAffinity_Context *ctx ) { RtemsIntrReqSetAffinity_Pre_Vector_Prepare( ctx, ctx->Map.pcs[ 0 ] ); - RtemsIntrReqSetAffinity_Pre_CPUSetKind_Prepare( ctx, ctx->Map.pcs[ 1 ] ); - RtemsIntrReqSetAffinity_Pre_CPUSet_Prepare( ctx, ctx->Map.pcs[ 2 ] ); - RtemsIntrReqSetAffinity_Pre_CanSetAffinity_Prepare( - ctx, - ctx->Map.entry.Pre_CanSetAffinity_NA ? RtemsIntrReqSetAffinity_Pre_CanSetAffinity_NA : ctx->Map.pcs[ 3 ] - ); + RtemsIntrReqSetAffinity_Pre_CPUSetSize_Prepare( ctx, ctx->Map.pcs[ 1 ] ); + RtemsIntrReqSetAffinity_Pre_CPUSetOnline_Prepare( ctx, ctx->Map.pcs[ 2 ] ); + RtemsIntrReqSetAffinity_Pre_CPUSetHuge_Prepare( ctx, ctx->Map.pcs[ 3 ] ); + RtemsIntrReqSetAffinity_Pre_CPUSet_Prepare( ctx, ctx->Map.pcs[ 4 ] ); + RtemsIntrReqSetAffinity_Pre_CanSetAffinity_Prepare( ctx, ctx->Map.pcs[ 5 ] ); RtemsIntrReqSetAffinity_Action( ctx ); RtemsIntrReqSetAffinity_Post_Status_Check( ctx, ctx->Map.entry.Post_Status ); RtemsIntrReqSetAffinity_Post_SetAffinity_Check( @@ -659,28 +799,41 @@ T_TEST_CASE_FIXTURE( ctx->Map.index = 0; for ( - ctx->Map.pcs[ 0 ] = RtemsIntrReqSetAffinity_Pre_Vector_Valid; - ctx->Map.pcs[ 0 ] < RtemsIntrReqSetAffinity_Pre_Vector_NA; - ++ctx->Map.pcs[ 0 ] + ctx->Map.pci[ 0 ] = RtemsIntrReqSetAffinity_Pre_Vector_Valid; + ctx->Map.pci[ 0 ] < RtemsIntrReqSetAffinity_Pre_Vector_NA; + ++ctx->Map.pci[ 0 ] ) { for ( - ctx->Map.pcs[ 1 ] = RtemsIntrReqSetAffinity_Pre_CPUSetKind_Valid; - ctx->Map.pcs[ 1 ] < RtemsIntrReqSetAffinity_Pre_CPUSetKind_NA; - ++ctx->Map.pcs[ 1 ] + ctx->Map.pci[ 1 ] = RtemsIntrReqSetAffinity_Pre_CPUSetSize_Askew; + ctx->Map.pci[ 1 ] < RtemsIntrReqSetAffinity_Pre_CPUSetSize_NA; + ++ctx->Map.pci[ 1 ] ) { for ( - ctx->Map.pcs[ 2 ] = RtemsIntrReqSetAffinity_Pre_CPUSet_Valid; - ctx->Map.pcs[ 2 ] < RtemsIntrReqSetAffinity_Pre_CPUSet_NA; - ++ctx->Map.pcs[ 2 ] + ctx->Map.pci[ 2 ] = RtemsIntrReqSetAffinity_Pre_CPUSetOnline_Valid; + ctx->Map.pci[ 2 ] < RtemsIntrReqSetAffinity_Pre_CPUSetOnline_NA; + ++ctx->Map.pci[ 2 ] ) { for ( - ctx->Map.pcs[ 3 ] = RtemsIntrReqSetAffinity_Pre_CanSetAffinity_Yes; - ctx->Map.pcs[ 3 ] < RtemsIntrReqSetAffinity_Pre_CanSetAffinity_NA; - ++ctx->Map.pcs[ 3 ] + ctx->Map.pci[ 3 ] = RtemsIntrReqSetAffinity_Pre_CPUSetHuge_NotZero; + ctx->Map.pci[ 3 ] < RtemsIntrReqSetAffinity_Pre_CPUSetHuge_NA; + ++ctx->Map.pci[ 3 ] ) { - ctx->Map.entry = RtemsIntrReqSetAffinity_PopEntry( ctx ); - RtemsIntrReqSetAffinity_Prepare( ctx ); - RtemsIntrReqSetAffinity_TestVariant( ctx ); + for ( + ctx->Map.pci[ 4 ] = RtemsIntrReqSetAffinity_Pre_CPUSet_Valid; + ctx->Map.pci[ 4 ] < RtemsIntrReqSetAffinity_Pre_CPUSet_NA; + ++ctx->Map.pci[ 4 ] + ) { + for ( + ctx->Map.pci[ 5 ] = RtemsIntrReqSetAffinity_Pre_CanSetAffinity_Yes; + ctx->Map.pci[ 5 ] < RtemsIntrReqSetAffinity_Pre_CanSetAffinity_NA; + ++ctx->Map.pci[ 5 ] + ) { + ctx->Map.entry = RtemsIntrReqSetAffinity_PopEntry( ctx ); + RtemsIntrReqSetAffinity_SetPreConditionStates( ctx ); + RtemsIntrReqSetAffinity_Prepare( ctx ); + RtemsIntrReqSetAffinity_TestVariant( ctx ); + } + } } } } |